package grammar; import java.io.*; import java_cup.runtime.*; import text.*; %% %public %type Symbol %char %{ private int lineNumber = 1; public int lineNumber() { return lineNumber; } public Symbol token( int tokenType ) { Print.error().debugln( "Obtain token " + sym.terminal_name( tokenType ) + " \"" + yytext() + "\"" ); return new Symbol( tokenType, yychar, yychar + yytext().length(), yytext() ); } %} number = [0-9]+ octDigit = [0-7] hexDigit = [0-9a-fA-F] escchar = \\([ntbrfva\\\'\"\?]|{octDigit}+|[xX]{hexDigit}+) schar = [^\'\"\\\r\n]|{escchar} char = \'{schar}\' string = \"{schar}*\" ident = [A-Za-z][A-Za-z0-9]* space = [\ \t] newline = \r|\n|\r\n input = [^\r\n] %% {newline} { lineNumber++; } {space} { } program { return token( sym.PROGRAM ); } print { return token( sym.PRINT ); } println { return token( sym.PRINTLN ); } if { return token( sym.IF ); } then { return token( sym.THEN ); } else { return token( sym.ELSE ); } elif { return token( sym.ELIF ); } var { return token( sym.VAR ); } funct { return token( sym.FUNCT ); } new { return token( sym.NEW ); } begin { return token( sym.BEGIN ); } end { return token( sym.END ); } while { return token( sym.WHILE ); } do { return token( sym.DO ); } for { return token( sym.FOR ); } return { return token( sym.RETURN ); } size { return token( sym.SIZE ); } null { return token( sym.NULL ); } ord { return token( sym.ORD ); } chr { return token( sym.CHR ); } ";" { return token( sym.SEMICOLON ); } "," { return token( sym.COMMA ); } "=" { return token( sym.ASSIGN ); } or { return token( sym.OR ); } and { return token( sym.AND ); } not { return token( sym.NOT ); } "<" { return token( sym.LT ); } ">" { return token( sym.GT ); } "<=" { return token( sym.LE ); } ">=" { return token( sym.GE ); } "==" { return token( sym.EQ ); } "<>" { return token( sym.NE ); } "+" { return token( sym.PLUS ); } "-" { return token( sym.MINUS ); } "*" { return token( sym.TIMES ); } "/" { return token( sym.DIVIDE ); } "(" { return token( sym.LEFT ); } ")" { return token( sym.RIGHT ); } "[" { return token( sym.LEFTSQ ); } "]" { return token( sym.RIGHTSQ ); } "{" { return token( sym.LEFTCURLY ); } "}" { return token( sym.RIGHTCURLY ); } "." { return token( sym.DOT ); } {number} { return token( sym.INTVALUE ); } {char} { return token( sym.CHARVALUE ); } {string} { return token( sym.STRINGVALUE ); } {ident} { return token( sym.IDENT ); } "//"{input}* { } "/*"~"*/" { } . { return token( sym.error ); } <> { return token( sym.EOF ); }