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