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