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