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