Re: designator problem
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
>
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
>
- Follow-Ups:
- Re: designator problem
- From: "Rade Jakovljević" <radegm@gmail.com>
- Re: designator problem
- References:
- designator problem
- From: "Rade Jakovljević" <radegm@gmail.com>
- designator problem
- From: "Rade Jakovljević" <radegm@gmail.com>
- designator problem
Previous by date: designator problem
Next by date: Re: designator problem
Previous by thread: designator problem Next by thread: Re: designator problem
Previous by thread: designator problem Next by thread: Re: designator problem