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

Re: designator problem

by Jovan Popovic
sreda, 07. jun 2006 - 15:50.

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
>