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

Re: pitanje!!

by ivan dan
subota, 25. novembar 2006 - 12:26.

Istestirao sam fju scan () u dva slucaja.
Jedan put sam uveo deklarativu eofval drugi put nisam vec sam ostavio redefinisanu fju scan() iz primera da resi posao i sama napravi token za EOF. Takodje sam u cup fajl dopisao akciju za kraj parsiranja kada se obavi i poslednja smena ("Kraj parsiranja").
U fajl Sab.pr sam stavio posle poslednje zagrade } znak !.
Prvi slucaj(sa eofval):
Parser nakon sto je dobio token za zagradu i gurnuo ga na stek poziva metodu scan().U metodi scan dobija prvo token INVALID za koji se ispise Leksicka greska.Zatim dobije token EOF i izlazi iz metode scan,vrativsi parseru token EOF.Na ekranu ce se ispisati i Kraj Parsiranja.
Drugi slucaj:
Parser nakon sto je dobio token za zagradu i gurnuo ga na stek poziva metodu scan() U metodi scan() desava se sledece:
1.trazi se token od analizatora i dobija se token INVALID (zbog znaka !).
2.Ulazi se u while petlju u kojoj se ispise Leksicka greska jer je simbol.sym==sym.INVALID
3.Trazi se sledeci token i posto u analizatoru nemamo deklarativu eofval vraca se analizator vraca null a ne neki token!!! Ovo se sve desava u while petlji.
4.Ispituje se da li je simbol.sym==sym.INVALID jer je to uslov za nastavak while petlje i baca se runtime exception jer je simbol inicijalizovan sa null!!!
Parser ce naravno prekinuti rad i nece se ispisati poruka "Kraj parsiranja" vec poruka o bacenom null pointer exception-u.
Sve ovo nije mnogo bitno jer do greske dolazi samo ako pre kraja fajla imamo INVALID tokene a nismo stavili deklarativu eofval.Ali ja i dalje smatram da metoda nije dobro redefinisana jer kao sto kazete uveli smo dodatni kod da se obezbedimo ali sta je sa slucajem kada posle zagrade imamo znak uzvika.Tada fja scan() ocigledno puca.
Ivan.

Marko Bojovic <marko.bojovic@etf.bg.ac.yu> wrote:
Metoda jeste dobro redefinisana. U normalnim okolnostima token nikada ne moze biti null, tako da sa tog aspekta mi mozemo ukloniti sav visak koda koji se odnosi na te provere. Taj visak koda je stavljen za svaki slucaj. Ako dodje do neke nepredvidjene greske, npr. u radu leksera, i desi se da token nije inicijalizovan i da je null, taj kod obezbedjuje da prekinemo parsiranje tako sto cemo vestacki parseru proslediti simbol EOF, bez obzira da li je kraj fajla ili ne. Tacno je da u implementaciji domaceg nema realnih razloga da pretpostavimo da ce se tako nesto ikada desiti, ali nije lose da nas parser unapred zastitimo od nekih buducih promena koda zbog prosirenja funkcionalnosti, ili prelaska na novu verziju. Tada ova situacija moze biti realna, a mozda ce kod menjati neki drugi programer. Ovakvo resenje sa proverom objekta na null, iako se po logici stvari null ne moze desiti, se cesto srece. Dobra praksa je da se zastitimo i od onoga sto se ne ocekuje.

Pozdrav,
Bojovic Marko

ivan dan wrote: Fja scan() u klasi parser:

public java_cup.runtime.Symbol scan() throws java.lang.Exception {
Symbol simbol=getScanner().next_token();
if (simbol!=null) {
while (simbol.sym==sym.INVALID) {
System.out.println("LEKSICKA GRESKA: "+simbol.value+" !!!");
simbol=getScanner().next_token();
}
return (simbol!=null) ? simbol: new Symbol (EOF_sym());
} else return new Symbol(EOF_sym());
}
Ako sam dobro razumeo, parser u metodi parse() poziva metodu scan()kada zeli da mu analizator da novi token.Metodu scan() redefinisemo da parseru ne bi slali INVALID tokene,nego da stampamo da je doslo do leksicke greske.Cini mi se da metoda nije najbolje redefinisana.Prvo pitanje je zasto smo se pitali da li je neki simbol null kada smo u MJlexer.lex fajlu stavili direktivu
%eofval{
return new Symbol(sym.EOF);
%eofval}.
To znaci da kada analizator stigne do kraja fajla, poslace token EOF, pa nigde simbol nije mogao da bude null. Ako je odgovor na pitanje da mi nismo morali da stavimo tu direktivu u lex fajl ,pa bi onda analizator mogao da vrati null opet mi se cini da postoji greska. Ako je stigao INVALID token, a posle toga je kraj fajla mi ulazimo u while petlju u kojoj prvo stampamo "Leksicka Greska" onda trazimo od analizatora sledeci token i on nam vraca null.U uslovu za while pitamo se da li je simbol.sym==sym.INVALID a posto je simbol null baca se runtime exception!! Ceo kod ispod bloka while onda nema smisla.
Da li je uopste new Symbol(EOF_sym())drugi nacin da se parseru kaze da je doslo do kraja fajla koji se parsira ako vec ne pravimo new Symbol(sym.EOF)??
Izvinjavam se ako sam pogresio!!!


---------------------------------
Access over 1 million songs - Yahoo! Music Unlimited. -----------------------------------------------------------------
unsubscribe:
minimalist@rti.etf.bg.ac.yu?subject=unsubscribe%20ir4pp1
-----------------------------------------------------------------



---------------------------------
Check out the all-new Yahoo! Mail beta - Fire up a more powerful email and get things done faster.