From f215e02bf85f68d3a6106c2a1f4f7f063f819064 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Thu, 11 Apr 2024 10:17:27 +0200 Subject: Adding upstream version 7.0.14-dfsg. Signed-off-by: Daniel Baumann --- .../BaseTools/Source/Python/Ecc/CParser4/C.g4 | 631 +++++++++++++++++++++ 1 file changed, 631 insertions(+) create mode 100644 src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/CParser4/C.g4 (limited to 'src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/CParser4/C.g4') diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/CParser4/C.g4 b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/CParser4/C.g4 new file mode 100644 index 00000000..ffc5c121 --- /dev/null +++ b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/CParser4/C.g4 @@ -0,0 +1,631 @@ +/* @file + This file is used to be the grammar file of ECC tool + + Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +*/ + + +grammar C; +options { + language=Python; +} + + +@header { +## @file +# The file defines the parser for C source files. +# +# THIS FILE IS AUTO-GENENERATED. PLEASE DON NOT MODIFY THIS FILE. +# This file is generated by running: +# java org.antlr.Tool C.g +# +# Copyright (c) 2009 - 2010, Intel Corporation All rights reserved. +# +# This program and the accompanying materials are licensed and made available +# under the terms and conditions of the BSD License which accompanies this +# distribution. The full text of the license may be found at: +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +## + +import Ecc.CodeFragment as CodeFragment +import Ecc.FileProfile as FileProfile +} + +@members { + +def printTokenInfo(self, line, offset, tokenText): + print(str(line)+ ',' + str(offset) + ':' + str(tokenText)) + +def StorePredicateExpression(self, StartLine, StartOffset, EndLine, EndOffset, Text): + PredExp = CodeFragment.PredicateExpression(Text, (StartLine, StartOffset), (EndLine, EndOffset)) + FileProfile.PredicateExpressionList.append(PredExp) + +def StoreEnumerationDefinition(self, StartLine, StartOffset, EndLine, EndOffset, Text): + EnumDef = CodeFragment.EnumerationDefinition(Text, (StartLine, StartOffset), (EndLine, EndOffset)) + FileProfile.EnumerationDefinitionList.append(EnumDef) + +def StoreStructUnionDefinition(self, StartLine, StartOffset, EndLine, EndOffset, Text): + SUDef = CodeFragment.StructUnionDefinition(Text, (StartLine, StartOffset), (EndLine, EndOffset)) + FileProfile.StructUnionDefinitionList.append(SUDef) + +def StoreTypedefDefinition(self, StartLine, StartOffset, EndLine, EndOffset, FromText, ToText): + Tdef = CodeFragment.TypedefDefinition(FromText, ToText, (StartLine, StartOffset), (EndLine, EndOffset)) + FileProfile.TypedefDefinitionList.append(Tdef) + +def StoreFunctionDefinition(self, StartLine, StartOffset, EndLine, EndOffset, ModifierText, DeclText, LeftBraceLine, LeftBraceOffset, DeclLine, DeclOffset): + FuncDef = CodeFragment.FunctionDefinition(ModifierText, DeclText, (StartLine, StartOffset), (EndLine, EndOffset), (LeftBraceLine, LeftBraceOffset), (DeclLine, DeclOffset)) + FileProfile.FunctionDefinitionList.append(FuncDef) + +def StoreVariableDeclaration(self, StartLine, StartOffset, EndLine, EndOffset, ModifierText, DeclText): + VarDecl = CodeFragment.VariableDeclaration(ModifierText, DeclText, (StartLine, StartOffset), (EndLine, EndOffset)) + FileProfile.VariableDeclarationList.append(VarDecl) + +def StoreFunctionCalling(self, StartLine, StartOffset, EndLine, EndOffset, FuncName, ParamList): + FuncCall = CodeFragment.FunctionCalling(FuncName, ParamList, (StartLine, StartOffset), (EndLine, EndOffset)) + FileProfile.FunctionCallingList.append(FuncCall) + +} + +translation_unit + : external_declaration* + ; + + +external_declaration + : ( declaration_specifiers? declarator declaration* '{' ) + | function_definition + | declaration + | macro_statement (';')? + ; + +function_definition +locals [String ModifierText = '', String DeclText = '', int LBLine = 0, int LBOffset = 0, int DeclLine = 0, int DeclOffset = 0] +@init { +ModifierText = ''; +DeclText = ''; +LBLine = 0; +LBOffset = 0; +DeclLine = 0; +DeclOffset = 0; +} +@after{ +self.StoreFunctionDefinition(localctx.start.line, localctx.start.column, localctx.stop.line, localctx.stop.column, ModifierText, DeclText, LBLine, LBOffset, DeclLine, DeclOffset) +} + : d=declaration_specifiers? declarator + ( declaration+ a=compound_statement // K&R style + | b=compound_statement // ANSI style + ) { +if localctx.d != None: + ModifierText = $declaration_specifiers.text +else: + ModifierText = '' +DeclText = $declarator.text +DeclLine = $declarator.start.line +DeclOffset = $declarator.start.column +if localctx.a != None: + LBLine = $a.start.line + LBOffset = $a.start.column +else: + LBLine = $b.start.line + LBOffset = $b.start.column + } + ; + + +declaration_specifiers + : ( storage_class_specifier + | type_specifier + | type_qualifier + )+ + ; + +declaration + : a='typedef' b=declaration_specifiers? c=init_declarator_list d=';' + { +if localctx.b is not None: + self.StoreTypedefDefinition(localctx.a.line, localctx.a.column, $d.line, localctx.d.column, $b.text, $c.text) +else: + self.StoreTypedefDefinition(localctx.a.line, localctx.a.column, $d.line, localctx.d.column, '', $c.text) + } + | s=declaration_specifiers t=init_declarator_list? e=';' + { +if localctx.t is not None: + self.StoreVariableDeclaration($s.start.line, $s.start.column, $t.start.line, $t.start.column, $s.text, $t.text) +} + ; + +init_declarator_list + : init_declarator (',' init_declarator)* + ; + +init_declarator + : declarator ('=' initializer)? + ; + +storage_class_specifier + : 'extern' + | 'static' + | 'auto' + | 'register' + | 'STATIC' + ; + +type_specifier + : 'void' + | 'char' + | 'short' + | 'int' + | 'long' + | 'float' + | 'double' + | 'signed' + | 'unsigned' + | s=struct_or_union_specifier + { +if localctx.s.stop is not None: + self.StoreStructUnionDefinition($s.start.line, $s.start.column, $s.stop.line, $s.stop.column, $s.text) +} + | e=enum_specifier + { +if localctx.e.stop is not None: + self.StoreEnumerationDefinition($e.start.line, $e.start.column, $e.stop.line, $e.stop.column, $e.text) +} + | (IDENTIFIER type_qualifier* declarator) + | type_id + ; + +type_id + : IDENTIFIER + //{self.printTokenInfo($a.line, $a.pos, $a.text)} + ; + +struct_or_union_specifier + : struct_or_union IDENTIFIER? '{' struct_declaration_list '}' + | struct_or_union IDENTIFIER + ; + +struct_or_union + : 'struct' + | 'union' + ; + +struct_declaration_list + : struct_declaration+ + ; + +struct_declaration + : specifier_qualifier_list struct_declarator_list ';' + ; + +specifier_qualifier_list + : ( type_qualifier | type_specifier )+ + ; + +struct_declarator_list + : struct_declarator (',' struct_declarator)* + ; + +struct_declarator + : declarator (':' constant_expression)? + | ':' constant_expression + ; + +enum_specifier + : 'enum' '{' enumerator_list ','? '}' + | 'enum' IDENTIFIER '{' enumerator_list ','? '}' + | 'enum' IDENTIFIER + ; + +enumerator_list + : enumerator (',' enumerator)* + ; + +enumerator + : IDENTIFIER ('=' constant_expression)? + ; + +type_qualifier + : 'const' + | 'volatile' + | 'IN' + | 'OUT' + | 'OPTIONAL' + | 'CONST' + | 'UNALIGNED' + | 'VOLATILE' + | 'GLOBAL_REMOVE_IF_UNREFERENCED' + | 'EFIAPI' + | 'EFI_BOOTSERVICE' + | 'EFI_RUNTIMESERVICE' + | 'PACKED' + ; + +declarator + : pointer? ('EFIAPI')? ('EFI_BOOTSERVICE')? ('EFI_RUNTIMESERVICE')? direct_declarator +// | ('EFIAPI')? ('EFI_BOOTSERVICE')? ('EFI_RUNTIMESERVICE')? pointer? direct_declarator + | pointer + ; + +direct_declarator + : IDENTIFIER declarator_suffix* + | '(' ('EFIAPI')? declarator ')' declarator_suffix+ + ; + +declarator_suffix + : '[' constant_expression ']' + | '[' ']' + | '(' parameter_type_list ')' + | '(' identifier_list ')' + | '(' ')' + ; + +pointer + : '*' type_qualifier+ pointer? + | '*' pointer + | '*' + ; + +parameter_type_list + : parameter_list (',' ('OPTIONAL')? '...')? + ; + +parameter_list + : parameter_declaration (',' ('OPTIONAL')? parameter_declaration)* + ; + +parameter_declaration + : declaration_specifiers (declarator|abstract_declarator)* ('OPTIONAL')? + //accomerdate user-defined type only, no declarator follow. + | pointer* IDENTIFIER + ; + +identifier_list + : IDENTIFIER + (',' IDENTIFIER)* + ; + +type_name + : specifier_qualifier_list abstract_declarator? + | type_id + ; + +abstract_declarator + : pointer direct_abstract_declarator? + | direct_abstract_declarator + ; + +direct_abstract_declarator + : ( '(' abstract_declarator ')' | abstract_declarator_suffix ) abstract_declarator_suffix* + ; + +abstract_declarator_suffix + : '[' ']' + | '[' constant_expression ']' + | '(' ')' + | '(' parameter_type_list ')' + ; + +initializer + + : assignment_expression + | '{' initializer_list ','? '}' + ; + +initializer_list + : initializer (',' initializer )* + ; + +// E x p r e s s i o n s + +argument_expression_list + : assignment_expression ('OPTIONAL')? (',' assignment_expression ('OPTIONAL')?)* + ; + +additive_expression + : (multiplicative_expression) ('+' multiplicative_expression | '-' multiplicative_expression)* + ; + +multiplicative_expression + : (cast_expression) ('*' cast_expression | '/' cast_expression | '%' cast_expression)* + ; + +cast_expression + : '(' type_name ')' cast_expression + | unary_expression + ; + +unary_expression + : postfix_expression + | '++' unary_expression + | '--' unary_expression + | unary_operator cast_expression + | 'sizeof' unary_expression + | 'sizeof' '(' type_name ')' + ; + +postfix_expression +locals [FuncCallText=''] +@init + { +self.FuncCallText='' + } + : p=primary_expression {self.FuncCallText += $p.text} + ( '[' expression ']' + | '(' a=')'{self.StoreFunctionCalling($p.start.line, $p.start.column, $a.line, localctx.a.column, self.FuncCallText, '')} + | '(' c=argument_expression_list b=')' {self.StoreFunctionCalling($p.start.line, $p.start.column, $b.line, localctx.b.column, self.FuncCallText, $c.text)} + | '(' macro_parameter_list ')' + | '.' x=IDENTIFIER {self.FuncCallText += '.' + $x.text} + | '*' y=IDENTIFIER {self.FuncCallText = $y.text} + | '->' z=IDENTIFIER {self.FuncCallText += '->' + $z.text} + | '++' + | '--' + )* + ; + +macro_parameter_list + : parameter_declaration (',' parameter_declaration)* + ; + +unary_operator + : '&' + | '*' + | '+' + | '-' + | '~' + | '!' + ; + +primary_expression + : IDENTIFIER + | constant + | '(' expression ')' + ; + +constant + : HEX_LITERAL + | OCTAL_LITERAL + | DECIMAL_LITERAL + | CHARACTER_LITERAL + | (IDENTIFIER* STRING_LITERAL+)+ IDENTIFIER* + | FLOATING_POINT_LITERAL + ; + +///// + +expression + : assignment_expression (',' assignment_expression)* + ; + +constant_expression + : conditional_expression + ; + +assignment_expression + : lvalue assignment_operator assignment_expression + | conditional_expression + ; + +lvalue + : unary_expression + ; + +assignment_operator + : '=' + | '*=' + | '/=' + | '%=' + | '+=' + | '-=' + | '<<=' + | '>>=' + | '&=' + | '^=' + | '|=' + ; + +conditional_expression + : e=logical_or_expression ('?' expression ':' conditional_expression {self.StorePredicateExpression($e.start.line, $e.start.column, $e.stop.line, $e.stop.column, $e.text)})? + ; + +logical_or_expression + : logical_and_expression ('||' logical_and_expression)* + ; + +logical_and_expression + : inclusive_or_expression ('&&' inclusive_or_expression)* + ; + +inclusive_or_expression + : exclusive_or_expression ('|' exclusive_or_expression)* + ; + +exclusive_or_expression + : and_expression ('^' and_expression)* + ; + +and_expression + : equality_expression ('&' equality_expression)* + ; +equality_expression + : relational_expression (('=='|'!=') relational_expression )* + ; + +relational_expression + : shift_expression (('<'|'>'|'<='|'>=') shift_expression)* + ; + +shift_expression + : additive_expression (('<<'|'>>') additive_expression)* + ; + +// S t a t e m e n t s + +statement + : labeled_statement + | compound_statement + | expression_statement + | selection_statement + | iteration_statement + | jump_statement + | macro_statement + | asm2_statement + | asm1_statement + | asm_statement + | declaration + ; + +asm2_statement + : '__asm__'? IDENTIFIER '(' (~(';'))* ')' ';' + ; + +asm1_statement + : '_asm' '{' (~('}'))* '}' + ; + +asm_statement + : '__asm' '{' (~('}'))* '}' + ; + +macro_statement + : IDENTIFIER '(' declaration* statement_list? expression? ')' + ; + +labeled_statement + : IDENTIFIER ':' statement + | 'case' constant_expression ':' statement + | 'default' ':' statement + ; + +compound_statement + : '{' declaration* statement_list? '}' + ; + +statement_list + : statement+ + ; + +expression_statement + : ';' + | expression ';' + ; + +selection_statement + : 'if' '(' e=expression ')' {self.StorePredicateExpression($e.start.line, $e.start.column, $e.stop.line, $e.stop.column, $e.text)} statement (:'else' statement)? + | 'switch' '(' expression ')' statement + ; + +iteration_statement + : 'while' '(' e=expression ')' statement {self.StorePredicateExpression($e.start.line, $e.start.column, $e.stop.line, $e.stop.column, $e.text)} + | 'do' statement 'while' '(' e=expression ')' ';' {self.StorePredicateExpression($e.start.line, $e.start.column, $e.stop.line, $e.stop.column, $e.text)} + //| 'for' '(' expression_statement e=expression_statement expression? ')' statement {self.StorePredicateExpression($e.start.line, $e.start.column, $e.stop.line, $e.stop.column, $e.text)} + ; + +jump_statement + : 'goto' IDENTIFIER ';' + | 'continue' ';' + | 'break' ';' + | 'return' ';' + | 'return' expression ';' + ; + +IDENTIFIER + : LETTER (LETTER|'0'..'9')* + ; + +fragment +LETTER + : '$' + | 'A'..'Z' + | 'a'..'z' + | '_' + ; + +CHARACTER_LITERAL + : ('L')? '\'' ( EscapeSequence | ~('\''|'\\') ) '\'' + ; + +STRING_LITERAL + : ('L')? '"' ( EscapeSequence | ~('\\'|'"') )* '"' + ; + +HEX_LITERAL : '0' ('x'|'X') HexDigit+ IntegerTypeSuffix? ; + +DECIMAL_LITERAL : ('0' | '1'..'9' '0'..'9'*) IntegerTypeSuffix? ; + +OCTAL_LITERAL : '0' ('0'..'7')+ IntegerTypeSuffix? ; + +fragment +HexDigit : ('0'..'9'|'a'..'f'|'A'..'F') ; + +fragment +IntegerTypeSuffix + : ('u'|'U') + | ('l'|'L') + | ('u'|'U') ('l'|'L') + | ('u'|'U') ('l'|'L') ('l'|'L') + ; + +FLOATING_POINT_LITERAL + : ('0'..'9')+ '.' ('0'..'9')* Exponent? FloatTypeSuffix? + | '.' ('0'..'9')+ Exponent? FloatTypeSuffix? + | ('0'..'9')+ Exponent FloatTypeSuffix? + | ('0'..'9')+ Exponent? FloatTypeSuffix + ; + +fragment +Exponent : ('e'|'E') ('+'|'-')? ('0'..'9')+ ; + +fragment +FloatTypeSuffix : ('f'|'F'|'d'|'D') ; + +fragment +EscapeSequence + : '\\' ('b'|'t'|'n'|'f'|'r'|'\''|'\\') + | OctalEscape + ; + +fragment +OctalEscape + : '\\' ('0'..'3') ('0'..'7') ('0'..'7') + | '\\' ('0'..'7') ('0'..'7') + | '\\' ('0'..'7') + ; + +fragment +UnicodeEscape + : '\\' 'u' HexDigit HexDigit HexDigit HexDigit + ; + +WS : (' '|'\r'|'\t'|'\u000C'|'\n') + -> channel(HIDDEN) + ; + +// ingore '\' of line concatenation +BS : ('\\') + -> channel(HIDDEN) + ; + +UnicodeVocabulary + : '\u0003'..'\uFFFE' + ; + +COMMENT + : '/*' .*? '*/' + -> channel(HIDDEN) + ; + +LINE_COMMENT + : '//' ~('\n'|'\r')* '\r'? '\n' + -> channel(HIDDEN) + ; + +// ignore #line info for now +LINE_COMMAND + : '#' ~('\n'|'\r')* '\r'? '\n' + -> channel(HIDDEN) + ; -- cgit v1.2.3