/************** romani.lex ************** Riconoscitore di numeri romani. Alla fine di un numero il riconoscitore restituisce un token. In caso di errore viene restituito un token che contiene come valore -1. *****************************************************/ class Token { private int valore; private String sorgente; public Token(int v, String s) { valore = v; sorgente = s; } public String toString() { if (valore != -1) return "Numero Romano: " + sorgente + " - Numero intero: " + valore; else return "Errore: stringa " + sorgente; } } %% %class Scanner //nome della classe che verra' generata (default Yylex) %function nextToken //nome del metodo di scansione (default yylex) %type Token //tipo restituiro dal metodo (default Yytoken) %{ private int numeroIntero = 0; private String numeroRomano = ""; //questa porzione di codice viene riportata cosi' come e' scritta //nella classe generata //il campo numeroIntero serve per costruire il valore del numero letto //il campo numeroRomano per costruire la ricordare la stringa letta %} FineRiga = \r | \n | \r\n Spaziatura = [ \t\f] | {FineRiga} %state CINQUE, DECINE, UNITA, QUATTRO, NOVE %% I | II | III { numeroIntero = numeroIntero + yylength(); numeroRomano = numeroRomano + yytext(); yybegin(UNITA); } V { numeroIntero = numeroIntero + 5; numeroRomano = numeroRomano + "V"; yybegin(CINQUE); } X | XX | XXX { numeroIntero = numeroIntero + 10 * yylength(); numeroRomano = numeroRomano + yytext(); yybegin(DECINE); } IV { numeroIntero = numeroIntero + 4; numeroRomano = numeroRomano + "IV"; yybegin(QUATTRO); } IX { numeroIntero = numeroIntero + 9; numeroRomano = numeroRomano + "IX"; yybegin(NOVE); } {Spaziatura} { } {Spaziatura} { Token t = new Token(numeroIntero, numeroRomano); //reset dell'automa numeroIntero = 0; numeroRomano = ""; yybegin(YYINITIAL); return t; } . { Token t = new Token(-1, numeroRomano + yytext()); //reset dell'automa numeroIntero = 0; numeroRomano = ""; yybegin(YYINITIAL); return t; }