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

Re: designator problem

by Rade Jakovljević
sreda, 07. jun 2006 - 16:04.

Hvala na brzom i opsirnom odgovoru.
Nisam bas kopirao Vasu tabelu simbola, tako da ne mogu da iskoristim bas
takve metode jer su kod mene malo drugacije. Problem sam (nadam se) resio
tako sto sam kreirao metodu findVariable u klasi Scope koja ispituje kind
simbola i ako je kind: VAR, FIELD, LVAR ili FPAR vraca taj simbol.

Pozdrav

2006/6/7, Jovan Popovic <jovan@etf.bg.ac.yu>:


Ako koristis funkcije tabele simbola koje sam postavio mozes da koristis
funkcije find(String name) i
find(String name, int, Object obj)

find("x") ce naci bilo koji simbol koji ima ime x a nije funkcija. Ovo se
postize tako sto se u find() kreira privremeni simbol prototype kome se
postavlja name="x" i obj==null i on se uporedjuje sa svim simbolima u
tabeli. Simbol tipa funkcija proverava da li je obj == null i ako JESTE
vraca rezultat false tako da poziv find("x") nikada ne moze da nadje
funkciju x. Simbol tipa promenljiva ili klasa proverava da li je obj ==
null i NIJE vraca false tako da poziv find("x") uvek vraca promenljive,
klase itd. U ovom slucaju ce naci promenljivu x.

Ako hoces da pronadjes funkciju x() pozovi ovo:

ArrayList parameterTypes = new ArrayList();
//Ubacivanje simbola koji predstavljaju tipove u listu
//u ovom slucaju lista ostaje prazna
find("x", Obj.Function, parametertypes);

ova funkcija postavlja polje obj prototipa na vrednost parametertypes tj.
praznu ArrayListu, tako da ce funkcija function::equals(Obj) vratiti true
a Variable::equals(Obj symbol) vratiti false. Na ovaj nacin mozes da
nadjes funkciju koja se zove "x" a nema parametre.

Pogledajte Junit testove klasa TestCaseMethods u jednoj od test funkcija
se kreira simbol funkcije bez parametara i onda se pomocu find(String
name, int, Object obj) nalazi taj simbol.


Pazite
find("x", Obj.Function, new ArrayList()); nalazi funkciju bez parametara

find("x", Obj.Function, null); ne nalayi tu funkciju zato sto se polje obj
postavlja na null i function::equals(Obj) vraca false.

Pozdrav,
Jovan

> Izvinjavam se zbog prethodne poruke (poslata je slucajno pre zavrsetka).
>
> Evo ovako izgleda jedan deo gramatike vezano za designator smenu:
>
> <designator>:=ID;
> <designator>:=<designator> TACKA ID;
> <designator>:=<designator> ( <act_pars> );
>
> Sto znaci, da u prvoj smeni ID moze da bude identifikator neke
> promenljive,
> polja klase ili naziv funkcije (metode).
> Javlja se sledeci problem, ako imamo ovakav pogram:
>
> ...
> struct A {
> var int a;
> }
> ...
> int x() {}
> ...
> var A x;
>
> ...
> begin
> x.a=2;
> end;
>
> Ovde je prvo deklarisana funkcija x, pa zatim promenljiva tipa A.
> Ako se metoda checkIdentificator(String name) implementira kao u
skripti,
> onda ce parser ovde da javi semanticku gresku, jer ce pronaci
> identifikator
> x koji je funkcija i koja nema u svom opsegu polje a, a ne ovaj koji je
> referenca tipa A.
>
> Da li postoji nacin da se algoritam modifikuje da radi kako treba ili
mora
> da se menja gramatika?
>
> Pozdrav, Rade
>



-----------------------------------------------------------------
unsubscribe:
minimalist@rti.etf.bg.ac.yu?subject=unsubscribe%20ri4pp
-----------------------------------------------------------------