Re: Saveti za domaci
Sto se tice metoda find i exist one rade ovako:
1. Kreira se instance klase Obj sa kojom ce se porediti simboli -prototip
2. Krieranoj instanci se postalvljaju vrednosti iz kriterijuma za pretragu
2.1 name u metodi Find(String name)
2.2 name i kind u metodi Find(String name, int kind)
2.3 name, kind i obj u metodi Find(String name, int kind, Object obj)
....
3. Kreirani objekat(prototip) se predaje metodi Find(Obj prototype) koja
poredi kreirani objekat sa ostalim objektima u opsegu.
Malo objasnjenje metode Function::equals(Obj)
Ona dobija kao argument simbol koji se poredi sa funkcijom(prototip).
Klasa simbol ima polje obj koje se koristi samo da bi se u njemu postavio
niz tipova parametara koji treba da se uporede sa parametrima funkcije.
Kada se trazi funkcija treba da se preda java.util.Collestion niz metodi
Find(String name, int kind, Object obj) u argumentu obj. Taj niz sadrzi
tipove formalnih parametara funkcije koja se trazi.
Pogledajte projekat TestPackage u kome se nalaye junit testovi kojima se
pozivaju metode tablele simbola - tu mozete videti kako se koriste pozivi
Na primer za klasu TestCaseMethods u funkciji testFunctionParameters()
se funkcija f(int,char,int) u tabeli simobla pretrazuje ovako:
String s2 = new String("f");
Struct t1 = Tab.intType, t2=Tab.charType, t3=Tab.intType;
ArrayList paramTypes = new ArrayList();
paramTypes.add(t1);
paramTypes.add(t2);
paramTypes.add(t3);
CheckSymbol(s2, ObjFactory.FUNCTION, paramTypes);
//<=> Tab.find(s2,ObjFactory.FUNCTION, paramTypes);
ovde su t1, t2 i t3 tri tipa koji se tipovi ubacuju u listu paramTypes i
onda se taj niz prosledjuje funkciji Tab::find(String name, int kind,
Object obj) u telu funkcije CheckSymbol().
Metoda Tab::find(String name, int kind, Object obj) kriera Obj instancu
-prototip kojoj postavlja predatu ArrayListu (paramTypes) u polje
prototype.obj. Metoda Function::equals(Obj prototype) uzima tu listu iz
polja prototype.obj i poredi je sa paretrima iz svog opsega.
Ovo sam uradio da u funkciji find ne bih na osnovu liste parametara koju
dobijam preko argumenta obj kreirao novi opseg vezao ga za simbol prototip
pa onda opredio opseg sa opsegom u funkciji Function::equals(). Na ovaj
nacin poredi se lista sa opsegom umesto da se lista konvertuje u opseg pa
se opseg poredi sa opsegom.
Vi mozete da izmenite taj algoritam za Function::equals() i da napisete
kod koji poredi Scope sa Scope-om ali u tom slucaju promenite i metodu
Tab::find(String name, int kind, Object obj) tako da vise ne kreira listu
i vezuje je za prototype.obj nego da kreira novi privremeni opseg, NE
STAVLJA GA NA STEK OPSEGA, i u taj opseg ubaci sve paramete iz liste koja
je predata i taj opseg zakaci za prototip koji ce se predati funkciji
Find(Obj prototype).
Ako trazite funkciju bez parametara morate da pozovete metodu
find("f", IObj.Function, new ArayList()) zato sto kod koji sam vam
postavio ocekuje da se prilikom pretrage funkcije bez parametara preda
PRAZNA lista. Ako pozovete funkciju sa find("f", null) ili find("f")
necete naci funkciju posto kada je obj null traze se samo promenljive a
ako obj nije null traze se funkcije bez paramtara. Na ovaj nacin se u
tabeli simbola razlikuju:
int f;//promenljiva
int f(){}//funkcija
zbog toga se u metodi Variable:equals() nalazi uslov (symbol.obj == null)
pri poredjenju simbola.
Ako koristite klase koje sam vam postavio pogledajte TestPackage projekta.
U njemu ne ma niceg sto mozete da iskoristite ali ima dosta junit testova
koji pokazuju kako treba pozivati tabelu simbola da bi se ubacivali i
pronalazili simobli simboli.
Pozdrav,
Jovan
> Saveti za one koji ne znaju kako da pocnu:
>
> 1. Procitate prvo Tabela Simbola Skripta.doc
> 2. U svom projektu Compiler dodate paket SymbolTablePackage
> 3. Otvorite CompilerFramework-SymbolTablePackage i pocnete da kopirate
> klasu po klasu
> 4. Preporucujem vam da ne kopirate citave fajlove od jednom vec deo po
> deo kako bi ste presli preko svakog dela i shvatili cemu on sluzi.
> 5. Ja sam isao ovim redom: IObj, (IStruct jos nisam primetio da mi
> treba), Obj, Struct, Scope, Variable, Array, Function, Class, Symbol
> Table i ObjFactory sam ostavio za kasnije
> 6. Dok prelazite preko fajla unosite sitne izmene po potrebi (mada
> skoro nista ne mora da se menja)
>
> 7. U Function.java sam primetio da u equals metodu gde funkcije porede
> svoje parametre, jedna funkcija uzima parametre iz lokalnog polja
> arguments tipa Scope a druga iz obj polja tipa Collection. Sa druge
> strane nigde nisam primetio da funkcija svoje parametre ubacuje u tu
> kolekciju vec samo u arguments pa sam zakljucio da je ovo greska.
> Treba promeniti da i druga funkcija uzima argumente iz svog polja
> arguments ili ukloniti arguments pa promeniti da funkcija svuda
> koristi obj kolekciju. Ja sam uzeo prvi pristup i poredjenje
> realizovao kao:
> return arguments.symbols.equals(func.arguments.symbols);
> Nisam jos ovo testirao ali prema dokumentaciji bi trebalo da radi.
arguments se puni u metodi Insert a obj se postavlja u metodi
Tab::find(String name, int kind, Object obj)
U funckiji equals se prilikom poredjenja poredi this.arguments i symbol.obj
Polje obj postoji samo u objektima koji se prosldjuju metodi equals u
ostalim normalnim simbolima obj je uvek null.
>
> 8. Sledeci korak je SemanticAnalyzer.java
>
> 9. Za dalje nisam siguran posto sam dovde stigao, ali cini mi se da je
> sledeci korak generator koda+ObjFactory pa posle toga Util klasa i rad
> sa yacc-om i flex-om
>
> --
> Best regards,
> Igor Stojkovic mailto: stojkovic.igor@gmail.com
>
>
1. Kreira se instance klase Obj sa kojom ce se porediti simboli -prototip
2. Krieranoj instanci se postalvljaju vrednosti iz kriterijuma za pretragu
2.1 name u metodi Find(String name)
2.2 name i kind u metodi Find(String name, int kind)
2.3 name, kind i obj u metodi Find(String name, int kind, Object obj)
....
3. Kreirani objekat(prototip) se predaje metodi Find(Obj prototype) koja
poredi kreirani objekat sa ostalim objektima u opsegu.
Malo objasnjenje metode Function::equals(Obj)
Ona dobija kao argument simbol koji se poredi sa funkcijom(prototip).
Klasa simbol ima polje obj koje se koristi samo da bi se u njemu postavio
niz tipova parametara koji treba da se uporede sa parametrima funkcije.
Kada se trazi funkcija treba da se preda java.util.Collestion niz metodi
Find(String name, int kind, Object obj) u argumentu obj. Taj niz sadrzi
tipove formalnih parametara funkcije koja se trazi.
Pogledajte projekat TestPackage u kome se nalaye junit testovi kojima se
pozivaju metode tablele simbola - tu mozete videti kako se koriste pozivi
Na primer za klasu TestCaseMethods u funkciji testFunctionParameters()
se funkcija f(int,char,int) u tabeli simobla pretrazuje ovako:
String s2 = new String("f");
Struct t1 = Tab.intType, t2=Tab.charType, t3=Tab.intType;
ArrayList paramTypes = new ArrayList();
paramTypes.add(t1);
paramTypes.add(t2);
paramTypes.add(t3);
CheckSymbol(s2, ObjFactory.FUNCTION, paramTypes);
//<=> Tab.find(s2,ObjFactory.FUNCTION, paramTypes);
ovde su t1, t2 i t3 tri tipa koji se tipovi ubacuju u listu paramTypes i
onda se taj niz prosledjuje funkciji Tab::find(String name, int kind,
Object obj) u telu funkcije CheckSymbol().
Metoda Tab::find(String name, int kind, Object obj) kriera Obj instancu
-prototip kojoj postavlja predatu ArrayListu (paramTypes) u polje
prototype.obj. Metoda Function::equals(Obj prototype) uzima tu listu iz
polja prototype.obj i poredi je sa paretrima iz svog opsega.
Ovo sam uradio da u funkciji find ne bih na osnovu liste parametara koju
dobijam preko argumenta obj kreirao novi opseg vezao ga za simbol prototip
pa onda opredio opseg sa opsegom u funkciji Function::equals(). Na ovaj
nacin poredi se lista sa opsegom umesto da se lista konvertuje u opseg pa
se opseg poredi sa opsegom.
Vi mozete da izmenite taj algoritam za Function::equals() i da napisete
kod koji poredi Scope sa Scope-om ali u tom slucaju promenite i metodu
Tab::find(String name, int kind, Object obj) tako da vise ne kreira listu
i vezuje je za prototype.obj nego da kreira novi privremeni opseg, NE
STAVLJA GA NA STEK OPSEGA, i u taj opseg ubaci sve paramete iz liste koja
je predata i taj opseg zakaci za prototip koji ce se predati funkciji
Find(Obj prototype).
Ako trazite funkciju bez parametara morate da pozovete metodu
find("f", IObj.Function, new ArayList()) zato sto kod koji sam vam
postavio ocekuje da se prilikom pretrage funkcije bez parametara preda
PRAZNA lista. Ako pozovete funkciju sa find("f", null) ili find("f")
necete naci funkciju posto kada je obj null traze se samo promenljive a
ako obj nije null traze se funkcije bez paramtara. Na ovaj nacin se u
tabeli simbola razlikuju:
int f;//promenljiva
int f(){}//funkcija
zbog toga se u metodi Variable:equals() nalazi uslov (symbol.obj == null)
pri poredjenju simbola.
Ako koristite klase koje sam vam postavio pogledajte TestPackage projekta.
U njemu ne ma niceg sto mozete da iskoristite ali ima dosta junit testova
koji pokazuju kako treba pozivati tabelu simbola da bi se ubacivali i
pronalazili simobli simboli.
Pozdrav,
Jovan
> Saveti za one koji ne znaju kako da pocnu:
>
> 1. Procitate prvo Tabela Simbola Skripta.doc
> 2. U svom projektu Compiler dodate paket SymbolTablePackage
> 3. Otvorite CompilerFramework-SymbolTablePackage i pocnete da kopirate
> klasu po klasu
> 4. Preporucujem vam da ne kopirate citave fajlove od jednom vec deo po
> deo kako bi ste presli preko svakog dela i shvatili cemu on sluzi.
> 5. Ja sam isao ovim redom: IObj, (IStruct jos nisam primetio da mi
> treba), Obj, Struct, Scope, Variable, Array, Function, Class, Symbol
> Table i ObjFactory sam ostavio za kasnije
> 6. Dok prelazite preko fajla unosite sitne izmene po potrebi (mada
> skoro nista ne mora da se menja)
>
> 7. U Function.java sam primetio da u equals metodu gde funkcije porede
> svoje parametre, jedna funkcija uzima parametre iz lokalnog polja
> arguments tipa Scope a druga iz obj polja tipa Collection. Sa druge
> strane nigde nisam primetio da funkcija svoje parametre ubacuje u tu
> kolekciju vec samo u arguments pa sam zakljucio da je ovo greska.
> Treba promeniti da i druga funkcija uzima argumente iz svog polja
> arguments ili ukloniti arguments pa promeniti da funkcija svuda
> koristi obj kolekciju. Ja sam uzeo prvi pristup i poredjenje
> realizovao kao:
> return arguments.symbols.equals(func.arguments.symbols);
> Nisam jos ovo testirao ali prema dokumentaciji bi trebalo da radi.
arguments se puni u metodi Insert a obj se postavlja u metodi
Tab::find(String name, int kind, Object obj)
U funckiji equals se prilikom poredjenja poredi this.arguments i symbol.obj
Polje obj postoji samo u objektima koji se prosldjuju metodi equals u
ostalim normalnim simbolima obj je uvek null.
>
> 8. Sledeci korak je SemanticAnalyzer.java
>
> 9. Za dalje nisam siguran posto sam dovde stigao, ali cini mi se da je
> sledeci korak generator koda+ObjFactory pa posle toga Util klasa i rad
> sa yacc-om i flex-om
>
> --
> Best regards,
> Igor Stojkovic mailto: stojkovic.igor@gmail.com
>
>
- Follow-Ups:
- Kako doci do tipa promenljive?
- From: Nenad Tesovic <tesovicn@gmail.com>
- Kako doci do tipa promenljive?
- References:
- Saveti za domaci
- From: "Igor Stojkovic" <stojkovic.igor@gmail.com>
- Saveti za domaci
Previous by date: Re: Saveti za domaci
Next by date: RE: Saveti za domaci
Previous by thread: Re: Saveti za domaci Next by thread: Kako doci do tipa promenljive?
Previous by thread: Re: Saveti za domaci Next by thread: Kako doci do tipa promenljive?