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