1grammar t017parser;
2
3options {
4    language =Cpp;
5}
6
7@lexer::includes
8{
9#include "UserTestTraits.hpp"
10}
11@lexer::namespace
12{ Antlr3Test }
13
14@parser::includes {
15#include "UserTestTraits.hpp"
16}
17@parser::namespace
18{ Antlr3Test }
19
20program
21    :   declaration+
22    ;
23
24declaration
25    :   variable
26    |   functionHeader ';'
27    |   functionHeader block
28    ;
29
30variable
31    :   type declarator ';'
32    ;
33
34declarator
35    :   ID
36    ;
37
38functionHeader
39    :   type ID '(' ( formalParameter ( ',' formalParameter )* )? ')'
40    ;
41
42formalParameter
43    :   type declarator
44    ;
45
46type
47    :   'int'
48    |   'char'
49    |   'void'
50    |   ID
51    ;
52
53block
54    :   '{'
55            variable*
56            stat*
57        '}'
58    ;
59
60stat: forStat
61    | expr ';'
62    | block
63    | assignStat ';'
64    | ';'
65    ;
66
67forStat
68    :   'for' '(' assignStat ';' expr ';' assignStat ')' block
69    ;
70
71assignStat
72    :   ID '=' expr
73    ;
74
75expr:   condExpr
76    ;
77
78condExpr
79    :   aexpr ( ('==' | '<') aexpr )?
80    ;
81
82aexpr
83    :   atom ( '+' atom )*
84    ;
85
86atom
87    : ID
88    | INT
89    | '(' expr ')'
90    ;
91
92ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
93    ;
94
95INT :	('0'..'9')+
96    ;
97
98WS  :   (   ' '
99        |   '\t'
100        |   '\r'
101        |   '\n'
102        )+
103        {$channel=HIDDEN}
104    ;
105