Makefile100644 1040 1001 2440 6742256200 10714 0ustar everyone CC = cl LD = link DEBUG = -Zi # Compile try/except EXCEPT = -EHsc CFLAGS = $(EXCEPT) -DWIN32 -Tp OBJ = obj EXE = .exe INCLUDE = -I "e:\antlr\cpp" -I "d:\Program Files\Microsoft Visual Studio\Vc98\include" LD_DEBUG = /debug ANTLR_LIB = /defaultlib:"e:\antlr\cpp\antlr.lib" LINK_FLAGS = $(LD_DEBUG) $(ANTLR_LIB) FLAGS = $(INCLUDE) $(DEBUG) $(CFLAGS) # # To customize, fill in EXENAME, GRAMMAR, PARSER and LEXER # EXENAME = expr GRAMMAR = expr PARSER = MyExpr LEXER = MyExpr PARSE_OBJ = $(LEXER)Lexer.$(OBJ) $(PARSER)Parser.$(OBJ) main.$(OBJ) all: $(EXENAME)$(EXE) clean: rm -f $(PARSE_OBJ) $(EXENAME)$(EXE) $(PARSER)Parser.cpp $(PARSER)Parser.hpp $(LEXER)Lexer.cpp $(LEXER)Lexer.hpp $(LEXER)TokenTypes.hpp $(LEXER)TokenTypes.txt $(EXENAME)$(EXE): $(PARSE_OBJ) $(LD) $(LINK_FLAGS) /out:$@ $(PARSE_OBJ) $(LEXER)Lexer.cpp $(LEXER)Lexer.hpp $(PARSER)Parser.cpp $(PARSER)Parser.hpp: $(GRAMMAR).g jview antlr.Tool $(GRAMMAR).g $(LEXER)Lexer.$(OBJ): $(LEXER)Lexer.cpp $(LEXER)Lexer.hpp $(CC) -c $(FLAGS) $(LEXER)Lexer.cpp $(PARSER)Parser.$(OBJ): $(PARSER)Parser.cpp $(PARSER)Parser.hpp $(CC) -c $(FLAGS) $(PARSER)Parser.cpp main.$(OBJ): main.cpp $(PARSER)Parser.hpp $(LEXER)Lexer.hpp $(CC) -c $(FLAGS) main.cpp expr.g100644 1040 1001 3664 6742256637 10431 0ustar everyone // // An simple expression parser, to demonstrate // ANTLR's creation of "sibling" list trees. // by // Ian Kaplan // options { language="Cpp"; } class MyExprParser extends Parser; options { k = 2; exportVocab=MyExpr; buildAST = true; } exprlist : ( assignment_statement )* EOF! ; assignment_statement : assignment SEMICOLON! ; assignment : (IDENT ASSIGN )? expr ; primary_expr : IDENT | constant | (LPAREN! expr RPAREN! ) ; sign_expr : (MINUS)? primary_expr ; mul_expr : sign_expr (( TIMES | DIVIDE | MOD ) sign_expr)* ; expr : mul_expr (( PLUS | MINUS ) mul_expr)* ; constant : (ICON | CHCON) ; class MyExprLexer extends Lexer; options { k = 2; exportVocab=MyExpr; } WS_ : (' ' | '\t' | '\n' | '\r') { _ttype = Token::SKIP; } ; IDENT options { paraphrase = "identifier"; } : ('a'..'z' | 'A'..'Z' | '_' ) ( ('a'..'z' | 'A'..'Z' | '_') | ('0'..'9' ))* ; ICON options { paraphrase = "integer constant"; } : '0'..'9' ('0'..'9')* ; CHCON options { paraphrase = "character constant"; } : "'" '\0'..'\255' "'" ; COMMA options { paraphrase = ","; } : ',' ; SEMICOLON options { paraphrase = ";"; } : ';' ; LPAREN options { paraphrase = "("; } : '(' ; RPAREN options { paraphrase = ")"; } : ')' ; LCURL options { paraphrase = "{"; } : '{' ; RCURL options { paraphrase = "}"; } : '}' ; PLUS options { paraphrase = "+"; } : '+' ; MINUS options { paraphrase = "-"; } : '-' ; TIMES options { paraphrase = "*"; } : '*' ; DIVIDE options { paraphrase = "/"; } : '/' ; MOD options { paraphrase = "%"; } : '%' ; ASSIGN options { paraphrase = "="; } : '=' ; main.cpp100644 1040 1001 2212 6742256254 10712 0ustar everyone #include #include #include #include "MyExprLexer.hpp" #include "MyExprParser.hpp" void indent(int indent_level) { if (indent_level > 0) { const size_t BUFSIZE = 127; char buf[ BUFSIZE+1 ]; int i; for (i = 0; i < indent_level && i < BUFSIZE; i++) { buf[i] = ' '; } buf[i] = '\0'; printf("%s", buf ); } } // pr_indent void trav_tree( RefAST top, int ind ) { if (top != NULL) { std::string str; indent( ind ); str = top->getText(); std::cout << str << "\n"; if (top->getFirstChild() != NULL) { printf("kid: "); trav_tree( top->getFirstChild(), ind+2 ); } if (top->getNextSibling()) { printf("sib: "); trav_tree( top->getNextSibling(), ind ); } } } int main() { try { MyExprLexer lexer(std::cin); MyExprParser parser(lexer); parser.exprlist(); if (parser.getAST() != NULL) { printf("tree traverse:\n"); trav_tree( parser.getAST(), 0 ); } } catch(std::exception& e) { std::cerr << "exception: " << e.what() << std::endl; } return 0; } test_expr100644 1040 1001 46 6742256036 11163 0ustar everyone a = b + c * d; p = r * s + t * u;