package code.loader.parser.txtParser; %% %public %line %type Token %state COMMENT %{ /** * Indentifier string can contain any character except new line. * Both backspace and double quote characters are escaped by * by a backslash. To unescape them, simply remove the backslash. * * Also, the argument is still surrounded by double quotes. * Simply remove them, by skipping the first and last character. */ private String clean(String in) { char [] buffer = new char[in.length()-2]; int count = 0; int i = 1; while (i < in.length()-1) { char current = in.charAt(i++); if (current == '\\') { // skip backslash, place the next character into the buffer current = in.charAt(i++); } buffer[count++] = current; } return String.copyValueOf(buffer, 0, count); } %} %yylexthrow{ ParseError %yylexthrow} %eofval{ return (new Token(0, yyline)); %eofval} WHITE_SPACE=([ \t\b\r])+ DIGIT=[0-9] ALPHA=[a-zA-Z] NEWLINE=[\n] INT=({DIGIT})+ FLOAT=({DIGIT})+\.({DIGIT})+ BACKSLASH=\\\\ QUOTE=\\\" IDENTIFIER=({BACKSLASH}|{QUOTE}|[^\n\\\"])+ UNQUAL_ID = \"{IDENTIFIER}\" %% COMMENT { yybegin(COMMENT); } . {} {NEWLINE}+ { yybegin(YYINITIAL); } {NEWLINE}+ {} NAME { return (new Token(Token.NAME, yyline+1)); } COMPILED { return (new Token(Token.COMPILED, yyline+1)); } true { return (new Token(Token.TRUE, yyline+1)); } false { return (new Token(Token.FALSE, yyline+1)); } TIME { return (new Token(Token.TIME, yyline+1)); } IMPORT { return (new Token(Token.IMPORT, yyline+1)); } TYPE { return (new Token(Token.TYPE, yyline+1)); } CONSTRUCTOR { return (new Token(Token.CONSTRUCTOR, yyline+1)); } OPERATION { return (new Token(Token.OPERATION, yyline+1)); } public { return (new Token(Token.PUBLIC, yyline+1)); } private { return (new Token(Token.PRIVATE, yyline+1)); } left { return (new Token(Token.LEFT, yyline+1)); } right { return (new Token(Token.RIGHT, yyline+1)); } nonassoc { return (new Token(Token.NONASSOC, yyline+1)); } Branch { return (new Token(Token.BRANCH, yyline+1)); } Choice { return (new Token(Token.CHOICE, yyline+1)); } Fail { return (new Token(Token.FAIL, yyline+1)); } Load { return (new Token(Token.LOAD, yyline+1)); } MakeRef { return (new Token(Token.MAKEREF, yyline+1)); } MakeAnon { return (new Token(Token.MAKEANON, yyline+1)); } MakeChar { return (new Token(Token.MAKECHAR, yyline+1)); } MakeInt { return (new Token(Token.MAKEINT, yyline+1)); } MakeFloat { return (new Token(Token.MAKEFLOAT, yyline+1)); } MakePartial { return (new Token(Token.MAKEPARTIAL, yyline+1)); } MakeTerm { return (new Token(Token.MAKETERM, yyline+1)); } MakeVar { return (new Token(Token.MAKEVAR, yyline+1)); } Narrow { return (new Token(Token.NARROW, yyline+1)); } Pop { return (new Token(Token.POP, yyline+1)); } Push { return (new Token(Token.PUSH, yyline+1)); } Replace { return (new Token(Token.REPLACE, yyline+1)); } Residuate { return (new Token(Token.RESIDUATE, yyline+1)); } StoreVar { return (new Token(Token.STOREVAR, yyline+1)); } "::" { return (new Token(Token.COLONCOLON, yyline+1)); } "->" { return (new Token(Token.ARROW, yyline+1)); } "(" { return (new Token(Token.LPAREN, yyline+1)); } ")" { return (new Token(Token.RPAREN, yyline+1)); } "{" { return (new Token(Token.LCUBRA, yyline+1)); } "}" { return (new Token(Token.RCUBRA, yyline+1)); } "," { return (new Token(Token.COMMA, yyline+1)); } "." { return (new Token(Token.DOT, yyline+1)); } {WHITE_SPACE} {} {INT} { double MAX = (Math.pow(2,31)-1); try { if(Integer.parseInt(yytext()) < MAX) return (new Token(Token.INTEGER, yyline+1, Integer.valueOf(yytext()))); } catch(Exception e) { throw new ParseError("Error at line "+(yyline+1)+ ": Integer value out of range!"); } } {FLOAT} { double MAX = (Math.pow(2,31)-1); try { if(Float.parseFloat(yytext()) < MAX) return (new Token(Token.FLOAT, yyline+1, Float.valueOf(yytext()))); } catch(Exception e) { throw new ParseError("Error at line "+(yyline+1)+ ": Float value out of range!"); } } {UNQUAL_ID} { try { if(yytext().length() < 255) { String cleaned = clean(yytext()); String tmp = yytext().substring(1,yytext().length()-1); // System.err.println("Token ---"+cleaned+"---"); return (new Token(Token.UNQUAL_ID, yyline+1, cleaned)); } else { throw new ParseError("Error at line "+(yyline+1)+ ": Identifier length out of range!"); } }catch(Exception e) { throw new ParseError("Exception error at line "+(yyline+1)); } } . { throw new ParseError("Error at line "+(yyline+1)+": Illegal input"); }