/***************** romani.lex - versione 1 *************** Riconoscitore di numeri romani Converte i numeri romani letti in notazione decimale *********************************************************/ class NumeriRomani { public static void main(String[] args) throws java.io.IOException { Yylex yy = new Yylex(System.in); yy.yylex(); } } class Yytoken {} %% %{ private int numeroIntero = 0; private String numeroRomano = ""; //questa porzione di codice viene riportata cosi' come e' scritta //nella classe generata (analizzatore lessicale) //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} { System.out.println("Numero romano letto " + numeroRomano); System.out.println("Numero intero corrispondente " + numeroIntero); //reset dell'automa numeroIntero = 0; numeroRomano = ""; yybegin(YYINITIAL); } . { System.out.println("\nCarattere inaspettato: " + yytext()); //reset dell'automa numeroIntero = 0; numeroRomano = ""; yybegin(YYINITIAL); }