package MCC; %% %implements java_cup.runtime.Scanner %function next_token %type java_cup.runtime.Symbol %class Lexer %char %line %full %state COMMENT %state MLCOMMENT %eofval{ return tok(Sym.EOF, null); %eofval} %{ private java_cup.runtime.Symbol tok(int kind, Object value) { return new Symbol(kind, yychar, yychar + yylength(), value, yyline); } %} ALPHA=[A-Za-z_] DIGIT=[0-9] HEX_DIGIT=[0-9a-fA-F] WHITESPACE=[\ \t\b\r\f] CHAR=(\\\"|\\\'|\\\\|\\t|\\n|[\x20-\x21\x23-\x26\x28-\x5B\x5D-\x7E]) %% {WHITESPACE} {} \n { LineCount.addLineBreak(yychar+1); } "{" { return tok(Sym.OPENBRACE, yytext()); } "}" { return tok(Sym.CLOSEBRACE, yytext()); } "(" { return tok(Sym.OPENPAREN, yytext()); } ")" { return tok(Sym.CLOSEPAREN, yytext()); } "[" { return tok(Sym.OPENBRACKET, yytext()); } "]" { return tok(Sym.CLOSEBRACKET, yytext()); } "+" { return tok(Sym.ADD, yytext()); } "-" { return tok(Sym.SUB, yytext()); } "*" { return tok(Sym.MULT, yytext()); } "/" { return tok(Sym.DIV, yytext()); } "<" { return tok(Sym.LT, yytext()); } ">" { return tok(Sym.GT, yytext()); } "<=" { return tok(Sym.LE, yytext()); } ">=" { return tok(Sym.GE, yytext()); } "=" { return tok(Sym.EQ, yytext()); } "!=" { return tok(Sym.NE, yytext()); } "!" { return tok(Sym.NOT, yytext()); } forall { return tok(Sym.FORALL, yytext()); } in\? { return tok(Sym.INTEST, yytext()); } in { return tok(Sym.IN, yytext()); } "," { return tok(Sym.COMMA, yytext()); } sizeof { return tok(Sym.SIZEOF, yytext()); } ".~" { return tok(Sym.DOTINV, yytext()); } "." { return tok(Sym.DOT, yytext()); } "and" { return tok(Sym.AND, yytext()); } "or" { return tok(Sym.OR, yytext()); } literal { return tok(Sym.LITERAL, yytext()); } param { return tok(Sym.PARAM, yytext()); } "=>" { return tok(Sym.IMPLIES, yytext()); } true { return tok(Sym.TRUE, yytext()); } false { return tok(Sym.FALSE, yytext()); } isvalid { return tok(Sym.ISVALID, yytext()); } for { return tok(Sym.FOR, yytext()); } to { return tok(Sym.TO, yytext()); } structure { return tok(Sym.STRUCTURE, yytext()); } reserved { return tok(Sym.RESERVED, yytext()); } label { return tok(Sym.LABEL, yytext()); } int { return tok(Sym.INT, yytext()); } bit { return tok(Sym.BIT, yytext()); } byte { return tok(Sym.BYTE, yytext()); } subtype { return tok(Sym.SUBTYPE, yytext()); } subclass { return tok(Sym.SUBCLASS, yytext()); } of { return tok(Sym.OF, yytext()); } ";" { return tok(Sym.SEMICOLON, yytext()); } ":" { return tok(Sym.COLON, yytext()); } set { return tok(Sym.SET, yytext()); } "->" { return tok(Sym.ARROW, yytext()); } many { return tok(Sym.MANY, yytext()); } "|" { return tok(Sym.BAR, yytext()); } partition { return tok(Sym.PARTITION, yytext()); } element { return tok(Sym.ELEMENT, yytext()); } delay { return tok(Sym.DELAY, yytext()); } static { return tok(Sym.STATIC, yytext()); } cast { return tok(Sym.CAST, yytext()); } short { return tok(Sym.SHORT, yytext()); } null { return tok(Sym.NULL, yytext()); } NULL { return tok(Sym.NULL, yytext()); } crash { return tok(Sym.CRASH, yytext()); } {ALPHA}({ALPHA}|{DIGIT})* { return tok(Sym.ID, yytext()); } {DIGIT}+ { return tok(Sym.DECIMAL, yytext()); } \'{CHAR}\' { return tok(Sym.CHAR, yytext()); } \"{CHAR}*\" { return tok(Sym.STRING, yytext()); } . { System.err.println("Bad token at line " + (yyline + 1) + ": " + yytext()); return tok(Sym.BAD, yytext()); } "//" { yybegin(COMMENT); } \n { yybegin(YYINITIAL); LineCount.addLineBreak(yychar+1); } "/*" { yybegin(MLCOMMENT); } "*/" { yybegin(YYINITIAL); } \n { LineCount.addLineBreak(yychar+1); } . { } . { }