CSC448: Lex/Parse: JFlex and CUP [25/27] Previous pageContentsNext page

Lexer and parser generators: lex, yacc, bison, JavaCC, ANTLR, CUP.

Strongly recommended: read the JFlex and CUP manuals. Several times.

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: 

Previous pageContentsNext page