xref: /aosp_15_r20/external/antlr/runtime/Cpp/tests/t042ast.g (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
1grammar t042ast;
2options {
3    language =Cpp;
4    output = AST;
5}
6
7tokens {
8    VARDEF;
9    FLOAT;
10    EXPR;
11    BLOCK;
12    VARIABLE;
13    FIELD;
14    CALL;
15    INDEX;
16    FIELDACCESS;
17}
18
19@lexer::includes
20{
21#include "UserTestTraits.hpp"
22}
23@lexer::namespace
24{ Antlr3Test }
25
26@parser::includes {
27#include "UserTestTraits.hpp"
28}
29@parser::namespace
30{ Antlr3Test }
31
32@init {
33self.flag = False
34}
35
36r1
37    : INT ('+'^ INT)*
38    ;
39
40r2
41    : 'assert'^ x=expression (':'! y=expression)? ';'!
42    ;
43
44r3
45    : 'if'^ expression s1=statement ('else'! s2=statement)?
46    ;
47
48r4
49    : 'while'^ expression statement
50    ;
51
52r5
53    : 'return'^ expression? ';'!
54    ;
55
56r6
57    : (INT|ID)+
58    ;
59
60r7
61    : INT ->
62    ;
63
64r8
65    : 'var' ID ':' type -> ^('var' type ID)
66    ;
67
68r9
69    : type ID ';' -> ^(VARDEF type ID)
70    ;
71
72r10
73    : INT -> {CommonTree(CommonToken(type=FLOAT, text=$INT.text + ".0"))}
74    ;
75
76r11
77    : expression -> ^(EXPR expression)
78    | -> EXPR
79    ;
80
81r12
82    : ID (',' ID)* -> ID+
83    ;
84
85r13
86    : type ID (',' ID)* ';' -> ^(type ID+)
87    ;
88
89r14
90    :   expression? statement* type+
91        -> ^(EXPR expression? statement* type+)
92    ;
93
94r15
95    : INT -> INT INT
96    ;
97
98r16
99    : 'int' ID (',' ID)* -> ^('int' ID)+
100    ;
101
102r17
103    : 'for' '(' start=statement ';' expression ';' next=statement ')' statement
104        -> ^('for' $start expression $next statement)
105    ;
106
107r18
108    : t='for' -> ^(BLOCK)
109    ;
110
111r19
112    : t='for' -> ^(BLOCK[$t])
113    ;
114
115r20
116    : t='for' -> ^(BLOCK[$t,"FOR"])
117    ;
118
119r21
120    : t='for' -> BLOCK
121    ;
122
123r22
124    : t='for' -> BLOCK[$t]
125    ;
126
127r23
128    : t='for' -> BLOCK[$t,"FOR"]
129    ;
130
131r24
132    : r=statement expression -> ^($r expression)
133    ;
134
135r25
136    : r+=statement (',' r+=statement)+ expression -> ^($r expression)
137    ;
138
139r26
140    : r+=statement (',' r+=statement)+ -> ^(BLOCK $r+)
141    ;
142
143r27
144    : r=statement expression -> ^($r ^($r expression))
145    ;
146
147r28
148    : ('foo28a'|'foo28b') ->
149    ;
150
151r29
152    : (r+=statement)* -> ^(BLOCK $r+)
153    ;
154
155r30
156    : statement* -> ^(BLOCK statement?)
157    ;
158
159r31
160    : modifier type ID ('=' expression)? ';'
161        -> {self.flag == 0}? ^(VARDEF ID modifier* type expression?)
162        -> {self.flag == 1}? ^(VARIABLE ID modifier* type expression?)
163        ->                   ^(FIELD ID modifier* type expression?)
164    ;
165
166r32[which]
167  : ID INT -> {which==1}? ID
168           -> {which==2}? INT
169           -> // yield nothing as else-clause
170  ;
171
172r33
173    :   modifiers! statement
174    ;
175
176r34
177    :   modifiers! r34a[$modifiers.tree]
178    //|   modifiers! r33b[$modifiers.tree]
179    ;
180
181r34a[mod]
182    :   'class' ID ('extends' sup=type)?
183        ( 'implements' i+=type (',' i+=type)*)?
184        '{' statement* '}'
185        -> ^('class' ID {$mod} ^('extends' $sup)? ^('implements' $i+)? statement* )
186    ;
187
188r35
189    : '{' 'extends' (sup=type)? '}'
190        ->  ^('extends' $sup)?
191    ;
192
193r36
194    : 'if' '(' expression ')' s1=statement
195        ( 'else' s2=statement -> ^('if' ^(EXPR expression) $s1 $s2)
196        |                     -> ^('if' ^(EXPR expression) $s1)
197        )
198    ;
199
200r37
201    : (INT -> INT) ('+' i=INT -> ^('+' $r37 $i) )*
202    ;
203
204r38
205    : INT ('+'^ INT)*
206    ;
207
208r39
209    : (primary->primary) // set return tree to just primary
210        ( '(' arg=expression ')'
211            -> ^(CALL $r39 $arg)
212        | '[' ie=expression ']'
213            -> ^(INDEX $r39 $ie)
214        | '.' p=primary
215            -> ^(FIELDACCESS $r39 $p)
216        )*
217    ;
218
219r40
220    : (INT -> INT) ( ('+' i+=INT)* -> ^('+' $r40 $i*) ) ';'
221    ;
222
223r41
224    : (INT -> INT) ( ('+' i=INT) -> ^($i $r41) )* ';'
225    ;
226
227r42
228    : ids+=ID (','! ids+=ID)*
229    ;
230
231r43 returns [res]
232    : ids+=ID! (','! ids+=ID!)* {$res = [id.text for id in $ids]}
233    ;
234
235r44
236    : ids+=ID^ (','! ids+=ID^)*
237    ;
238
239r45
240    : primary^
241    ;
242
243r46 returns [res]
244    : ids+=primary! (','! ids+=primary!)* {$res = [id.text for id in $ids]}
245    ;
246
247r47
248    : ids+=primary (','! ids+=primary)*
249    ;
250
251r48
252    : ids+=. (','! ids+=.)*
253    ;
254
255r49
256    : .^ ID
257    ;
258
259r50
260    : ID
261        -> ^({CommonTree(CommonToken(type=FLOAT, text="1.0"))} ID)
262    ;
263
264/** templates tested:
265    tokenLabelPropertyRef_tree
266*/
267r51 returns [res]
268    : ID t=ID ID
269        { $res = $t.tree }
270    ;
271
272/** templates tested:
273    rulePropertyRef_tree
274*/
275r52 returns [res]
276@after {
277    $res = $tree
278}
279    : ID
280    ;
281
282/** templates tested:
283    ruleLabelPropertyRef_tree
284*/
285r53 returns [res]
286    : t=primary
287        { $res = $t.tree }
288    ;
289
290/** templates tested:
291    ruleSetPropertyRef_tree
292*/
293r54 returns [res]
294@after {
295    $tree = $t.tree;
296}
297    : ID t=expression ID
298    ;
299
300/** backtracking */
301r55
302options { backtrack=true; k=1; }
303    : (modifier+ INT)=> modifier+ expression
304    | modifier+ statement
305    ;
306
307
308/** templates tested:
309    rewriteTokenRef with len(args)>0
310*/
311r56
312    : t=ID* -> ID[$t,'foo']
313    ;
314
315/** templates tested:
316    rewriteTokenRefRoot with len(args)>0
317*/
318r57
319    : t=ID* -> ^(ID[$t,'foo'])
320    ;
321
322/** templates tested:
323    ???
324*/
325r58
326    : ({CommonTree(CommonToken(type=FLOAT, text="2.0"))})^
327    ;
328
329/** templates tested:
330    rewriteTokenListLabelRefRoot
331*/
332r59
333    : (t+=ID)+ statement -> ^($t statement)+
334    ;
335
336primary
337    : ID
338    ;
339
340expression
341    : r1
342    ;
343
344statement
345    : 'fooze'
346    | 'fooze2'
347    ;
348
349modifiers
350    : modifier+
351    ;
352
353modifier
354    : 'public'
355    | 'private'
356    ;
357
358type
359    : 'int'
360    | 'bool'
361    ;
362
363ID : 'a'..'z' + ;
364INT : '0'..'9' +;
365WS: (' ' | '\n' | '\t')+ {$channel = HIDDEN;};
366
367