• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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