/*********************** first.lex - versione 1 (2015) ********************** Analizzatore lessicale per alcuni semplici token. Rispetto alla versione 0: - il codice utente (esempio classe per i token e main) non e' fornito in questo file - si utilizza una classe Token, definita separatamente, per rappresentare i token - le istruzioni di codice associate alle regole lessicali sono state modificate per utilizzare quanto fornito dalla classe Token Inoltre: - si utilizzano alcune opzioni come %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 Scanner %function getNext %type Token %char %line %column %{ //Codice copiato testualmente nella classe generata. //Contiene un campo e metodi aggiuntivi private int nToken; // campo per il conteggio token //metodi per restituire il numero di caratteri, righe e token public int nCaratteri() { return yychar; } public int nRighe() { return yyline; } public int nToken() { return nToken; } %} %init{ //codice copiato testualmente nel costruttore: //messaggio iniziale System.out.println("Inizio analisi lessicale"); //inizializzazione campo aggiuntivo (in questo caso inutile perché' a 0) nToken = 0; %init} %eof{ //codice eseguito quando viene raggiunta la fine del file System.out.println("Fine analisi lessicale"); %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());} <> {nToken++; return new Token(TipoToken.EOF);}