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

Re: pitanje!!

by Marko Bojovic
subota, 25. novembar 2006 - 00:52.

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. <http://pa.yahoo.com/*http://us.rd.yahoo.com/evt=36035/*http://music.yahoo.com/unlimited/>