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