CSC448: Scanning/Parsing: JFlex and CUP [19/22] |
Scanner and parser generators: lex, yacc, bison, JavaCC, ANTLR, CUP.
file:demo.flex [source]
00001: import java_cup.runtime.SymbolFactory; 00002: import java_cup.runtime.ComplexSymbolFactory; 00003: 00004: %% 00005: 00006: %class DemoLexer 00007: %public 00008: %{ 00009: private SymbolFactory sf = new ComplexSymbolFactory (); 00010: public DemoLexer (java.io.InputStream r, SymbolFactory sf) 00011: { 00012: this (r); 00013: this.sf = sf; 00014: } 00015: %} 00016: %eofval{ 00017: return sf.newSymbol ("EOF", sym.EOF); 00018: %eofval} 00019: 00020: %unicode 00021: 00022: %cup 00023: %cupdebug 00024: 00025: %char 00026: %column 00027: %line 00028: 00029: 00030: ALPHA=[A-Za-z_] 00031: DIGIT=[0-9] 00032: NONNEWLINE_WHITE_SPACE_CHAR=[\ \t\b\012] 00033: NEWLINE=\r|\n|\r\n 00034: IDENT={ALPHA}({ALPHA}|{DIGIT}|_)* 00035: 00036: %% 00037: 00038: <YYINITIAL> { 00039: "Dragon" 00040: { return sf.newSymbol ("Dragon", sym.DRAGON); } 00041: 00042: "Alice"|"Bob" 00043: { return sf.newSymbol ("AliceOrBob", sym.ALICEORBOB); } 00044: 00045: {DIGIT}{DIGIT}{DIGIT}{DIGIT}{DIGIT} 00046: { return sf.newSymbol ("FiveDigits", sym.FIVEDIGITS); } 00047: 00048: {DIGIT}{1,3} 00049: { return sf.newSymbol ("ShortDigits", sym.SHORTDIGITS); } 00050: 00051: {DIGIT}+ 00052: { return sf.newSymbol ("Digits", sym.DIGITS); } 00053: 00054: "http://" ({IDENT} ".")* {IDENT} 00055: { return sf.newSymbol ("SimpleURL", sym.SIMPLEURL); } 00056: 00057: {NONNEWLINE_WHITE_SPACE_CHAR}+ { } 00058: 00059: {IDENT} 00060: { return sf.newSymbol ("Identifier", sym.IDENTIFIER, yytext ()); } 00061: } 00062: 00063: {NEWLINE} { } 00064: 00065: . { System.out.println ("Illegal character: <" + yytext () + ">"); } 00066:
file:demo.cup [source]
00001: import java_cup.runtime.*; 00002: 00003: import java.util.ArrayList; 00004: import java.util.List; 00005: 00006: /* TO PRINT LIST OF TOKENS DURING READ, UNCOMMENT FOLLOWING LINE */ 00007: scan with {: return ((DemoLexer) getScanner ()).debug_next_token (); :}; 00008: 00009: terminal DRAGON, ALICEORBOB; 00010: terminal DIGITS, FIVEDIGITS, SHORTDIGITS; 00011: terminal SIMPLEURL; 00012: 00013: terminal String IDENTIFIER; 00014: 00015: non terminal start_non_terminal; 00016: non terminal one_non_terminal; 00017: 00018: 00019: start_non_terminal 00020: ::= one_non_terminal start_non_terminal 00021: | 00022: ; 00023: 00024: one_non_terminal 00025: ::= DRAGON 00026: | ALICEORBOB 00027: | DIGITS 00028: | FIVEDIGITS 00029: | SHORTDIGITS 00030: | SIMPLEURL 00031: | IDENTIFIER 00032: ; 00033:
file:Main.java [source] [doc-public] [doc-private]
00001: import java.io.FileInputStream; 00002: import java.util.List; 00003: import java.util.Map; 00004: 00005: import java_cup.runtime.*; 00006: 00007: 00008: public class Main 00009: { 00010: public static void main (String[] args) 00011: throws Exception 00012: { 00013: SymbolFactory sf = new ComplexSymbolFactory (); 00014: DemoLexer lexer; 00015: if (args.length == 0) { 00016: lexer = new DemoLexer (System.in, sf); 00017: } else { 00018: lexer = new DemoLexer (new java.io.FileInputStream (args[0]), sf); 00019: } 00020: DemoParser parser = new DemoParser (lexer, sf); 00021: 00022: Symbol symbol; 00023: symbol = parser.parse (); 00024: } 00025: } 00026: 00027: