package IC.Lexer; import IC.Error.*; %% %line %char %state LINE_COMMENT, FULL_COMMENT %notunix %class Lexer %public %cup ALPHA=[A-Za-z] DIGIT=[0-9] NONNEWLINE_WHITE_SPACE_CHAR=[\ \t\b\012] WHITE_SPACE_CHAR=[\n\ \t\b\012] STRING_TEXT=(\\n|\\t|\\\\|\\\"|[^\n\"\\])* FULL_COMMENT_TEXT=(/"*"([^"*"]*"*"+[^"*"/])*[^"*"]*"*"+/) LINE_COMMENT_TEXT=(//[^\n]*) BACKSLASH = (\\); COMMENT_END = (\*/); %% "," { return (new Token(IC.Lexer.sym.COMMA,new Object(),yytext(),yyline,yychar,yychar+1)); } ";" { return (new Token(IC.Lexer.sym.SEMICOLON,new Object(), yytext(),yyline,yychar,yychar+1)); } "(" { return (new Token(IC.Lexer.sym.LPAREN,new Object(), yytext(),yyline,yychar,yychar+1)); } ")" { return (new Token(IC.Lexer.sym.RPAREN,new Object(), yytext(),yyline,yychar,yychar+1)); } "[" { return (new Token(IC.Lexer.sym.LBRACKET,new Object(), yytext(),yyline,yychar,yychar+1)); } "]" { return (new Token(IC.Lexer.sym.RBRACKET,new Object(), yytext(),yyline,yychar,yychar+1)); } "{" { return (new Token(IC.Lexer.sym.LBRACE,new Object(), yytext(),yyline,yychar,yychar+1)); } "}" { return (new Token(IC.Lexer.sym.RBRACE,new Object(), yytext(),yyline,yychar,yychar+1)); } "." { return (new Token(IC.Lexer.sym.PERIOD,new Object(), yytext(),yyline,yychar,yychar+1)); } "+" { return (new Token(IC.Lexer.sym.PLUS,new Object(), yytext(),yyline,yychar,yychar+1)); } "-" { return (new Token(IC.Lexer.sym.MINUS,new Object(), yytext(),yyline,yychar,yychar+1)); } "*" { return (new Token(IC.Lexer.sym.STAR,new Object(), yytext(),yyline,yychar,yychar+1)); } "/" { return (new Token(IC.Lexer.sym.FORWARDSLASH,new Object(), yytext(),yyline,yychar,yychar+1)); } "=" { return (new Token(IC.Lexer.sym.ASSIGN,new Object(), yytext(),yyline,yychar,yychar+1)); } "<" { return (new Token(IC.Lexer.sym.LESS,new Object(), yytext(),yyline,yychar,yychar+1)); } "<=" { return (new Token(IC.Lexer.sym.LESSEQUAL,new Object(), yytext(),yyline,yychar,yychar+2)); } ">" { return (new Token(IC.Lexer.sym.GREATER,new Object(), yytext(),yyline,yychar,yychar+1)); } ">=" { return (new Token(IC.Lexer.sym.GREATEREQUAL,new Object(), yytext(),yyline,yychar,yychar+2)); } "&&" { return (new Token(IC.Lexer.sym.AND,new Object(), yytext(),yyline,yychar,yychar+2)); } "||" { return (new Token(IC.Lexer.sym.OR,new Object(), yytext(),yyline,yychar,yychar+2)); } "==" { return (new Token(IC.Lexer.sym.EQUAL,new Object(), yytext(),yyline,yychar,yychar+2)); } "%" { return (new Token(IC.Lexer.sym.PERCENT,new Object(), yytext(),yyline,yychar,yychar+1)); } "!=" { return (new Token(IC.Lexer.sym.NOTEQUAL,new Object(), yytext(),yyline,yychar,yychar+2)); } "!" { return (new Token(IC.Lexer.sym.BANG,new Object(), yytext(),yyline,yychar,yychar+1)); } "\\\"" { return (new Token(IC.Lexer.sym.QUOTEESCAPE,new Object(), yytext(),yyline,yychar,yychar+2)); } {BACKSLASH}{BACKSLASH} { return (new Token(IC.Lexer.sym.BACKSLASHESCAPE,new Object(), yytext(),yyline,yychar,yychar+2)); } "class" { return (new Token(IC.Lexer.sym.CLASS,new Object(), yytext(),yyline,yychar,yychar +yytext().length() )); } "return" { return (new Token(IC.Lexer.sym.RETURN,new Object(), yytext(),yyline,yychar,yychar +yytext().length() )); } "this" { return (new Token(IC.Lexer.sym.THIS,new Object(), yytext(),yyline,yychar,yychar +yytext().length() )); } "extends" { return (new Token(IC.Lexer.sym.EXTENDS,new Object(), yytext(),yyline,yychar,yychar +yytext().length() )); } "if" { return (new Token(IC.Lexer.sym.IF,new Object(), yytext(),yyline,yychar,yychar +yytext().length() )); } "new" { return (new Token(IC.Lexer.sym.NEW,new Object(), yytext(),yyline,yychar,yychar +yytext().length() )); } "void" { return (new Token(IC.Lexer.sym.VOID,new Object(), yytext(),yyline,yychar,yychar +yytext().length() )); } "length" { return (new Token(IC.Lexer.sym.LENGTH,new Object(), yytext(),yyline,yychar,yychar +yytext().length() )); } "else" { return (new Token(IC.Lexer.sym.ELSE,new Object(), yytext(),yyline,yychar,yychar +yytext().length() )); } "int" { return (new Token(IC.Lexer.sym.INT,new Object(), yytext(),yyline,yychar,yychar +yytext().length() )); } "while" { return (new Token(IC.Lexer.sym.WHILE,new Object(), yytext(),yyline,yychar,yychar +yytext().length() )); } "true" { return (new Token(IC.Lexer.sym.TRUE,new Object(), yytext(),yyline,yychar,yychar +yytext().length() )); } "boolean" { return (new Token(IC.Lexer.sym.BOOLEAN,new Object(), yytext(),yyline,yychar,yychar +yytext().length() )); } "break" { return (new Token(IC.Lexer.sym.BREAK,new Object(), yytext(),yyline,yychar,yychar +yytext().length() )); } "false" { return (new Token(IC.Lexer.sym.FALSE,new Object(), yytext(),yyline,yychar,yychar +yytext().length() )); } "string" { return (new Token(IC.Lexer.sym.STRING,new Object(), yytext(),yyline,yychar,yychar +yytext().length() )); } "continue" { return (new Token(IC.Lexer.sym.CONTINUE,new Object(), yytext(),yyline,yychar,yychar +yytext().length() )); } "null" { return (new Token(IC.Lexer.sym.NULL,new Object(), yytext(),yyline,yychar,yychar +yytext().length() )); } {WHITE_SPACE_CHAR}+ { } \r {} {FULL_COMMENT_TEXT} { } {LINE_COMMENT_TEXT} { } (0[0-9]+) { return (new Token(IC.Lexer.sym.ERROR,new Object(), yytext(),yyline,yychar,yychar +yytext().length() )); } ([0-9]+{ALPHA}+[0-9]*{ALPHA}*) {return (new Token(IC.Lexer.sym.ERROR,new Object(), yytext(),yyline,yychar,yychar +yytext().length() )); } (/"*"([^"*"]*"*"+[^"*"/])*[^"*"]*[^(\*/)]) {return (new Token(IC.Lexer.sym.ERROR,new Object(), yytext(),yyline,yychar,yychar +yytext().length() )); } {ALPHA}({ALPHA}|{DIGIT}|_)* {return (new Token(IC.Lexer.sym.IDENTIFIER,new String(yytext()), yytext(),yyline,yychar,yychar +yytext().length() ));} ((0|([1-9]{DIGIT}*))) {try{ long a = 2147483647; if((Long.parseLong(yytext())<= a)||(yytext().equals("2147483648"))) return (new Token(IC.Lexer.sym.NUMBER,new Long(yytext()),yytext(),yyline,yychar,yychar +yytext().length() )); else throw new IC.Error.LexicalError(new Token(IC.Lexer.sym.ERROR,new Object(), ("Int value is too large: " + yytext()),yyline,yychar,yychar +yytext().length() )); } catch (IC.Error.LexicalError e2) { e2.print(); System.exit(0); } } \"{STRING_TEXT}\" { String str = yytext().substring(1,yytext().length() - 1); Utility.assert(str.length() == yytext().length() - 2); return (new Token(IC.Lexer.sym.TEXT,new String(yytext()),str,yyline,yychar,yychar + str.length())); } . { return (new Token(IC.Lexer.sym.ERROR,new Object(), yytext(),yyline,yychar,yychar +yytext().length())); }