«« ( Date ) »» // «« ( Thread ) »» // ri4pp - 2007

HITNO PITANJE!!

by Sinisa Rudan
sreda, 13. jun 2007 - 15:23.

Kada definisemo glavnu klasu (Program), onda zelimo da neke stvari odradimo
cim se naidje na pocetak definicije, a neke nakon sto se zavrsi cela
definicija, tj. ceo program.
To funkcionise kako treba, ali ne znam zasto nece na isti nacin da radi i
kod definicije unutrasnjih klasa??

Kod glavnog programa smo zavrsne akcije obavljali ovako (tj. stavljali smo
ih uz svaku opciju:
Program ::= CLASS ProgId:ProgObj DeclarationList LBRACE
MethodDeclarationList RBRACE
{:
ProgObj.locals=Tab.topScope.locals;
Tab.closeScope();
:}
| CLASS ProgId:ProgObj LBRACE MethodDeclarationList RBRACE
{:
ProgObj.locals=Tab.topScope.locals;
Tab.closeScope();
:}
itd......
a akciju koju smo zeleli da se obavi na pocetku definicije, smo ovako:
ProgId ::= IDENT: id
{:
//trace("Started with class");
Obj obj = Tab.insert(Obj.Prog, id, Tab.noType);
Tab.openScope();
RESULT = obj;
:};
dakle, prvo se razresi ProgId pa onda cela produkcija u kojoj se ovaj
neterminal nalazi.

Ali kada uradim to isto kod deklaracije unutrasnje klase:
ClassDecl ::= CLASS ClassName LBRACE LocalFieldList RBRACE
{:
System.out.println("Setting classDeclared = null");
:}
|
| CLASS ClassName LBRACE RBRACE
{:
classDeclared = null;
:}
| error RBRACE {: System.out.println("***** Error in declaration of
internal class"); :};
Dakle ovo zelim da se obavi nakon zavrsetka deklaracije klase tj. nakon
njene zatvorene } zagrade.
Svakako zelim nakon sto sam sva njena polja ubacio u tabelu simbola.

A sledecu akciju sam zeleo da se obavi na pocetku, cim se pronadje
deklaracija unutrasnje klase, pre nego se pocnu obradjivati njena polja.
ClassName ::= IDENT:id
{: System.out.println("Internal class '"+id +"' declared");
Struct t = new Struct(Struct.Class);
classDeclared = Tab.insert(Obj.Type, id, t);
System.out.println("Setting classDeclared =
"+classDeclared);
RESULT = id;
:};
Medjutim, obe akcije se izvrse pre nego se razrese LocalFieldList!!!
Kako moze da se prepozna cela klasa pre nego su se razresila njena polja?

Zbog cega kod glavnog programa radi, a ovde ne?
Da li redosled definicije (ne)terminala utice ili redosled produkcija?
Mada ne verujem,
a pored toga sam i pokusao sa raznim izmenama redosleda svega i svacega!

-----------------------------------
(inace, imam:
LocalFieldList ::= LocalFieldList VarDecl SEMICOLON | VarDecl SEMICOLON;
VarDecl ::= Type:t {: TypeForVarList = t; :} VarList;

VarList ::= VarList COMMA VarPart | VarPart;

VarPart ::= IDENT:id
{:
System.out.println("id="+id+".
classDeclared="+classDeclared);
if(classDeclared == null)
{
Tab.insert(Obj.Var,id,TypeForVarList);
}
else
{
classDeclared.type.insertField(Obj.Var
,id,TypeForVarList);
}
:}
| IDENT:id LBRACKET RBRACKET;
DeclarationList ::= DeclarationList DeclarationPart | DeclarationPart;

DeclarationPart ::= ConstDecl SEMICOLON | VarDecl SEMICOLON | ClassDecl;

-----------------------------


Jos jedno pitanje,
vezano za asistentov poslednji odgovor oko level:
Da li je za polja klase postavljamo uvek da im je level=0 ili uvek da je
level=1 ili ...?


Hvala unpared
dobroj dusi :)

Hitno je!
--
Sinisa Rudan
--------------------------------------------------------------------------
Associate editor of multimedia part of InfoM Journal,
Journal of Information technology and multimedia systems.
http://www.infoM.org.yu

MAGIC WAND solutions * Studio
founder and owner
http://www.MagicWandSolutions.com
http://galeb.etf.bg.ac.yu/~sir
--------------------------------------------------------------------------