1header { 2#include "MyAST.h" 3} 4 5options { 6 language="Cpp"; 7} 8 9{ 10#include <iostream> 11} 12 13class LangParser extends Parser; 14 15options { 16 codeGenMakeSwitchThreshold = 3; 17 codeGenBitsetTestThreshold = 4; 18 ASTLabelType = "RefMyAST"; 19 buildAST = true; 20} 21 22block 23 : LCURLY^ ( statement )* RCURLY! 24 ; 25 26statement 27 : expr SEMI! 28 | "if"^ LPAREN! expr RPAREN! statement 29 ( "else"! statement )? 30 | "while"^ LPAREN! expr RPAREN! statement 31 |! b:block { #statement = b_AST; } 32 // do some manual tree returning 33 ; 34 35expr: assignExpr 36 ; 37 38assignExpr 39 : aexpr (ASSIGN^ assignExpr)? 40 ; 41 42aexpr 43 : mexpr (PLUS^ mexpr)* 44 ; 45 46mexpr 47 : atom (STAR^ atom)* 48 ; 49 50atom: ID 51 | INT 52 ; 53 54{ 55#include <iostream> 56 57void LangWalker::printAST( RefMyAST ast ) 58{ 59 ANTLR_USE_NAMESPACE(std)cout << "Found " << getTokenName(ast->getType()) 60 << " '" << ast->getText() 61 << "' at line " << ast->getLine() 62 << ANTLR_USE_NAMESPACE(std)endl; 63} 64 65} 66 67class LangWalker extends TreeParser; 68options { 69 ASTLabelType = "RefMyAST"; 70} 71{ 72 void printAST( RefMyAST ast ); 73} 74block 75 : #( LCURLY ( stat )+ ) 76 ; 77 78stat: #("if" expr stat (stat)?) 79 | #("while" expr stat) 80 | expr 81 | block 82 ; 83 84expr: #(asgn:ASSIGN expr expr) { printAST(asgn); } 85 | #(plus:PLUS expr expr) { printAST(plus); } 86 | #(star:STAR expr expr) { printAST(star); } 87 | a:ID { printAST(a); } 88 | b:INT { printAST(b); } 89 ; 90 91class LangLexer extends Lexer; 92 93WS_ : (' ' 94 | '\t' { tab(); } 95 | '\n' { newline(); } 96 | '\r') 97 { $setType(ANTLR_USE_NAMESPACE(antlr)Token::SKIP); } 98 ; 99 100LPAREN: '(' 101 ; 102 103RPAREN: ')' 104 ; 105 106LCURLY: '{' 107 ; 108 109RCURLY: '}' 110 ; 111 112STAR: '*' 113 ; 114 115PLUS: '+' 116 ; 117 118ASSIGN 119 : '=' 120 ; 121 122SEMI: ';' 123 ; 124 125COMMA 126 : ',' 127 ; 128 129protected 130ESC : '\\' 131 ( 'n' 132 | 'r' 133 | 't' 134 | 'b' 135 | 'f' 136 | '"' 137 | '\'' 138 | '\\' 139 | ('0'..'3') ( DIGIT (DIGIT)? )? 140 | ('4'..'7') (DIGIT)? 141 ) 142 ; 143 144protected 145DIGIT 146 : '0'..'9' 147 ; 148 149INT : (DIGIT)+ 150 ; 151 152ID 153options { 154 testLiterals = true; 155} 156 : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')* 157 ; 158