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