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