1 /* @file 2 This file is used to be the grammar file of ECC tool 3 4 Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR> 5 This program and the accompanying materials 6 are licensed and made available under the terms and conditions of the BSD License 7 which accompanies this distribution. The full text of the license may be found at 8 http://opensource.org/licenses/bsd-license.php 9 10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12 */ 13 14 grammar C; 15 options { 16 language=Python; 17 backtrack=true; 18 memoize=true; 19 k=2; 20 } 21 22 @lexer::header{ 23 ## @file 24 # The file defines the Lexer for C source files. 25 # 26 # THIS FILE IS AUTO-GENENERATED. PLEASE DON NOT MODIFY THIS FILE. 27 # This file is generated by running: 28 # java org.antlr.Tool C.g 29 # 30 # Copyright (c) 2009 - 2010, Intel Corporation All rights reserved. 31 # 32 # This program and the accompanying materials are licensed and made available 33 # under the terms and conditions of the BSD License which accompanies this 34 # distribution. The full text of the license may be found at: 35 # http://opensource.org/licenses/bsd-license.php 36 # 37 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 38 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 39 # 40 ## 41 } 42 43 @header { 44 ## @file 45 # The file defines the parser for C source files. 46 # 47 # THIS FILE IS AUTO-GENENERATED. PLEASE DON NOT MODIFY THIS FILE. 48 # This file is generated by running: 49 # java org.antlr.Tool C.g 50 # 51 # Copyright (c) 2009 - 2010, Intel Corporation All rights reserved. 52 # 53 # This program and the accompanying materials are licensed and made available 54 # under the terms and conditions of the BSD License which accompanies this 55 # distribution. The full text of the license may be found at: 56 # http://opensource.org/licenses/bsd-license.php 57 # 58 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 59 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 60 # 61 ## 62 63 import CodeFragment 64 import FileProfile 65 } 66 67 @members { 68 69 def printTokenInfo(self, line, offset, tokenText): 70 print str(line)+ ',' + str(offset) + ':' + str(tokenText) 71 72 def StorePredicateExpression(self, StartLine, StartOffset, EndLine, EndOffset, Text): 73 PredExp = CodeFragment.PredicateExpression(Text, (StartLine, StartOffset), (EndLine, EndOffset)) 74 FileProfile.PredicateExpressionList.append(PredExp) 75 76 def StoreEnumerationDefinition(self, StartLine, StartOffset, EndLine, EndOffset, Text): 77 EnumDef = CodeFragment.EnumerationDefinition(Text, (StartLine, StartOffset), (EndLine, EndOffset)) 78 FileProfile.EnumerationDefinitionList.append(EnumDef) 79 80 def StoreStructUnionDefinition(self, StartLine, StartOffset, EndLine, EndOffset, Text): 81 SUDef = CodeFragment.StructUnionDefinition(Text, (StartLine, StartOffset), (EndLine, EndOffset)) 82 FileProfile.StructUnionDefinitionList.append(SUDef) 83 84 def StoreTypedefDefinition(self, StartLine, StartOffset, EndLine, EndOffset, FromText, ToText): 85 Tdef = CodeFragment.TypedefDefinition(FromText, ToText, (StartLine, StartOffset), (EndLine, EndOffset)) 86 FileProfile.TypedefDefinitionList.append(Tdef) 87 88 def StoreFunctionDefinition(self, StartLine, StartOffset, EndLine, EndOffset, ModifierText, DeclText, LeftBraceLine, LeftBraceOffset, DeclLine, DeclOffset): 89 FuncDef = CodeFragment.FunctionDefinition(ModifierText, DeclText, (StartLine, StartOffset), (EndLine, EndOffset), (LeftBraceLine, LeftBraceOffset), (DeclLine, DeclOffset)) 90 FileProfile.FunctionDefinitionList.append(FuncDef) 91 92 def StoreVariableDeclaration(self, StartLine, StartOffset, EndLine, EndOffset, ModifierText, DeclText): 93 VarDecl = CodeFragment.VariableDeclaration(ModifierText, DeclText, (StartLine, StartOffset), (EndLine, EndOffset)) 94 FileProfile.VariableDeclarationList.append(VarDecl) 95 96 def StoreFunctionCalling(self, StartLine, StartOffset, EndLine, EndOffset, FuncName, ParamList): 97 FuncCall = CodeFragment.FunctionCalling(FuncName, ParamList, (StartLine, StartOffset), (EndLine, EndOffset)) 98 FileProfile.FunctionCallingList.append(FuncCall) 99 100 } 101 102 translation_unit 103 : external_declaration* 104 ; 105 106 107 /*function_declaration 108 @after{ 109 print $function_declaration.text 110 } 111 : declaration_specifiers IDENTIFIER '(' parameter_list ')' ';' 112 ; 113 */ 114 external_declaration 115 options {k=1;} 116 /*@after{ 117 print $external_declaration.text 118 }*/ 119 : ( declaration_specifiers? declarator declaration* '{' )=> function_definition 120 | declaration 121 | macro_statement (';')? 122 ; 123 124 125 126 function_definition 127 scope { 128 ModifierText; 129 DeclText; 130 LBLine; 131 LBOffset; 132 DeclLine; 133 DeclOffset; 134 } 135 @init { 136 $function_definition::ModifierText = ''; 137 $function_definition::DeclText = ''; 138 $function_definition::LBLine = 0; 139 $function_definition::LBOffset = 0; 140 $function_definition::DeclLine = 0; 141 $function_definition::DeclOffset = 0; 142 } 143 @after{ 144 self.StoreFunctionDefinition($function_definition.start.line, $function_definition.start.charPositionInLine, $function_definition.stop.line, $function_definition.stop.charPositionInLine, $function_definition::ModifierText, $function_definition::DeclText, $function_definition::LBLine, $function_definition::LBOffset, $function_definition::DeclLine, $function_definition::DeclOffset) 145 } 146 : d=declaration_specifiers? declarator 147 ( declaration+ a=compound_statement // K&R style 148 | b=compound_statement // ANSI style 149 ) { 150 if d != None: 151 $function_definition::ModifierText = $declaration_specifiers.text 152 else: 153 $function_definition::ModifierText = '' 154 $function_definition::DeclText = $declarator.text 155 $function_definition::DeclLine = $declarator.start.line 156 $function_definition::DeclOffset = $declarator.start.charPositionInLine 157 if a != None: 158 $function_definition::LBLine = $a.start.line 159 $function_definition::LBOffset = $a.start.charPositionInLine 160 else: 161 $function_definition::LBLine = $b.start.line 162 $function_definition::LBOffset = $b.start.charPositionInLine 163 } 164 ; 165 166 declaration 167 : a='typedef' b=declaration_specifiers? 168 c=init_declarator_list d=';' 169 { 170 if b != None: 171 self.StoreTypedefDefinition($a.line, $a.charPositionInLine, $d.line, $d.charPositionInLine, $b.text, $c.text) 172 else: 173 self.StoreTypedefDefinition($a.line, $a.charPositionInLine, $d.line, $d.charPositionInLine, '', $c.text) 174 } 175 | s=declaration_specifiers t=init_declarator_list? e=';' 176 { 177 if t != None: 178 self.StoreVariableDeclaration($s.start.line, $s.start.charPositionInLine, $t.start.line, $t.start.charPositionInLine, $s.text, $t.text) 179 } 180 ; 181 182 declaration_specifiers 183 : ( storage_class_specifier 184 | type_specifier 185 | type_qualifier 186 )+ 187 ; 188 189 init_declarator_list 190 : init_declarator (',' init_declarator)* 191 ; 192 193 init_declarator 194 : declarator ('=' initializer)? 195 ; 196 197 storage_class_specifier 198 : 'extern' 199 | 'static' 200 | 'auto' 201 | 'register' 202 | 'STATIC' 203 ; 204 205 type_specifier 206 : 'void' 207 | 'char' 208 | 'short' 209 | 'int' 210 | 'long' 211 | 'float' 212 | 'double' 213 | 'signed' 214 | 'unsigned' 215 | s=struct_or_union_specifier 216 { 217 if s.stop != None: 218 self.StoreStructUnionDefinition($s.start.line, $s.start.charPositionInLine, $s.stop.line, $s.stop.charPositionInLine, $s.text) 219 } 220 | e=enum_specifier 221 { 222 if e.stop != None: 223 self.StoreEnumerationDefinition($e.start.line, $e.start.charPositionInLine, $e.stop.line, $e.stop.charPositionInLine, $e.text) 224 } 225 | (IDENTIFIER type_qualifier* declarator)=> type_id 226 ; 227 228 type_id 229 : IDENTIFIER 230 //{self.printTokenInfo($a.line, $a.pos, $a.text)} 231 ; 232 233 struct_or_union_specifier 234 options {k=3;} 235 : struct_or_union IDENTIFIER? '{' struct_declaration_list '}' 236 | struct_or_union IDENTIFIER 237 ; 238 239 struct_or_union 240 : 'struct' 241 | 'union' 242 ; 243 244 struct_declaration_list 245 : struct_declaration+ 246 ; 247 248 struct_declaration 249 : specifier_qualifier_list struct_declarator_list ';' 250 ; 251 252 specifier_qualifier_list 253 : ( type_qualifier | type_specifier )+ 254 ; 255 256 struct_declarator_list 257 : struct_declarator (',' struct_declarator)* 258 ; 259 260 struct_declarator 261 : declarator (':' constant_expression)? 262 | ':' constant_expression 263 ; 264 265 enum_specifier 266 options {k=3;} 267 : 'enum' '{' enumerator_list ','? '}' 268 | 'enum' IDENTIFIER '{' enumerator_list ','? '}' 269 | 'enum' IDENTIFIER 270 ; 271 272 enumerator_list 273 : enumerator (',' enumerator)* 274 ; 275 276 enumerator 277 : IDENTIFIER ('=' constant_expression)? 278 ; 279 280 type_qualifier 281 : 'const' 282 | 'volatile' 283 | 'IN' 284 | 'OUT' 285 | 'OPTIONAL' 286 | 'CONST' 287 | 'UNALIGNED' 288 | 'VOLATILE' 289 | 'GLOBAL_REMOVE_IF_UNREFERENCED' 290 | 'EFIAPI' 291 | 'EFI_BOOTSERVICE' 292 | 'EFI_RUNTIMESERVICE' 293 | 'PACKED' 294 ; 295 296 declarator 297 : pointer? ('EFIAPI')? ('EFI_BOOTSERVICE')? ('EFI_RUNTIMESERVICE')? direct_declarator 298 // | ('EFIAPI')? ('EFI_BOOTSERVICE')? ('EFI_RUNTIMESERVICE')? pointer? direct_declarator 299 | pointer 300 ; 301 302 direct_declarator 303 : IDENTIFIER declarator_suffix* 304 | '(' ('EFIAPI')? declarator ')' declarator_suffix+ 305 ; 306 307 declarator_suffix 308 : '[' constant_expression ']' 309 | '[' ']' 310 | '(' parameter_type_list ')' 311 | '(' identifier_list ')' 312 | '(' ')' 313 ; 314 315 pointer 316 : '*' type_qualifier+ pointer? 317 | '*' pointer 318 | '*' 319 ; 320 321 parameter_type_list 322 : parameter_list (',' ('OPTIONAL')? '...')? 323 ; 324 325 parameter_list 326 : parameter_declaration (',' ('OPTIONAL')? parameter_declaration)* 327 ; 328 329 parameter_declaration 330 : declaration_specifiers (declarator|abstract_declarator)* ('OPTIONAL')? 331 //accomerdate user-defined type only, no declarator follow. 332 | pointer* IDENTIFIER 333 ; 334 335 identifier_list 336 : IDENTIFIER 337 (',' IDENTIFIER)* 338 ; 339 340 type_name 341 : specifier_qualifier_list abstract_declarator? 342 | type_id 343 ; 344 345 abstract_declarator 346 : pointer direct_abstract_declarator? 347 | direct_abstract_declarator 348 ; 349 350 direct_abstract_declarator 351 : ( '(' abstract_declarator ')' | abstract_declarator_suffix ) abstract_declarator_suffix* 352 ; 353 354 abstract_declarator_suffix 355 : '[' ']' 356 | '[' constant_expression ']' 357 | '(' ')' 358 | '(' parameter_type_list ')' 359 ; 360 361 initializer 362 363 : assignment_expression 364 | '{' initializer_list ','? '}' 365 ; 366 367 initializer_list 368 : initializer (',' initializer )* 369 ; 370 371 // E x p r e s s i o n s 372 373 argument_expression_list 374 : assignment_expression ('OPTIONAL')? (',' assignment_expression ('OPTIONAL')?)* 375 ; 376 377 additive_expression 378 : (multiplicative_expression) ('+' multiplicative_expression | '-' multiplicative_expression)* 379 ; 380 381 multiplicative_expression 382 : (cast_expression) ('*' cast_expression | '/' cast_expression | '%' cast_expression)* 383 ; 384 385 cast_expression 386 : '(' type_name ')' cast_expression 387 | unary_expression 388 ; 389 390 unary_expression 391 : postfix_expression 392 | '++' unary_expression 393 | '--' unary_expression 394 | unary_operator cast_expression 395 | 'sizeof' unary_expression 396 | 'sizeof' '(' type_name ')' 397 ; 398 399 postfix_expression 400 scope { 401 FuncCallText; 402 } 403 @init { 404 $postfix_expression::FuncCallText = ''; 405 } 406 : p=primary_expression {$postfix_expression::FuncCallText += $p.text} 407 ( '[' expression ']' 408 | '(' a=')'{self.StoreFunctionCalling($p.start.line, $p.start.charPositionInLine, $a.line, $a.charPositionInLine, $postfix_expression::FuncCallText, '')} 409 | '(' c=argument_expression_list b=')' {self.StoreFunctionCalling($p.start.line, $p.start.charPositionInLine, $b.line, $b.charPositionInLine, $postfix_expression::FuncCallText, $c.text)} 410 | '(' macro_parameter_list ')' 411 | '.' x=IDENTIFIER {$postfix_expression::FuncCallText += '.' + $x.text} 412 | '*' y=IDENTIFIER {$postfix_expression::FuncCallText = $y.text} 413 | '->' z=IDENTIFIER {$postfix_expression::FuncCallText += '->' + $z.text} 414 | '++' 415 | '--' 416 )* 417 ; 418 419 macro_parameter_list 420 : parameter_declaration (',' parameter_declaration)* 421 ; 422 423 unary_operator 424 : '&' 425 | '*' 426 | '+' 427 | '-' 428 | '~' 429 | '!' 430 ; 431 432 primary_expression 433 : IDENTIFIER 434 | constant 435 | '(' expression ')' 436 ; 437 438 constant 439 : HEX_LITERAL 440 | OCTAL_LITERAL 441 | DECIMAL_LITERAL 442 | CHARACTER_LITERAL 443 | (IDENTIFIER* STRING_LITERAL+)+ IDENTIFIER* 444 | FLOATING_POINT_LITERAL 445 ; 446 447 ///// 448 449 expression 450 : assignment_expression (',' assignment_expression)* 451 ; 452 453 constant_expression 454 : conditional_expression 455 ; 456 457 assignment_expression 458 : lvalue assignment_operator assignment_expression 459 | conditional_expression 460 ; 461 462 lvalue 463 : unary_expression 464 ; 465 466 assignment_operator 467 : '=' 468 | '*=' 469 | '/=' 470 | '%=' 471 | '+=' 472 | '-=' 473 | '<<=' 474 | '>>=' 475 | '&=' 476 | '^=' 477 | '|=' 478 ; 479 480 conditional_expression 481 : e=logical_or_expression ('?' expression ':' conditional_expression {self.StorePredicateExpression($e.start.line, $e.start.charPositionInLine, $e.stop.line, $e.stop.charPositionInLine, $e.text)})? 482 ; 483 484 logical_or_expression 485 : logical_and_expression ('||' logical_and_expression)* 486 ; 487 488 logical_and_expression 489 : inclusive_or_expression ('&&' inclusive_or_expression)* 490 ; 491 492 inclusive_or_expression 493 : exclusive_or_expression ('|' exclusive_or_expression)* 494 ; 495 496 exclusive_or_expression 497 : and_expression ('^' and_expression)* 498 ; 499 500 and_expression 501 : equality_expression ('&' equality_expression)* 502 ; 503 equality_expression 504 : relational_expression (('=='|'!=') relational_expression )* 505 ; 506 507 relational_expression 508 : shift_expression (('<'|'>'|'<='|'>=') shift_expression)* 509 ; 510 511 shift_expression 512 : additive_expression (('<<'|'>>') additive_expression)* 513 ; 514 515 // S t a t e m e n t s 516 517 statement 518 : labeled_statement 519 | compound_statement 520 | expression_statement 521 | selection_statement 522 | iteration_statement 523 | jump_statement 524 | macro_statement 525 | asm2_statement 526 | asm1_statement 527 | asm_statement 528 | declaration 529 ; 530 531 asm2_statement 532 : '__asm__'? IDENTIFIER '(' (~(';'))* ')' ';' 533 ; 534 535 asm1_statement 536 : '_asm' '{' (~('}'))* '}' 537 ; 538 539 asm_statement 540 : '__asm' '{' (~('}'))* '}' 541 ; 542 543 macro_statement 544 : IDENTIFIER '(' declaration* statement_list? expression? ')' 545 ; 546 547 labeled_statement 548 : IDENTIFIER ':' statement 549 | 'case' constant_expression ':' statement 550 | 'default' ':' statement 551 ; 552 553 compound_statement 554 : '{' declaration* statement_list? '}' 555 ; 556 557 statement_list 558 : statement+ 559 ; 560 561 expression_statement 562 : ';' 563 | expression ';' 564 ; 565 566 selection_statement 567 : 'if' '(' e=expression ')' {self.StorePredicateExpression($e.start.line, $e.start.charPositionInLine, $e.stop.line, $e.stop.charPositionInLine, $e.text)} statement (options {k=1; backtrack=false;}:'else' statement)? 568 | 'switch' '(' expression ')' statement 569 ; 570 571 iteration_statement 572 : 'while' '(' e=expression ')' statement {self.StorePredicateExpression($e.start.line, $e.start.charPositionInLine, $e.stop.line, $e.stop.charPositionInLine, $e.text)} 573 | 'do' statement 'while' '(' e=expression ')' ';' {self.StorePredicateExpression($e.start.line, $e.start.charPositionInLine, $e.stop.line, $e.stop.charPositionInLine, $e.text)} 574 | 'for' '(' expression_statement e=expression_statement expression? ')' statement {self.StorePredicateExpression($e.start.line, $e.start.charPositionInLine, $e.stop.line, $e.stop.charPositionInLine, $e.text)} 575 ; 576 577 jump_statement 578 : 'goto' IDENTIFIER ';' 579 | 'continue' ';' 580 | 'break' ';' 581 | 'return' ';' 582 | 'return' expression ';' 583 ; 584 585 IDENTIFIER 586 : LETTER (LETTER|'0'..'9')* 587 ; 588 589 fragment 590 LETTER 591 : '$' 592 | 'A'..'Z' 593 | 'a'..'z' 594 | '_' 595 ; 596 597 CHARACTER_LITERAL 598 : ('L')? '\'' ( EscapeSequence | ~('\''|'\\') ) '\'' 599 ; 600 601 STRING_LITERAL 602 : ('L')? '"' ( EscapeSequence | ~('\\'|'"') )* '"' 603 ; 604 605 HEX_LITERAL : '0' ('x'|'X') HexDigit+ IntegerTypeSuffix? ; 606 607 DECIMAL_LITERAL : ('0' | '1'..'9' '0'..'9'*) IntegerTypeSuffix? ; 608 609 OCTAL_LITERAL : '0' ('0'..'7')+ IntegerTypeSuffix? ; 610 611 fragment 612 HexDigit : ('0'..'9'|'a'..'f'|'A'..'F') ; 613 614 fragment 615 IntegerTypeSuffix 616 : ('u'|'U') 617 | ('l'|'L') 618 | ('u'|'U') ('l'|'L') 619 | ('u'|'U') ('l'|'L') ('l'|'L') 620 ; 621 622 FLOATING_POINT_LITERAL 623 : ('0'..'9')+ '.' ('0'..'9')* Exponent? FloatTypeSuffix? 624 | '.' ('0'..'9')+ Exponent? FloatTypeSuffix? 625 | ('0'..'9')+ Exponent FloatTypeSuffix? 626 | ('0'..'9')+ Exponent? FloatTypeSuffix 627 ; 628 629 fragment 630 Exponent : ('e'|'E') ('+'|'-')? ('0'..'9')+ ; 631 632 fragment 633 FloatTypeSuffix : ('f'|'F'|'d'|'D') ; 634 635 fragment 636 EscapeSequence 637 : '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\') 638 | OctalEscape 639 ; 640 641 fragment 642 OctalEscape 643 : '\\' ('0'..'3') ('0'..'7') ('0'..'7') 644 | '\\' ('0'..'7') ('0'..'7') 645 | '\\' ('0'..'7') 646 ; 647 648 fragment 649 UnicodeEscape 650 : '\\' 'u' HexDigit HexDigit HexDigit HexDigit 651 ; 652 653 WS : (' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;} 654 ; 655 656 // ingore '\' of line concatenation 657 BS : ('\\') {$channel=HIDDEN;} 658 ; 659 660 // ingore function modifiers 661 //FUNC_MODIFIERS : 'EFIAPI' {$channel=HIDDEN;} 662 // ; 663 664 UnicodeVocabulary 665 : '\u0003'..'\uFFFE' 666 ; 667 COMMENT 668 : '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;} 669 ; 670 671 672 LINE_COMMENT 673 : '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;} 674 ; 675 676 // ignore #line info for now 677 LINE_COMMAND 678 : '#' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;} 679 ; 680