1grammar t047treeparser; 2options { 3 language=Cpp; 4 output=AST; 5} 6 7tokens { 8 VAR_DEF; 9 ARG_DEF; 10 FUNC_HDR; 11 FUNC_DECL; 12 FUNC_DEF; 13 BLOCK; 14} 15 16@lexer::includes 17{ 18#include "UserTestTraits.hpp" 19} 20@lexer::namespace 21{ Antlr3Test } 22 23@parser::includes { 24#include "UserTestTraits.hpp" 25} 26@parser::namespace 27{ Antlr3Test } 28 29program 30 : declaration+ 31 ; 32 33declaration 34 : variable 35 | functionHeader ';' -> ^(FUNC_DECL functionHeader) 36 | functionHeader block -> ^(FUNC_DEF functionHeader block) 37 ; 38 39variable 40 : type declarator ';' -> ^(VAR_DEF type declarator) 41 ; 42 43declarator 44 : ID 45 ; 46 47functionHeader 48 : type ID '(' ( formalParameter ( ',' formalParameter )* )? ')' 49 -> ^(FUNC_HDR type ID formalParameter+) 50 ; 51 52formalParameter 53 : type declarator -> ^(ARG_DEF type declarator) 54 ; 55 56type 57 : 'int' 58 | 'char' 59 | 'void' 60 | ID 61 ; 62 63block 64 : lc='{' 65 variable* 66 stat* 67 '}' 68 -> ^(BLOCK[$lc,"BLOCK"] variable* stat*) 69 ; 70 71stat: forStat 72 | expr ';'! 73 | block 74 | assignStat ';'! 75 | ';'! 76 ; 77 78forStat 79 : 'for' '(' start=assignStat ';' expr ';' next=assignStat ')' block 80 -> ^('for' $start expr $next block) 81 ; 82 83assignStat 84 : ID EQ expr -> ^(EQ ID expr) 85 ; 86 87expr: condExpr 88 ; 89 90condExpr 91 : aexpr ( ('=='^ | '<'^) aexpr )? 92 ; 93 94aexpr 95 : atom ( '+'^ atom )* 96 ; 97 98atom 99 : ID 100 | INT 101 | '(' expr ')' -> expr 102 ; 103 104FOR : 'for' ; 105INT_TYPE : 'int' ; 106CHAR: 'char'; 107VOID: 'void'; 108 109ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* 110 ; 111 112INT : ('0'..'9')+ 113 ; 114 115EQ : '=' ; 116EQEQ : '==' ; 117LT : '<' ; 118PLUS : '+' ; 119 120WS : ( ' ' 121 | '\t' 122 | '\r' 123 | '\n' 124 )+ 125 { $channel=HIDDEN } 126 ; 127