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:
|