package code.loop.parser; %% %char %public %type Token %yylexthrow{ ParseError %yylexthrow} %eofval{ return (new Token(0, yychar)); %eofval} WHITE_SPACE=([" "\t\b\r])+ DIGIT=[0-9] ALPHA=[a-zA-Z] STRING=([\x20\x21\x23-\x7E])* INT=({DIGIT})+ FLOAT=({DIGIT})+"."({DIGIT})+ PREFIX="$"?{ALPHA}({ALPHA}|{DIGIT}|['_])* INFIX = (["~!@#$%^&*+-=<>?./|\:"])+ PREFIXID = ({PREFIX}".")*{PREFIX} INFIXID = ({PREFIX}".")*{INFIX} %% if { return (new Token(Token.IF, yychar+1)); } then { return (new Token(Token.THEN, yychar+1)); } else { return (new Token(Token.ELSE, yychar+1)); } where { return (new Token(Token.WHERE, yychar+1)); } free { return (new Token(Token.FREE, yychar+1)); } "-" { return (new Token(Token.MINUS, yychar+1)); } ".." { return (new Token(Token.DOUBLEDOT, yychar+1)); } "," { return (new Token(Token.COMMA, yychar+1)); } "(" { return (new Token(Token.LPAREN, yychar+1)); } ")" { return (new Token(Token.RPAREN, yychar+1)); } "[" { return (new Token(Token.LSQBRA, yychar+1)); } "]" { return (new Token(Token.RSQBRA, yychar+1)); } "`" { return (new Token(Token.BACKQUOTE, yychar+1)); } {WHITE_SPACE} {} {INT} { try { if(Integer.parseInt(yytext()) < Integer.MAX_VALUE) return (new Token(Token.INTEGER, yychar+1, Integer.valueOf(yytext()))); } catch(Exception e) { throw new ParseError("Error at char "+(yychar+1)+": Integer value out of range!"); } } {FLOAT} { try { if(Float.parseFloat(yytext()) < Float.MAX_VALUE) return (new Token(Token.FLOAT, yychar+1, Float.valueOf(yytext()))); } catch(Exception e) { throw new ParseError("Error at char "+(yychar+1)+": Float value out of range!"); } } {PREFIXID} { try { if(yytext().length() < 255) return (new Token(Token.PREFIXID, yychar+1, yytext())); else { throw new ParseError("Error at char "+(yychar+1)+": Identifier length out oof range!"); } }catch(Exception e) { throw new ParseError("Exception error at char "+(yychar+1)); } } {INFIXID} { try { if(yytext().length() < 255) return (new Token(Token.INFIXID, yychar+1, yytext())); else { throw new ParseError("Error at char "+(yychar+1)+": Identifier length out oof range!"); } }catch(Exception e) { throw new ParseError("Exception error at char "+(yychar+1)); } } \"{STRING}\" { try { String str = yytext().substring(1,yytext().length() - 1); if(str.length() <= 255) return (new Token(Token.STRING, yychar+1, str)); else { throw new ParseError("Error at char "+(yychar+1)+": String length out of range!"); } }catch(Exception e) { throw new ParseError("Exception error at char "+(yychar+1)); } } \"{STRING} { throw new ParseError("Error at char "+(yychar+1)+": Unterminated string!"); } \'{ALPHA}\' { return (new Token(Token.CHAR, yychar+1, new Character(yytext().charAt(1)))); } \'{ALPHA} { throw new ParseError("Error at char "+(yychar+1)+": Unterminated character!"); } . { throw new ParseError("Error at char "+(yychar+1)+": Illegal input"); }