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