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