xref: /aosp_15_r20/external/antlr/runtime/Cpp/tests/t042ast.g (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
1*16467b97STreehugger Robotgrammar t042ast;
2*16467b97STreehugger Robotoptions {
3*16467b97STreehugger Robot    language =Cpp;
4*16467b97STreehugger Robot    output = AST;
5*16467b97STreehugger Robot}
6*16467b97STreehugger Robot
7*16467b97STreehugger Robottokens {
8*16467b97STreehugger Robot    VARDEF;
9*16467b97STreehugger Robot    FLOAT;
10*16467b97STreehugger Robot    EXPR;
11*16467b97STreehugger Robot    BLOCK;
12*16467b97STreehugger Robot    VARIABLE;
13*16467b97STreehugger Robot    FIELD;
14*16467b97STreehugger Robot    CALL;
15*16467b97STreehugger Robot    INDEX;
16*16467b97STreehugger Robot    FIELDACCESS;
17*16467b97STreehugger Robot}
18*16467b97STreehugger Robot
19*16467b97STreehugger Robot@lexer::includes
20*16467b97STreehugger Robot{
21*16467b97STreehugger Robot#include "UserTestTraits.hpp"
22*16467b97STreehugger Robot}
23*16467b97STreehugger Robot@lexer::namespace
24*16467b97STreehugger Robot{ Antlr3Test }
25*16467b97STreehugger Robot
26*16467b97STreehugger Robot@parser::includes {
27*16467b97STreehugger Robot#include "UserTestTraits.hpp"
28*16467b97STreehugger Robot}
29*16467b97STreehugger Robot@parser::namespace
30*16467b97STreehugger Robot{ Antlr3Test }
31*16467b97STreehugger Robot
32*16467b97STreehugger Robot@init {
33*16467b97STreehugger Robotself.flag = False
34*16467b97STreehugger Robot}
35*16467b97STreehugger Robot
36*16467b97STreehugger Robotr1
37*16467b97STreehugger Robot    : INT ('+'^ INT)*
38*16467b97STreehugger Robot    ;
39*16467b97STreehugger Robot
40*16467b97STreehugger Robotr2
41*16467b97STreehugger Robot    : 'assert'^ x=expression (':'! y=expression)? ';'!
42*16467b97STreehugger Robot    ;
43*16467b97STreehugger Robot
44*16467b97STreehugger Robotr3
45*16467b97STreehugger Robot    : 'if'^ expression s1=statement ('else'! s2=statement)?
46*16467b97STreehugger Robot    ;
47*16467b97STreehugger Robot
48*16467b97STreehugger Robotr4
49*16467b97STreehugger Robot    : 'while'^ expression statement
50*16467b97STreehugger Robot    ;
51*16467b97STreehugger Robot
52*16467b97STreehugger Robotr5
53*16467b97STreehugger Robot    : 'return'^ expression? ';'!
54*16467b97STreehugger Robot    ;
55*16467b97STreehugger Robot
56*16467b97STreehugger Robotr6
57*16467b97STreehugger Robot    : (INT|ID)+
58*16467b97STreehugger Robot    ;
59*16467b97STreehugger Robot
60*16467b97STreehugger Robotr7
61*16467b97STreehugger Robot    : INT ->
62*16467b97STreehugger Robot    ;
63*16467b97STreehugger Robot
64*16467b97STreehugger Robotr8
65*16467b97STreehugger Robot    : 'var' ID ':' type -> ^('var' type ID)
66*16467b97STreehugger Robot    ;
67*16467b97STreehugger Robot
68*16467b97STreehugger Robotr9
69*16467b97STreehugger Robot    : type ID ';' -> ^(VARDEF type ID)
70*16467b97STreehugger Robot    ;
71*16467b97STreehugger Robot
72*16467b97STreehugger Robotr10
73*16467b97STreehugger Robot    : INT -> {CommonTree(CommonToken(type=FLOAT, text=$INT.text + ".0"))}
74*16467b97STreehugger Robot    ;
75*16467b97STreehugger Robot
76*16467b97STreehugger Robotr11
77*16467b97STreehugger Robot    : expression -> ^(EXPR expression)
78*16467b97STreehugger Robot    | -> EXPR
79*16467b97STreehugger Robot    ;
80*16467b97STreehugger Robot
81*16467b97STreehugger Robotr12
82*16467b97STreehugger Robot    : ID (',' ID)* -> ID+
83*16467b97STreehugger Robot    ;
84*16467b97STreehugger Robot
85*16467b97STreehugger Robotr13
86*16467b97STreehugger Robot    : type ID (',' ID)* ';' -> ^(type ID+)
87*16467b97STreehugger Robot    ;
88*16467b97STreehugger Robot
89*16467b97STreehugger Robotr14
90*16467b97STreehugger Robot    :   expression? statement* type+
91*16467b97STreehugger Robot        -> ^(EXPR expression? statement* type+)
92*16467b97STreehugger Robot    ;
93*16467b97STreehugger Robot
94*16467b97STreehugger Robotr15
95*16467b97STreehugger Robot    : INT -> INT INT
96*16467b97STreehugger Robot    ;
97*16467b97STreehugger Robot
98*16467b97STreehugger Robotr16
99*16467b97STreehugger Robot    : 'int' ID (',' ID)* -> ^('int' ID)+
100*16467b97STreehugger Robot    ;
101*16467b97STreehugger Robot
102*16467b97STreehugger Robotr17
103*16467b97STreehugger Robot    : 'for' '(' start=statement ';' expression ';' next=statement ')' statement
104*16467b97STreehugger Robot        -> ^('for' $start expression $next statement)
105*16467b97STreehugger Robot    ;
106*16467b97STreehugger Robot
107*16467b97STreehugger Robotr18
108*16467b97STreehugger Robot    : t='for' -> ^(BLOCK)
109*16467b97STreehugger Robot    ;
110*16467b97STreehugger Robot
111*16467b97STreehugger Robotr19
112*16467b97STreehugger Robot    : t='for' -> ^(BLOCK[$t])
113*16467b97STreehugger Robot    ;
114*16467b97STreehugger Robot
115*16467b97STreehugger Robotr20
116*16467b97STreehugger Robot    : t='for' -> ^(BLOCK[$t,"FOR"])
117*16467b97STreehugger Robot    ;
118*16467b97STreehugger Robot
119*16467b97STreehugger Robotr21
120*16467b97STreehugger Robot    : t='for' -> BLOCK
121*16467b97STreehugger Robot    ;
122*16467b97STreehugger Robot
123*16467b97STreehugger Robotr22
124*16467b97STreehugger Robot    : t='for' -> BLOCK[$t]
125*16467b97STreehugger Robot    ;
126*16467b97STreehugger Robot
127*16467b97STreehugger Robotr23
128*16467b97STreehugger Robot    : t='for' -> BLOCK[$t,"FOR"]
129*16467b97STreehugger Robot    ;
130*16467b97STreehugger Robot
131*16467b97STreehugger Robotr24
132*16467b97STreehugger Robot    : r=statement expression -> ^($r expression)
133*16467b97STreehugger Robot    ;
134*16467b97STreehugger Robot
135*16467b97STreehugger Robotr25
136*16467b97STreehugger Robot    : r+=statement (',' r+=statement)+ expression -> ^($r expression)
137*16467b97STreehugger Robot    ;
138*16467b97STreehugger Robot
139*16467b97STreehugger Robotr26
140*16467b97STreehugger Robot    : r+=statement (',' r+=statement)+ -> ^(BLOCK $r+)
141*16467b97STreehugger Robot    ;
142*16467b97STreehugger Robot
143*16467b97STreehugger Robotr27
144*16467b97STreehugger Robot    : r=statement expression -> ^($r ^($r expression))
145*16467b97STreehugger Robot    ;
146*16467b97STreehugger Robot
147*16467b97STreehugger Robotr28
148*16467b97STreehugger Robot    : ('foo28a'|'foo28b') ->
149*16467b97STreehugger Robot    ;
150*16467b97STreehugger Robot
151*16467b97STreehugger Robotr29
152*16467b97STreehugger Robot    : (r+=statement)* -> ^(BLOCK $r+)
153*16467b97STreehugger Robot    ;
154*16467b97STreehugger Robot
155*16467b97STreehugger Robotr30
156*16467b97STreehugger Robot    : statement* -> ^(BLOCK statement?)
157*16467b97STreehugger Robot    ;
158*16467b97STreehugger Robot
159*16467b97STreehugger Robotr31
160*16467b97STreehugger Robot    : modifier type ID ('=' expression)? ';'
161*16467b97STreehugger Robot        -> {self.flag == 0}? ^(VARDEF ID modifier* type expression?)
162*16467b97STreehugger Robot        -> {self.flag == 1}? ^(VARIABLE ID modifier* type expression?)
163*16467b97STreehugger Robot        ->                   ^(FIELD ID modifier* type expression?)
164*16467b97STreehugger Robot    ;
165*16467b97STreehugger Robot
166*16467b97STreehugger Robotr32[which]
167*16467b97STreehugger Robot  : ID INT -> {which==1}? ID
168*16467b97STreehugger Robot           -> {which==2}? INT
169*16467b97STreehugger Robot           -> // yield nothing as else-clause
170*16467b97STreehugger Robot  ;
171*16467b97STreehugger Robot
172*16467b97STreehugger Robotr33
173*16467b97STreehugger Robot    :   modifiers! statement
174*16467b97STreehugger Robot    ;
175*16467b97STreehugger Robot
176*16467b97STreehugger Robotr34
177*16467b97STreehugger Robot    :   modifiers! r34a[$modifiers.tree]
178*16467b97STreehugger Robot    //|   modifiers! r33b[$modifiers.tree]
179*16467b97STreehugger Robot    ;
180*16467b97STreehugger Robot
181*16467b97STreehugger Robotr34a[mod]
182*16467b97STreehugger Robot    :   'class' ID ('extends' sup=type)?
183*16467b97STreehugger Robot        ( 'implements' i+=type (',' i+=type)*)?
184*16467b97STreehugger Robot        '{' statement* '}'
185*16467b97STreehugger Robot        -> ^('class' ID {$mod} ^('extends' $sup)? ^('implements' $i+)? statement* )
186*16467b97STreehugger Robot    ;
187*16467b97STreehugger Robot
188*16467b97STreehugger Robotr35
189*16467b97STreehugger Robot    : '{' 'extends' (sup=type)? '}'
190*16467b97STreehugger Robot        ->  ^('extends' $sup)?
191*16467b97STreehugger Robot    ;
192*16467b97STreehugger Robot
193*16467b97STreehugger Robotr36
194*16467b97STreehugger Robot    : 'if' '(' expression ')' s1=statement
195*16467b97STreehugger Robot        ( 'else' s2=statement -> ^('if' ^(EXPR expression) $s1 $s2)
196*16467b97STreehugger Robot        |                     -> ^('if' ^(EXPR expression) $s1)
197*16467b97STreehugger Robot        )
198*16467b97STreehugger Robot    ;
199*16467b97STreehugger Robot
200*16467b97STreehugger Robotr37
201*16467b97STreehugger Robot    : (INT -> INT) ('+' i=INT -> ^('+' $r37 $i) )*
202*16467b97STreehugger Robot    ;
203*16467b97STreehugger Robot
204*16467b97STreehugger Robotr38
205*16467b97STreehugger Robot    : INT ('+'^ INT)*
206*16467b97STreehugger Robot    ;
207*16467b97STreehugger Robot
208*16467b97STreehugger Robotr39
209*16467b97STreehugger Robot    : (primary->primary) // set return tree to just primary
210*16467b97STreehugger Robot        ( '(' arg=expression ')'
211*16467b97STreehugger Robot            -> ^(CALL $r39 $arg)
212*16467b97STreehugger Robot        | '[' ie=expression ']'
213*16467b97STreehugger Robot            -> ^(INDEX $r39 $ie)
214*16467b97STreehugger Robot        | '.' p=primary
215*16467b97STreehugger Robot            -> ^(FIELDACCESS $r39 $p)
216*16467b97STreehugger Robot        )*
217*16467b97STreehugger Robot    ;
218*16467b97STreehugger Robot
219*16467b97STreehugger Robotr40
220*16467b97STreehugger Robot    : (INT -> INT) ( ('+' i+=INT)* -> ^('+' $r40 $i*) ) ';'
221*16467b97STreehugger Robot    ;
222*16467b97STreehugger Robot
223*16467b97STreehugger Robotr41
224*16467b97STreehugger Robot    : (INT -> INT) ( ('+' i=INT) -> ^($i $r41) )* ';'
225*16467b97STreehugger Robot    ;
226*16467b97STreehugger Robot
227*16467b97STreehugger Robotr42
228*16467b97STreehugger Robot    : ids+=ID (','! ids+=ID)*
229*16467b97STreehugger Robot    ;
230*16467b97STreehugger Robot
231*16467b97STreehugger Robotr43 returns [res]
232*16467b97STreehugger Robot    : ids+=ID! (','! ids+=ID!)* {$res = [id.text for id in $ids]}
233*16467b97STreehugger Robot    ;
234*16467b97STreehugger Robot
235*16467b97STreehugger Robotr44
236*16467b97STreehugger Robot    : ids+=ID^ (','! ids+=ID^)*
237*16467b97STreehugger Robot    ;
238*16467b97STreehugger Robot
239*16467b97STreehugger Robotr45
240*16467b97STreehugger Robot    : primary^
241*16467b97STreehugger Robot    ;
242*16467b97STreehugger Robot
243*16467b97STreehugger Robotr46 returns [res]
244*16467b97STreehugger Robot    : ids+=primary! (','! ids+=primary!)* {$res = [id.text for id in $ids]}
245*16467b97STreehugger Robot    ;
246*16467b97STreehugger Robot
247*16467b97STreehugger Robotr47
248*16467b97STreehugger Robot    : ids+=primary (','! ids+=primary)*
249*16467b97STreehugger Robot    ;
250*16467b97STreehugger Robot
251*16467b97STreehugger Robotr48
252*16467b97STreehugger Robot    : ids+=. (','! ids+=.)*
253*16467b97STreehugger Robot    ;
254*16467b97STreehugger Robot
255*16467b97STreehugger Robotr49
256*16467b97STreehugger Robot    : .^ ID
257*16467b97STreehugger Robot    ;
258*16467b97STreehugger Robot
259*16467b97STreehugger Robotr50
260*16467b97STreehugger Robot    : ID
261*16467b97STreehugger Robot        -> ^({CommonTree(CommonToken(type=FLOAT, text="1.0"))} ID)
262*16467b97STreehugger Robot    ;
263*16467b97STreehugger Robot
264*16467b97STreehugger Robot/** templates tested:
265*16467b97STreehugger Robot    tokenLabelPropertyRef_tree
266*16467b97STreehugger Robot*/
267*16467b97STreehugger Robotr51 returns [res]
268*16467b97STreehugger Robot    : ID t=ID ID
269*16467b97STreehugger Robot        { $res = $t.tree }
270*16467b97STreehugger Robot    ;
271*16467b97STreehugger Robot
272*16467b97STreehugger Robot/** templates tested:
273*16467b97STreehugger Robot    rulePropertyRef_tree
274*16467b97STreehugger Robot*/
275*16467b97STreehugger Robotr52 returns [res]
276*16467b97STreehugger Robot@after {
277*16467b97STreehugger Robot    $res = $tree
278*16467b97STreehugger Robot}
279*16467b97STreehugger Robot    : ID
280*16467b97STreehugger Robot    ;
281*16467b97STreehugger Robot
282*16467b97STreehugger Robot/** templates tested:
283*16467b97STreehugger Robot    ruleLabelPropertyRef_tree
284*16467b97STreehugger Robot*/
285*16467b97STreehugger Robotr53 returns [res]
286*16467b97STreehugger Robot    : t=primary
287*16467b97STreehugger Robot        { $res = $t.tree }
288*16467b97STreehugger Robot    ;
289*16467b97STreehugger Robot
290*16467b97STreehugger Robot/** templates tested:
291*16467b97STreehugger Robot    ruleSetPropertyRef_tree
292*16467b97STreehugger Robot*/
293*16467b97STreehugger Robotr54 returns [res]
294*16467b97STreehugger Robot@after {
295*16467b97STreehugger Robot    $tree = $t.tree;
296*16467b97STreehugger Robot}
297*16467b97STreehugger Robot    : ID t=expression ID
298*16467b97STreehugger Robot    ;
299*16467b97STreehugger Robot
300*16467b97STreehugger Robot/** backtracking */
301*16467b97STreehugger Robotr55
302*16467b97STreehugger Robotoptions { backtrack=true; k=1; }
303*16467b97STreehugger Robot    : (modifier+ INT)=> modifier+ expression
304*16467b97STreehugger Robot    | modifier+ statement
305*16467b97STreehugger Robot    ;
306*16467b97STreehugger Robot
307*16467b97STreehugger Robot
308*16467b97STreehugger Robot/** templates tested:
309*16467b97STreehugger Robot    rewriteTokenRef with len(args)>0
310*16467b97STreehugger Robot*/
311*16467b97STreehugger Robotr56
312*16467b97STreehugger Robot    : t=ID* -> ID[$t,'foo']
313*16467b97STreehugger Robot    ;
314*16467b97STreehugger Robot
315*16467b97STreehugger Robot/** templates tested:
316*16467b97STreehugger Robot    rewriteTokenRefRoot with len(args)>0
317*16467b97STreehugger Robot*/
318*16467b97STreehugger Robotr57
319*16467b97STreehugger Robot    : t=ID* -> ^(ID[$t,'foo'])
320*16467b97STreehugger Robot    ;
321*16467b97STreehugger Robot
322*16467b97STreehugger Robot/** templates tested:
323*16467b97STreehugger Robot    ???
324*16467b97STreehugger Robot*/
325*16467b97STreehugger Robotr58
326*16467b97STreehugger Robot    : ({CommonTree(CommonToken(type=FLOAT, text="2.0"))})^
327*16467b97STreehugger Robot    ;
328*16467b97STreehugger Robot
329*16467b97STreehugger Robot/** templates tested:
330*16467b97STreehugger Robot    rewriteTokenListLabelRefRoot
331*16467b97STreehugger Robot*/
332*16467b97STreehugger Robotr59
333*16467b97STreehugger Robot    : (t+=ID)+ statement -> ^($t statement)+
334*16467b97STreehugger Robot    ;
335*16467b97STreehugger Robot
336*16467b97STreehugger Robotprimary
337*16467b97STreehugger Robot    : ID
338*16467b97STreehugger Robot    ;
339*16467b97STreehugger Robot
340*16467b97STreehugger Robotexpression
341*16467b97STreehugger Robot    : r1
342*16467b97STreehugger Robot    ;
343*16467b97STreehugger Robot
344*16467b97STreehugger Robotstatement
345*16467b97STreehugger Robot    : 'fooze'
346*16467b97STreehugger Robot    | 'fooze2'
347*16467b97STreehugger Robot    ;
348*16467b97STreehugger Robot
349*16467b97STreehugger Robotmodifiers
350*16467b97STreehugger Robot    : modifier+
351*16467b97STreehugger Robot    ;
352*16467b97STreehugger Robot
353*16467b97STreehugger Robotmodifier
354*16467b97STreehugger Robot    : 'public'
355*16467b97STreehugger Robot    | 'private'
356*16467b97STreehugger Robot    ;
357*16467b97STreehugger Robot
358*16467b97STreehugger Robottype
359*16467b97STreehugger Robot    : 'int'
360*16467b97STreehugger Robot    | 'bool'
361*16467b97STreehugger Robot    ;
362*16467b97STreehugger Robot
363*16467b97STreehugger RobotID : 'a'..'z' + ;
364*16467b97STreehugger RobotINT : '0'..'9' +;
365*16467b97STreehugger RobotWS: (' ' | '\n' | '\t')+ {$channel = HIDDEN;};
366*16467b97STreehugger Robot
367