xref: /aosp_15_r20/external/antlr/runtime/Python/tests/t033backtracking.g (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
1*16467b97STreehugger Robotgrammar t033backtracking;
2*16467b97STreehugger Robotoptions {
3*16467b97STreehugger Robot    language=Python;
4*16467b97STreehugger Robot    backtrack=true;
5*16467b97STreehugger Robot    memoize=true;
6*16467b97STreehugger Robot    k=2;
7*16467b97STreehugger Robot}
8*16467b97STreehugger Robot
9*16467b97STreehugger Robotscope Symbols {
10*16467b97STreehugger Robot	types;
11*16467b97STreehugger Robot}
12*16467b97STreehugger Robot
13*16467b97STreehugger Robot@header {
14*16467b97STreehugger Robot# compatibility stuff
15*16467b97STreehugger Robottry:
16*16467b97STreehugger Robot    set = set
17*16467b97STreehugger Robot    frozenset = frozenset
18*16467b97STreehugger Robotexcept NameError:
19*16467b97STreehugger Robot    from sets import Set as set, ImmutableSet as frozenset
20*16467b97STreehugger Robot
21*16467b97STreehugger Robot
22*16467b97STreehugger Robottry:
23*16467b97STreehugger Robot    reversed = reversed
24*16467b97STreehugger Robotexcept NameError:
25*16467b97STreehugger Robot    def reversed(l):
26*16467b97STreehugger Robot        l = l[:]
27*16467b97STreehugger Robot        l.reverse()
28*16467b97STreehugger Robot        return l
29*16467b97STreehugger Robot
30*16467b97STreehugger Robot}
31*16467b97STreehugger Robot
32*16467b97STreehugger Robot@members {
33*16467b97STreehugger Robot    def isTypeName(self, name):
34*16467b97STreehugger Robot        for scope in reversed(self.Symbols_stack):
35*16467b97STreehugger Robot            if name in scope.types:
36*16467b97STreehugger Robot                return True
37*16467b97STreehugger Robot
38*16467b97STreehugger Robot        return False
39*16467b97STreehugger Robot
40*16467b97STreehugger Robot}
41*16467b97STreehugger Robot
42*16467b97STreehugger Robottranslation_unit
43*16467b97STreehugger Robotscope Symbols; // entire file is a scope
44*16467b97STreehugger Robot@init {
45*16467b97STreehugger Robot  $Symbols::types = set()
46*16467b97STreehugger Robot}
47*16467b97STreehugger Robot	: external_declaration+
48*16467b97STreehugger Robot	;
49*16467b97STreehugger Robot
50*16467b97STreehugger Robot/** Either a function definition or any other kind of C decl/def.
51*16467b97STreehugger Robot *  The LL(*) analysis algorithm fails to deal with this due to
52*16467b97STreehugger Robot *  recursion in the declarator rules.  I'm putting in a
53*16467b97STreehugger Robot *  manual predicate here so that we don't backtrack over
54*16467b97STreehugger Robot *  the entire function.  Further, you get a better error
55*16467b97STreehugger Robot *  as errors within the function itself don't make it fail
56*16467b97STreehugger Robot *  to predict that it's a function.  Weird errors previously.
57*16467b97STreehugger Robot *  Remember: the goal is to avoid backtrack like the plague
58*16467b97STreehugger Robot *  because it makes debugging, actions, and errors harder.
59*16467b97STreehugger Robot *
60*16467b97STreehugger Robot *  Note that k=1 results in a much smaller predictor for the
61*16467b97STreehugger Robot *  fixed lookahead; k=2 made a few extra thousand lines. ;)
62*16467b97STreehugger Robot *  I'll have to optimize that in the future.
63*16467b97STreehugger Robot */
64*16467b97STreehugger Robotexternal_declaration
65*16467b97STreehugger Robotoptions {k=1;}
66*16467b97STreehugger Robot	: ( declaration_specifiers? declarator declaration* '{' )=> function_definition
67*16467b97STreehugger Robot	| declaration
68*16467b97STreehugger Robot	;
69*16467b97STreehugger Robot
70*16467b97STreehugger Robotfunction_definition
71*16467b97STreehugger Robotscope Symbols; // put parameters and locals into same scope for now
72*16467b97STreehugger Robot@init {
73*16467b97STreehugger Robot  $Symbols::types = set()
74*16467b97STreehugger Robot}
75*16467b97STreehugger Robot	:	declaration_specifiers? declarator
76*16467b97STreehugger Robot// 		(	declaration+ compound_statement	// K&R style
77*16467b97STreehugger Robot// 		|	compound_statement				// ANSI style
78*16467b97STreehugger Robot// 		)
79*16467b97STreehugger Robot	;
80*16467b97STreehugger Robot
81*16467b97STreehugger Robotdeclaration
82*16467b97STreehugger Robotscope {
83*16467b97STreehugger Robot  isTypedef;
84*16467b97STreehugger Robot}
85*16467b97STreehugger Robot@init {
86*16467b97STreehugger Robot  $declaration::isTypedef = False
87*16467b97STreehugger Robot}
88*16467b97STreehugger Robot	: 'typedef' declaration_specifiers? {$declaration::isTypedef = True}
89*16467b97STreehugger Robot	  init_declarator_list ';' // special case, looking for typedef
90*16467b97STreehugger Robot	| declaration_specifiers init_declarator_list? ';'
91*16467b97STreehugger Robot	;
92*16467b97STreehugger Robot
93*16467b97STreehugger Robotdeclaration_specifiers
94*16467b97STreehugger Robot	:   (   storage_class_specifier
95*16467b97STreehugger Robot		|   type_specifier
96*16467b97STreehugger Robot        |   type_qualifier
97*16467b97STreehugger Robot        )+
98*16467b97STreehugger Robot	;
99*16467b97STreehugger Robot
100*16467b97STreehugger Robotinit_declarator_list
101*16467b97STreehugger Robot	: init_declarator (',' init_declarator)*
102*16467b97STreehugger Robot	;
103*16467b97STreehugger Robot
104*16467b97STreehugger Robotinit_declarator
105*16467b97STreehugger Robot	: declarator //('=' initializer)?
106*16467b97STreehugger Robot	;
107*16467b97STreehugger Robot
108*16467b97STreehugger Robotstorage_class_specifier
109*16467b97STreehugger Robot	: 'extern'
110*16467b97STreehugger Robot	| 'static'
111*16467b97STreehugger Robot	| 'auto'
112*16467b97STreehugger Robot	| 'register'
113*16467b97STreehugger Robot	;
114*16467b97STreehugger Robot
115*16467b97STreehugger Robottype_specifier
116*16467b97STreehugger Robot	: 'void'
117*16467b97STreehugger Robot	| 'char'
118*16467b97STreehugger Robot	| 'short'
119*16467b97STreehugger Robot	| 'int'
120*16467b97STreehugger Robot	| 'long'
121*16467b97STreehugger Robot	| 'float'
122*16467b97STreehugger Robot	| 'double'
123*16467b97STreehugger Robot	| 'signed'
124*16467b97STreehugger Robot	| 'unsigned'
125*16467b97STreehugger Robot// 	| struct_or_union_specifier
126*16467b97STreehugger Robot// 	| enum_specifier
127*16467b97STreehugger Robot	| type_id
128*16467b97STreehugger Robot	;
129*16467b97STreehugger Robot
130*16467b97STreehugger Robottype_id
131*16467b97STreehugger Robot    :   {self.isTypeName(self.input.LT(1).getText())}? IDENTIFIER
132*16467b97STreehugger Robot//    	{System.out.println($IDENTIFIER.text+" is a type");}
133*16467b97STreehugger Robot    ;
134*16467b97STreehugger Robot
135*16467b97STreehugger Robot// struct_or_union_specifier
136*16467b97STreehugger Robot// options {k=3;}
137*16467b97STreehugger Robot// scope Symbols; // structs are scopes
138*16467b97STreehugger Robot// @init {
139*16467b97STreehugger Robot//   $Symbols::types = set()
140*16467b97STreehugger Robot// }
141*16467b97STreehugger Robot// 	: struct_or_union IDENTIFIER? '{' struct_declaration_list '}'
142*16467b97STreehugger Robot// 	| struct_or_union IDENTIFIER
143*16467b97STreehugger Robot// 	;
144*16467b97STreehugger Robot
145*16467b97STreehugger Robot// struct_or_union
146*16467b97STreehugger Robot// 	: 'struct'
147*16467b97STreehugger Robot// 	| 'union'
148*16467b97STreehugger Robot// 	;
149*16467b97STreehugger Robot
150*16467b97STreehugger Robot// struct_declaration_list
151*16467b97STreehugger Robot// 	: struct_declaration+
152*16467b97STreehugger Robot// 	;
153*16467b97STreehugger Robot
154*16467b97STreehugger Robot// struct_declaration
155*16467b97STreehugger Robot// 	: specifier_qualifier_list struct_declarator_list ';'
156*16467b97STreehugger Robot// 	;
157*16467b97STreehugger Robot
158*16467b97STreehugger Robot// specifier_qualifier_list
159*16467b97STreehugger Robot// 	: ( type_qualifier | type_specifier )+
160*16467b97STreehugger Robot// 	;
161*16467b97STreehugger Robot
162*16467b97STreehugger Robot// struct_declarator_list
163*16467b97STreehugger Robot// 	: struct_declarator (',' struct_declarator)*
164*16467b97STreehugger Robot// 	;
165*16467b97STreehugger Robot
166*16467b97STreehugger Robot// struct_declarator
167*16467b97STreehugger Robot// 	: declarator (':' constant_expression)?
168*16467b97STreehugger Robot// 	| ':' constant_expression
169*16467b97STreehugger Robot// 	;
170*16467b97STreehugger Robot
171*16467b97STreehugger Robot// enum_specifier
172*16467b97STreehugger Robot// options {k=3;}
173*16467b97STreehugger Robot// 	: 'enum' '{' enumerator_list '}'
174*16467b97STreehugger Robot// 	| 'enum' IDENTIFIER '{' enumerator_list '}'
175*16467b97STreehugger Robot// 	| 'enum' IDENTIFIER
176*16467b97STreehugger Robot// 	;
177*16467b97STreehugger Robot
178*16467b97STreehugger Robot// enumerator_list
179*16467b97STreehugger Robot// 	: enumerator (',' enumerator)*
180*16467b97STreehugger Robot// 	;
181*16467b97STreehugger Robot
182*16467b97STreehugger Robot// enumerator
183*16467b97STreehugger Robot// 	: IDENTIFIER ('=' constant_expression)?
184*16467b97STreehugger Robot// 	;
185*16467b97STreehugger Robot
186*16467b97STreehugger Robottype_qualifier
187*16467b97STreehugger Robot	: 'const'
188*16467b97STreehugger Robot	| 'volatile'
189*16467b97STreehugger Robot	;
190*16467b97STreehugger Robot
191*16467b97STreehugger Robotdeclarator
192*16467b97STreehugger Robot	: pointer? direct_declarator
193*16467b97STreehugger Robot	| pointer
194*16467b97STreehugger Robot	;
195*16467b97STreehugger Robot
196*16467b97STreehugger Robotdirect_declarator
197*16467b97STreehugger Robot	:   (	IDENTIFIER
198*16467b97STreehugger Robot			{
199*16467b97STreehugger Robot			if len($declaration)>0 and $declaration::isTypedef:
200*16467b97STreehugger Robot				$Symbols::types.add($IDENTIFIER.text)
201*16467b97STreehugger Robot				print "define type "+$IDENTIFIER.text
202*16467b97STreehugger Robot			}
203*16467b97STreehugger Robot		|	'(' declarator ')'
204*16467b97STreehugger Robot		)
205*16467b97STreehugger Robot        declarator_suffix*
206*16467b97STreehugger Robot	;
207*16467b97STreehugger Robot
208*16467b97STreehugger Robotdeclarator_suffix
209*16467b97STreehugger Robot	:   /*'[' constant_expression ']'
210*16467b97STreehugger Robot    |*/   '[' ']'
211*16467b97STreehugger Robot//     |   '(' parameter_type_list ')'
212*16467b97STreehugger Robot//     |   '(' identifier_list ')'
213*16467b97STreehugger Robot    |   '(' ')'
214*16467b97STreehugger Robot	;
215*16467b97STreehugger Robot
216*16467b97STreehugger Robotpointer
217*16467b97STreehugger Robot	: '*' type_qualifier+ pointer?
218*16467b97STreehugger Robot	| '*' pointer
219*16467b97STreehugger Robot	| '*'
220*16467b97STreehugger Robot	;
221*16467b97STreehugger Robot
222*16467b97STreehugger Robot// parameter_type_list
223*16467b97STreehugger Robot// 	: parameter_list (',' '...')?
224*16467b97STreehugger Robot// 	;
225*16467b97STreehugger Robot
226*16467b97STreehugger Robot// parameter_list
227*16467b97STreehugger Robot// 	: parameter_declaration (',' parameter_declaration)*
228*16467b97STreehugger Robot// 	;
229*16467b97STreehugger Robot
230*16467b97STreehugger Robot// parameter_declaration
231*16467b97STreehugger Robot// 	: declaration_specifiers (declarator|abstract_declarator)*
232*16467b97STreehugger Robot// 	;
233*16467b97STreehugger Robot
234*16467b97STreehugger Robot// identifier_list
235*16467b97STreehugger Robot// 	: IDENTIFIER (',' IDENTIFIER)*
236*16467b97STreehugger Robot// 	;
237*16467b97STreehugger Robot
238*16467b97STreehugger Robot// type_name
239*16467b97STreehugger Robot// 	: specifier_qualifier_list abstract_declarator?
240*16467b97STreehugger Robot// 	;
241*16467b97STreehugger Robot
242*16467b97STreehugger Robot// abstract_declarator
243*16467b97STreehugger Robot// 	: pointer direct_abstract_declarator?
244*16467b97STreehugger Robot// 	| direct_abstract_declarator
245*16467b97STreehugger Robot// 	;
246*16467b97STreehugger Robot
247*16467b97STreehugger Robot// direct_abstract_declarator
248*16467b97STreehugger Robot// 	:	( '(' abstract_declarator ')' | abstract_declarator_suffix ) abstract_declarator_suffix*
249*16467b97STreehugger Robot// 	;
250*16467b97STreehugger Robot
251*16467b97STreehugger Robot// abstract_declarator_suffix
252*16467b97STreehugger Robot// 	:	'[' ']'
253*16467b97STreehugger Robot// 	|	'[' constant_expression ']'
254*16467b97STreehugger Robot// 	|	'(' ')'
255*16467b97STreehugger Robot// 	|	'(' parameter_type_list ')'
256*16467b97STreehugger Robot// 	;
257*16467b97STreehugger Robot
258*16467b97STreehugger Robot// initializer
259*16467b97STreehugger Robot// 	: assignment_expression
260*16467b97STreehugger Robot// 	| '{' initializer_list ','? '}'
261*16467b97STreehugger Robot// 	;
262*16467b97STreehugger Robot
263*16467b97STreehugger Robot// initializer_list
264*16467b97STreehugger Robot// 	: initializer (',' initializer)*
265*16467b97STreehugger Robot// 	;
266*16467b97STreehugger Robot
267*16467b97STreehugger Robot// // E x p r e s s i o n s
268*16467b97STreehugger Robot
269*16467b97STreehugger Robot// argument_expression_list
270*16467b97STreehugger Robot// 	:   assignment_expression (',' assignment_expression)*
271*16467b97STreehugger Robot// 	;
272*16467b97STreehugger Robot
273*16467b97STreehugger Robot// additive_expression
274*16467b97STreehugger Robot// 	: (multiplicative_expression) ('+' multiplicative_expression | '-' multiplicative_expression)*
275*16467b97STreehugger Robot// 	;
276*16467b97STreehugger Robot
277*16467b97STreehugger Robot// multiplicative_expression
278*16467b97STreehugger Robot// 	: (cast_expression) ('*' cast_expression | '/' cast_expression | '%' cast_expression)*
279*16467b97STreehugger Robot// 	;
280*16467b97STreehugger Robot
281*16467b97STreehugger Robot// cast_expression
282*16467b97STreehugger Robot// 	: '(' type_name ')' cast_expression
283*16467b97STreehugger Robot// 	| unary_expression
284*16467b97STreehugger Robot// 	;
285*16467b97STreehugger Robot
286*16467b97STreehugger Robot// unary_expression
287*16467b97STreehugger Robot// 	: postfix_expression
288*16467b97STreehugger Robot// 	| '++' unary_expression
289*16467b97STreehugger Robot// 	| '--' unary_expression
290*16467b97STreehugger Robot// 	| unary_operator cast_expression
291*16467b97STreehugger Robot// 	| 'sizeof' unary_expression
292*16467b97STreehugger Robot// 	| 'sizeof' '(' type_name ')'
293*16467b97STreehugger Robot// 	;
294*16467b97STreehugger Robot
295*16467b97STreehugger Robot// postfix_expression
296*16467b97STreehugger Robot// 	:   primary_expression
297*16467b97STreehugger Robot//         (   '[' expression ']'
298*16467b97STreehugger Robot//         |   '(' ')'
299*16467b97STreehugger Robot//         |   '(' argument_expression_list ')'
300*16467b97STreehugger Robot//         |   '.' IDENTIFIER
301*16467b97STreehugger Robot//         |   '*' IDENTIFIER
302*16467b97STreehugger Robot//         |   '->' IDENTIFIER
303*16467b97STreehugger Robot//         |   '++'
304*16467b97STreehugger Robot//         |   '--'
305*16467b97STreehugger Robot//         )*
306*16467b97STreehugger Robot// 	;
307*16467b97STreehugger Robot
308*16467b97STreehugger Robot// unary_operator
309*16467b97STreehugger Robot// 	: '&'
310*16467b97STreehugger Robot// 	| '*'
311*16467b97STreehugger Robot// 	| '+'
312*16467b97STreehugger Robot// 	| '-'
313*16467b97STreehugger Robot// 	| '~'
314*16467b97STreehugger Robot// 	| '!'
315*16467b97STreehugger Robot// 	;
316*16467b97STreehugger Robot
317*16467b97STreehugger Robot// primary_expression
318*16467b97STreehugger Robot// 	: IDENTIFIER
319*16467b97STreehugger Robot// 	| constant
320*16467b97STreehugger Robot// 	| '(' expression ')'
321*16467b97STreehugger Robot// 	;
322*16467b97STreehugger Robot
323*16467b97STreehugger Robot// constant
324*16467b97STreehugger Robot//     :   HEX_LITERAL
325*16467b97STreehugger Robot//     |   OCTAL_LITERAL
326*16467b97STreehugger Robot//     |   DECIMAL_LITERAL
327*16467b97STreehugger Robot//     |	CHARACTER_LITERAL
328*16467b97STreehugger Robot// 	|	STRING_LITERAL
329*16467b97STreehugger Robot//     |   FLOATING_POINT_LITERAL
330*16467b97STreehugger Robot//     ;
331*16467b97STreehugger Robot
332*16467b97STreehugger Robot// /////
333*16467b97STreehugger Robot
334*16467b97STreehugger Robot// expression
335*16467b97STreehugger Robot// 	: assignment_expression (',' assignment_expression)*
336*16467b97STreehugger Robot// 	;
337*16467b97STreehugger Robot
338*16467b97STreehugger Robot// constant_expression
339*16467b97STreehugger Robot// 	: conditional_expression
340*16467b97STreehugger Robot// 	;
341*16467b97STreehugger Robot
342*16467b97STreehugger Robot// assignment_expression
343*16467b97STreehugger Robot// 	: lvalue assignment_operator assignment_expression
344*16467b97STreehugger Robot// 	| conditional_expression
345*16467b97STreehugger Robot// 	;
346*16467b97STreehugger Robot
347*16467b97STreehugger Robot// lvalue
348*16467b97STreehugger Robot// 	:	unary_expression
349*16467b97STreehugger Robot// 	;
350*16467b97STreehugger Robot
351*16467b97STreehugger Robot// assignment_operator
352*16467b97STreehugger Robot// 	: '='
353*16467b97STreehugger Robot// 	| '*='
354*16467b97STreehugger Robot// 	| '/='
355*16467b97STreehugger Robot// 	| '%='
356*16467b97STreehugger Robot// 	| '+='
357*16467b97STreehugger Robot// 	| '-='
358*16467b97STreehugger Robot// 	| '<<='
359*16467b97STreehugger Robot// 	| '>>='
360*16467b97STreehugger Robot// 	| '&='
361*16467b97STreehugger Robot// 	| '^='
362*16467b97STreehugger Robot// 	| '|='
363*16467b97STreehugger Robot// 	;
364*16467b97STreehugger Robot
365*16467b97STreehugger Robot// conditional_expression
366*16467b97STreehugger Robot// 	: logical_or_expression ('?' expression ':' conditional_expression)?
367*16467b97STreehugger Robot// 	;
368*16467b97STreehugger Robot
369*16467b97STreehugger Robot// logical_or_expression
370*16467b97STreehugger Robot// 	: logical_and_expression ('||' logical_and_expression)*
371*16467b97STreehugger Robot// 	;
372*16467b97STreehugger Robot
373*16467b97STreehugger Robot// logical_and_expression
374*16467b97STreehugger Robot// 	: inclusive_or_expression ('&&' inclusive_or_expression)*
375*16467b97STreehugger Robot// 	;
376*16467b97STreehugger Robot
377*16467b97STreehugger Robot// inclusive_or_expression
378*16467b97STreehugger Robot// 	: exclusive_or_expression ('|' exclusive_or_expression)*
379*16467b97STreehugger Robot// 	;
380*16467b97STreehugger Robot
381*16467b97STreehugger Robot// exclusive_or_expression
382*16467b97STreehugger Robot// 	: and_expression ('^' and_expression)*
383*16467b97STreehugger Robot// 	;
384*16467b97STreehugger Robot
385*16467b97STreehugger Robot// and_expression
386*16467b97STreehugger Robot// 	: equality_expression ('&' equality_expression)*
387*16467b97STreehugger Robot// 	;
388*16467b97STreehugger Robot// equality_expression
389*16467b97STreehugger Robot// 	: relational_expression (('=='|'!=') relational_expression)*
390*16467b97STreehugger Robot// 	;
391*16467b97STreehugger Robot
392*16467b97STreehugger Robot// relational_expression
393*16467b97STreehugger Robot// 	: shift_expression (('<'|'>'|'<='|'>=') shift_expression)*
394*16467b97STreehugger Robot// 	;
395*16467b97STreehugger Robot
396*16467b97STreehugger Robot// shift_expression
397*16467b97STreehugger Robot// 	: additive_expression (('<<'|'>>') additive_expression)*
398*16467b97STreehugger Robot// 	;
399*16467b97STreehugger Robot
400*16467b97STreehugger Robot// // S t a t e m e n t s
401*16467b97STreehugger Robot
402*16467b97STreehugger Robot// statement
403*16467b97STreehugger Robot// 	: labeled_statement
404*16467b97STreehugger Robot// 	| compound_statement
405*16467b97STreehugger Robot// 	| expression_statement
406*16467b97STreehugger Robot// 	| selection_statement
407*16467b97STreehugger Robot// 	| iteration_statement
408*16467b97STreehugger Robot// 	| jump_statement
409*16467b97STreehugger Robot// 	;
410*16467b97STreehugger Robot
411*16467b97STreehugger Robot// labeled_statement
412*16467b97STreehugger Robot// 	: IDENTIFIER ':' statement
413*16467b97STreehugger Robot// 	| 'case' constant_expression ':' statement
414*16467b97STreehugger Robot// 	| 'default' ':' statement
415*16467b97STreehugger Robot// 	;
416*16467b97STreehugger Robot
417*16467b97STreehugger Robot// compound_statement
418*16467b97STreehugger Robot// scope Symbols; // blocks have a scope of symbols
419*16467b97STreehugger Robot// @init {
420*16467b97STreehugger Robot//   $Symbols::types = {}
421*16467b97STreehugger Robot// }
422*16467b97STreehugger Robot// 	: '{' declaration* statement_list? '}'
423*16467b97STreehugger Robot// 	;
424*16467b97STreehugger Robot
425*16467b97STreehugger Robot// statement_list
426*16467b97STreehugger Robot// 	: statement+
427*16467b97STreehugger Robot// 	;
428*16467b97STreehugger Robot
429*16467b97STreehugger Robot// expression_statement
430*16467b97STreehugger Robot// 	: ';'
431*16467b97STreehugger Robot// 	| expression ';'
432*16467b97STreehugger Robot// 	;
433*16467b97STreehugger Robot
434*16467b97STreehugger Robot// selection_statement
435*16467b97STreehugger Robot// 	: 'if' '(' expression ')' statement (options {k=1; backtrack=false;}:'else' statement)?
436*16467b97STreehugger Robot// 	| 'switch' '(' expression ')' statement
437*16467b97STreehugger Robot// 	;
438*16467b97STreehugger Robot
439*16467b97STreehugger Robot// iteration_statement
440*16467b97STreehugger Robot// 	: 'while' '(' expression ')' statement
441*16467b97STreehugger Robot// 	| 'do' statement 'while' '(' expression ')' ';'
442*16467b97STreehugger Robot// 	| 'for' '(' expression_statement expression_statement expression? ')' statement
443*16467b97STreehugger Robot// 	;
444*16467b97STreehugger Robot
445*16467b97STreehugger Robot// jump_statement
446*16467b97STreehugger Robot// 	: 'goto' IDENTIFIER ';'
447*16467b97STreehugger Robot// 	| 'continue' ';'
448*16467b97STreehugger Robot// 	| 'break' ';'
449*16467b97STreehugger Robot// 	| 'return' ';'
450*16467b97STreehugger Robot// 	| 'return' expression ';'
451*16467b97STreehugger Robot// 	;
452*16467b97STreehugger Robot
453*16467b97STreehugger RobotIDENTIFIER
454*16467b97STreehugger Robot	:	LETTER (LETTER|'0'..'9')*
455*16467b97STreehugger Robot	;
456*16467b97STreehugger Robot
457*16467b97STreehugger Robotfragment
458*16467b97STreehugger RobotLETTER
459*16467b97STreehugger Robot	:	'$'
460*16467b97STreehugger Robot	|	'A'..'Z'
461*16467b97STreehugger Robot	|	'a'..'z'
462*16467b97STreehugger Robot	|	'_'
463*16467b97STreehugger Robot	;
464*16467b97STreehugger Robot
465*16467b97STreehugger RobotCHARACTER_LITERAL
466*16467b97STreehugger Robot    :   '\'' ( EscapeSequence | ~('\''|'\\') ) '\''
467*16467b97STreehugger Robot    ;
468*16467b97STreehugger Robot
469*16467b97STreehugger RobotSTRING_LITERAL
470*16467b97STreehugger Robot    :  '"' ( EscapeSequence | ~('\\'|'"') )* '"'
471*16467b97STreehugger Robot    ;
472*16467b97STreehugger Robot
473*16467b97STreehugger RobotHEX_LITERAL : '0' ('x'|'X') HexDigit+ IntegerTypeSuffix? ;
474*16467b97STreehugger Robot
475*16467b97STreehugger RobotDECIMAL_LITERAL : ('0' | '1'..'9' '0'..'9'*) IntegerTypeSuffix? ;
476*16467b97STreehugger Robot
477*16467b97STreehugger RobotOCTAL_LITERAL : '0' ('0'..'7')+ IntegerTypeSuffix? ;
478*16467b97STreehugger Robot
479*16467b97STreehugger Robotfragment
480*16467b97STreehugger RobotHexDigit : ('0'..'9'|'a'..'f'|'A'..'F') ;
481*16467b97STreehugger Robot
482*16467b97STreehugger Robotfragment
483*16467b97STreehugger RobotIntegerTypeSuffix
484*16467b97STreehugger Robot	:	('u'|'U')? ('l'|'L')
485*16467b97STreehugger Robot	|	('u'|'U')  ('l'|'L')?
486*16467b97STreehugger Robot	;
487*16467b97STreehugger Robot
488*16467b97STreehugger RobotFLOATING_POINT_LITERAL
489*16467b97STreehugger Robot    :   ('0'..'9')+ '.' ('0'..'9')* Exponent? FloatTypeSuffix?
490*16467b97STreehugger Robot    |   '.' ('0'..'9')+ Exponent? FloatTypeSuffix?
491*16467b97STreehugger Robot    |   ('0'..'9')+ Exponent FloatTypeSuffix?
492*16467b97STreehugger Robot    |   ('0'..'9')+ Exponent? FloatTypeSuffix
493*16467b97STreehugger Robot	;
494*16467b97STreehugger Robot
495*16467b97STreehugger Robotfragment
496*16467b97STreehugger RobotExponent : ('e'|'E') ('+'|'-')? ('0'..'9')+ ;
497*16467b97STreehugger Robot
498*16467b97STreehugger Robotfragment
499*16467b97STreehugger RobotFloatTypeSuffix : ('f'|'F'|'d'|'D') ;
500*16467b97STreehugger Robot
501*16467b97STreehugger Robotfragment
502*16467b97STreehugger RobotEscapeSequence
503*16467b97STreehugger Robot    :   '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
504*16467b97STreehugger Robot    |   OctalEscape
505*16467b97STreehugger Robot    ;
506*16467b97STreehugger Robot
507*16467b97STreehugger Robotfragment
508*16467b97STreehugger RobotOctalEscape
509*16467b97STreehugger Robot    :   '\\' ('0'..'3') ('0'..'7') ('0'..'7')
510*16467b97STreehugger Robot    |   '\\' ('0'..'7') ('0'..'7')
511*16467b97STreehugger Robot    |   '\\' ('0'..'7')
512*16467b97STreehugger Robot    ;
513*16467b97STreehugger Robot
514*16467b97STreehugger Robotfragment
515*16467b97STreehugger RobotUnicodeEscape
516*16467b97STreehugger Robot    :   '\\' 'u' HexDigit HexDigit HexDigit HexDigit
517*16467b97STreehugger Robot    ;
518*16467b97STreehugger Robot
519*16467b97STreehugger RobotWS  :  (' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;}
520*16467b97STreehugger Robot    ;
521*16467b97STreehugger Robot
522*16467b97STreehugger RobotCOMMENT
523*16467b97STreehugger Robot    :   '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}
524*16467b97STreehugger Robot    ;
525*16467b97STreehugger Robot
526*16467b97STreehugger RobotLINE_COMMENT
527*16467b97STreehugger Robot    : '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
528*16467b97STreehugger Robot    ;
529*16467b97STreehugger Robot
530*16467b97STreehugger Robot// ignore #line info for now
531*16467b97STreehugger RobotLINE_COMMAND
532*16467b97STreehugger Robot    : '#' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
533*16467b97STreehugger Robot    ;
534*16467b97STreehugger Robot
535