/************ first.lex - versione 2 *********** Analizzatore lessicale per alcuni semplici token. Rispetto alla versione 1 sono state utilizzate le opzioni %class, %function e %type per modificare il noma classe generata (cioe' della classe i cui oggetti sono gli analizzatori lessicali), il nome del metodo di scansione e del tipo dei token. E' stato abilitato il conteggio delle righe e dei caratteri. E' inoltre stato inserito del codice per il conteggio del numero totale dei Token. *************************************************/ %% %unicode LETTERA = [:letter:] CIFRA = [:digit:] FINERIGA = \r | \n | \r\n SPAZIATURA = [ \t\f] | {FINERIGA} %class AnalizzatoreLessicale %function getProssimo %type Token %char %line %column %{ //codice copiato testualmente nella classe generata: //campo aggiuntivo della classe AnalizzatoreLessicale //destinato a contare i token restituiti private int nToken; %} %init{ //codice copiato testualmente nel costruttore: //messaggio iniziale System.out.println("Inizializzazione analizzatore lessicale"); //inizializzazione campo aggiuntivo (in questo caso inutile) nToken = 0; %init} %eof{ //codice eseguito quando viene raggiunta la fine del file System.out.println("Fine analisi lessicale"); System.out.println("Sono stati letti " + yychar + " caratteri in " + yyline + " righe"); System.out.println("Sono stati individuati " + nToken + " token"); %eof} %% {LETTERA}+ {nToken++; return new Token(TipoToken.PAROLA, yytext());} {CIFRA}+ {nToken++; return new Token(TipoToken.NUMERO, new Integer(yytext()));} "." {nToken++; return new Token(TipoToken.PUNTO);} "," {nToken++; return new Token(TipoToken.VIRGOLA);} ":" {nToken++; return new Token(TipoToken.DUE_PUNTI);} ";" {nToken++; return new Token(TipoToken.PUNTO_E_VIRGOLA);} "!" {nToken++; return new Token(TipoToken.PUNTO_ESCLAMATIVO);} "?" {nToken++; return new Token(TipoToken.PUNTO_INTERROGATIVO);} {SPAZIATURA} {} . {nToken++; return new Token(TipoToken.ALTRO, yytext());}