/************ minimal.lex - versione 3 *********** Analizzatore lessicale per alcuni semplici token. Modifiche rispetto alla versione 2: - la classe contenente l'analizzatore lessicale generato si chiama AnalizzatoreLessicale - il metodo di scansione si chiama getProssimo - la classe che descrive i token si chiama Token - viene tenuta traccia della posizione di ciascun token all'interno del testo sorgente - al raggiungimento della fine del file, l'analizzatore lessicale comunica il numero totale di token letti. *************************************************/ enum TipoToken { //costanti per la rappresentazione dei token PAROLA, NUMERO, PUNTO, VIRGOLA, DUE_PUNTI, PUNTO_E_VIRGOLA, PUNTO_ESCLAMATIVO, PUNTO_INTERROGATIVO, ALTRO, FINE; } class Token { private TipoToken tipo; private String testo; private int riga, colonna; //costruttore public Token(TipoToken t, String s, int r, int c) { tipo = t; testo = s; riga = r; colonna = c; } public TipoToken getTipo() { return tipo; } public String getTesto() { return testo; } public String toString() { return tipo.toString() + " " + testo + " (riga " + riga + ", colonna " + colonna + ")"; } public int getRiga() { return riga; } public int getColonna() { return colonna; } } %% %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(), yyline, yycolumn); } {CIFRA}+ { nToken++; return new Token(TipoToken.NUMERO, yytext(), yyline, yycolumn); } "." { nToken++; return new Token(TipoToken.PUNTO, yytext(), yyline, yycolumn); } "," { nToken++; return new Token(TipoToken.VIRGOLA, yytext(), yyline, yycolumn); } ":" { nToken++; return new Token(TipoToken.DUE_PUNTI, yytext(), yyline, yycolumn); } ";" { nToken++; return new Token(TipoToken.PUNTO_E_VIRGOLA, yytext(), yyline, yycolumn); } "!" { nToken++; return new Token(TipoToken.PUNTO_ESCLAMATIVO, yytext(), yyline, yycolumn); } "?" { nToken++; return new Token(TipoToken.PUNTO_INTERROGATIVO, yytext(), yyline, yycolumn); } {SPAZIATURA} {} . { nToken++; return new Token(TipoToken.ALTRO, yytext(), yyline, yycolumn); }