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