HITNO PITANJE!!
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
--------------------------------------------------------------------------
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
--------------------------------------------------------------------------
- Follow-Ups:
- Re: HITNO PITANJE!!
- From: "Sinisa Rudan" <sinisa.rudan@gmail.com>
- Re: HITNO PITANJE!!
Previous by date: Primljeni domaci zadaci & odbrana
Next by date: Formalni parametri i lokalne promenljive metode!
Previous by thread: Primljeni domaci zadaci & odbrana Next by thread: Re: HITNO PITANJE!!
Previous by thread: Primljeni domaci zadaci & odbrana Next by thread: Re: HITNO PITANJE!!