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