Re: pitanje!!
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:
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/>
- Follow-Ups:
- Re: pitanje!!
- From: ivan dan <tekarh@yahoo.com>
- Re: pitanje!!
- References:
- pitanje!!
- From: ivan dan <tekarh@yahoo.com>
- pitanje!!
Previous by date: Re: pitanje!!
Next by date: Re: pitanje!!
Previous by thread: Re: pitanje!! Next by thread: Re: pitanje!!
Previous by thread: Re: pitanje!! Next by thread: Re: pitanje!!