00001: package clogs.parser; 00002: 00003: import java_cup.runtime.SymbolFactory; 00004: 00005: %% 00006: 00007: %class ClogsLexer 00008: %public 00009: %{ 00010: private SymbolFactory sf; 00011: public ClogsLexer (java.io.InputStream r, SymbolFactory sf) 00012: { 00013: this (r); 00014: this.sf = sf; 00015: } 00016: %} 00017: %eofval{ 00018: return sf.newSymbol ("EOF", sym.EOF); 00019: %eofval} 00020: 00021: %unicode 00022: 00023: %cup 00024: %cupdebug 00025: 00026: %char 00027: %column 00028: %line 00029: 00030: 00031: ALPHA=[A-Za-z_] 00032: DIGIT=[0-9] 00033: NONNEWLINE_WHITE_SPACE_CHAR=[\ \t\b\012] 00034: NEWLINE=\r|\n|\r\n 00035: WHITE_SPACE_CHAR=[\n\r\ \t\b\012] 00036: CHAR_TEXT=\\\"|[^\n\r\"] 00037: STRING_TEXT=(\\\"|[^\n\r\"]|\\{WHITE_SPACE_CHAR}+\\)* 00038: COMMENT_TEXT=([^*/\n]|[^*\n]"/"[^*\n]|[^/\n]"*"[^/\n]|"*"[^/\n]|"/"[^*\n])* 00039: IDENT={ALPHA}({ALPHA}|{DIGIT}|_)* 00040: 00041: %% 00042: 00043: <YYINITIAL> { 00044: "if" { return sf.newSymbol ("if", sym.IF); } 00045: "else" { return sf.newSymbol ("else", sym.ELSE); } 00046: "while" { return sf.newSymbol ("while", sym.WHILE); } 00047: "goto" { return sf.newSymbol ("goto", sym.GOTO); } 00048: "return" { return sf.newSymbol ("return", sym.RETURN); } 00049: "skip" { return sf.newSymbol ("return", sym.SKIP); } 00050: "new" { return sf.newSymbol ("new", sym.NEW); } 00051: "void" { return sf.newSymbol ("void", sym.VOID); } 00052: "int" { return sf.newSymbol ("int", sym.INT); } 00053: 00054: "[" { return sf.newSymbol ("LeftBrack", sym.LBRACK); } 00055: "]" { return sf.newSymbol ("RightBrack", sym.RBRACK); } 00056: "{" { return sf.newSymbol ("LeftBrace", sym.LBRACE); } 00057: "}" { return sf.newSymbol ("RightBrace", sym.RBRACE); } 00058: "(" { return sf.newSymbol ("LeftParen", sym.LPAREN); } 00059: ")" { return sf.newSymbol ("RightParen", sym.RPAREN); } 00060: "," { return sf.newSymbol ("Comma", sym.COMMA); } 00061: ";" { return sf.newSymbol ("Semicolon", sym.SEMI); } 00062: ":" { return sf.newSymbol ("Colon", sym.COLON); } 00063: "::" { return sf.newSymbol ("ColonColon", sym.COLONCOLON); } 00064: "=" { return sf.newSymbol ("Equals", sym.EQUALS); } 00065: "!" { return sf.newSymbol ("Bang", sym.BANG); } 00066: "==" { return sf.newSymbol ("EqualsEquals", sym.EQUALSEQUALS); } 00067: "!=" { return sf.newSymbol ("BangEquals", sym.BANGEQUALS); } 00068: "<" { return sf.newSymbol ("LessThan", sym.LESSTHAN); } 00069: ">" { return sf.newSymbol ("GreaterThan", sym.GREATERTHAN); } 00070: "<=" { return sf.newSymbol ("Leq", sym.LEQ); } 00071: ">=" { return sf.newSymbol ("Geq", sym.GEQ); } 00072: "|" { return sf.newSymbol ("Bar", sym.BAR); } 00073: "^" { return sf.newSymbol ("Caret", sym.CARET); } 00074: "&" { return sf.newSymbol ("Ampersand", sym.AMP); } 00075: "||" { return sf.newSymbol ("BarBar", sym.BARBAR); } 00076: "&&" { return sf.newSymbol ("AmpersandAmpersand", sym.AMPAMP); } 00077: "+" { return sf.newSymbol ("Plus", sym.PLUS); } 00078: "-" { return sf.newSymbol ("Minus", sym.MINUS); } 00079: "*" { return sf.newSymbol ("Times", sym.TIMES); } 00080: "/" { return sf.newSymbol ("Divide", sym.DIVIDE); } 00081: "%" { return sf.newSymbol ("Mod", sym.MOD); } 00082: 00083: {NONNEWLINE_WHITE_SPACE_CHAR}+ { } 00084: 00085: {IDENT} { 00086: return sf.newSymbol ("Identifier", sym.IDENTIFIER, yytext ()); 00087: } 00088: 00089: {DIGIT}+ { 00090: int i = Integer.parseInt (yytext ()); 00091: return sf.newSymbol ("IntegerConstant", sym.INTEGER_CONSTANT, new Integer (i)); 00092: } 00093: 00094: ' {CHAR_TEXT} ' { 00095: return sf.newSymbol ("CharacterConstant", sym.CHARACTER_CONSTANT, yytext ().charAt (1)); 00096: } 00097: 00098: \" {STRING_TEXT} \" { 00099: String str = yytext ().substring (1, yylength () - 1); 00100: return sf.newSymbol ("StringConstant", sym.STRING_CONSTANT, str); 00101: } 00102: } 00103: 00104: {NEWLINE} { } 00105: 00106: . { 00107: System.out.println ("Illegal character: <" + yytext () + ">"); 00108: Utility.error (Utility.E_UNMATCHED); 00109: } 00110: 00111: