%% %{ public int lineno; public Object attribute; public byte lex() throws ParseError { try { attribute = null; byte t = yylex(); lineno = yyline+1; return t; } catch (java.io.IOException exn) { throw new ParseError("I/O error: " + exn.getMessage(),yyline+1); } } %} %class Lexer %type byte %line %yylexthrow{ ParseError %yylexthrow} %eofval{ return Token.EOF; %eofval} digit=[0-9] letter=[A-Za-z] %% var { return Token.VAR; } set { return Token.SET; } ifzero { return Token.IFZERO; } then { return Token.THEN; } else { return Token.ELSE; } {letter}+ { attribute = yytext(); return Token.ID; } {digit}+ { attribute = Integer.valueOf(yytext()); return Token.NUM; } "=" { return Token.EQ; } "{" { return Token.LBRA; } "}" { return Token.RBRA; } "(" { return Token.LPAR; } ")" { return Token.RPAR; } "+" { return Token.PLUS; } "-" { return Token.MINUS; } ";" { return Token.SEMI; } [\n \t] {} . { throw new ParseError("Invalid character \'" + yytext() + "\'", yyline+1); }