17 def printTokenInfo(self, line, offset, tokenText):
18 print str(line)+ ',' + str(offset) + ':' + str(tokenText)
20 def StorePredicateExpression(self, StartLine, StartOffset, EndLine, EndOffset, Text):
21 PredExp = CodeFragment.PredicateExpression(Text, (StartLine, StartOffset), (EndLine, EndOffset))
22 FileProfile.PredicateExpressionList.append(PredExp)
24 def StoreEnumerationDefinition(self, StartLine, StartOffset, EndLine, EndOffset, Text):
25 EnumDef = CodeFragment.EnumerationDefinition(Text, (StartLine, StartOffset), (EndLine, EndOffset))
26 FileProfile.EnumerationDefinitionList.append(EnumDef)
28 def StoreStructUnionDefinition(self, StartLine, StartOffset, EndLine, EndOffset, Text):
29 SUDef = CodeFragment.StructUnionDefinition(Text, (StartLine, StartOffset), (EndLine, EndOffset))
30 FileProfile.StructUnionDefinitionList.append(SUDef)
32 def StoreTypedefDefinition(self, StartLine, StartOffset, EndLine, EndOffset, FromText, ToText):
33 Tdef = CodeFragment.TypedefDefinition(FromText, ToText, (StartLine, StartOffset), (EndLine, EndOffset))
34 FileProfile.TypedefDefinitionList.append(Tdef)
36 def StoreFunctionDefinition(self, StartLine, StartOffset, EndLine, EndOffset, ModifierText, DeclText, LeftBraceLine, LeftBraceOffset, DeclLine, DeclOffset):
37 FuncDef = CodeFragment.FunctionDefinition(ModifierText, DeclText, (StartLine, StartOffset), (EndLine, EndOffset), (LeftBraceLine, LeftBraceOffset), (DeclLine, DeclOffset))
38 FileProfile.FunctionDefinitionList.append(FuncDef)
40 def StoreVariableDeclaration(self, StartLine, StartOffset, EndLine, EndOffset, ModifierText, DeclText):
41 VarDecl = CodeFragment.VariableDeclaration(ModifierText, DeclText, (StartLine, StartOffset), (EndLine, EndOffset))
42 FileProfile.VariableDeclarationList.append(VarDecl)
44 def StoreFunctionCalling(self, StartLine, StartOffset, EndLine, EndOffset, FuncName, ParamList):
45 FuncCall = CodeFragment.FunctionCalling(FuncName, ParamList, (StartLine, StartOffset), (EndLine, EndOffset))
46 FileProfile.FunctionCallingList.append(FuncCall)
51 : external_declaration*
55 /*function_declaration
57 print $function_declaration.text
59 : declaration_specifiers IDENTIFIER '(' parameter_list ')' ';'
65 print $external_declaration.text
67 : ( declaration_specifiers? declarator declaration* '{' )=> function_definition
69 | macro_statement (';')?
84 $function_definition::ModifierText = '';
85 $function_definition::DeclText = '';
86 $function_definition::LBLine = 0;
87 $function_definition::LBOffset = 0;
88 $function_definition::DeclLine = 0;
89 $function_definition::DeclOffset = 0;
92 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)
94 : d=declaration_specifiers? declarator
95 ( declaration+ a=compound_statement // K&R style
96 | b=compound_statement // ANSI style
99 $function_definition::ModifierText = $declaration_specifiers.text
101 $function_definition::ModifierText = ''
102 $function_definition::DeclText = $declarator.text
103 $function_definition::DeclLine = $declarator.start.line
104 $function_definition::DeclOffset = $declarator.start.charPositionInLine
106 $function_definition::LBLine = $a.start.line
107 $function_definition::LBOffset = $a.start.charPositionInLine
109 $function_definition::LBLine = $b.start.line
110 $function_definition::LBOffset = $b.start.charPositionInLine
115 : a='typedef' b=declaration_specifiers?
116 c=init_declarator_list d=';'
119 self.StoreTypedefDefinition($a.line, $a.charPositionInLine, $d.line, $d.charPositionInLine, $b.text, $c.text)
121 self.StoreTypedefDefinition($a.line, $a.charPositionInLine, $d.line, $d.charPositionInLine, '', $c.text)
123 | s=declaration_specifiers t=init_declarator_list? e=';'
126 self.StoreVariableDeclaration($s.start.line, $s.start.charPositionInLine, $t.start.line, $t.start.charPositionInLine, $s.text, $t.text)
130 declaration_specifiers
131 : ( storage_class_specifier
138 : init_declarator (',' init_declarator)*
142 : declarator ('=' initializer)?
145 storage_class_specifier
163 | s=struct_or_union_specifier
166 self.StoreStructUnionDefinition($s.start.line, $s.start.charPositionInLine, $s.stop.line, $s.stop.charPositionInLine, $s.text)
171 self.StoreEnumerationDefinition($e.start.line, $e.start.charPositionInLine, $e.stop.line, $e.stop.charPositionInLine, $e.text)
173 | (IDENTIFIER type_qualifier* declarator)=> type_id
178 //{self.printTokenInfo($a.line, $a.pos, $a.text)}
181 struct_or_union_specifier
183 : struct_or_union IDENTIFIER? '{' struct_declaration_list '}'
184 | struct_or_union IDENTIFIER
192 struct_declaration_list
193 : struct_declaration+
197 : specifier_qualifier_list struct_declarator_list ';'
200 specifier_qualifier_list
201 : ( type_qualifier | type_specifier )+
204 struct_declarator_list
205 : struct_declarator (',' struct_declarator)*
209 : declarator (':' constant_expression)?
210 | ':' constant_expression
215 : 'enum' '{' enumerator_list ','? '}'
216 | 'enum' IDENTIFIER '{' enumerator_list ','? '}'
221 : enumerator (',' enumerator)*
225 : IDENTIFIER ('=' constant_expression)?
237 | 'GLOBAL_REMOVE_IF_UNREFERENCED'
240 | 'EFI_RUNTIMESERVICE'
244 : pointer? ('EFIAPI')? ('EFI_BOOTSERVICE')? ('EFI_RUNTIMESERVICE')? direct_declarator
245 // | ('EFIAPI')? ('EFI_BOOTSERVICE')? ('EFI_RUNTIMESERVICE')? pointer? direct_declarator
250 : IDENTIFIER declarator_suffix*
251 | '(' ('EFIAPI')? declarator ')' declarator_suffix+
255 : '[' constant_expression ']'
257 | '(' parameter_type_list ')'
258 | '(' identifier_list ')'
263 : '*' type_qualifier+ pointer?
269 : parameter_list (',' ('OPTIONAL')? '...')?
273 : parameter_declaration (',' ('OPTIONAL')? parameter_declaration)*
276 parameter_declaration
277 : declaration_specifiers (declarator|abstract_declarator)* ('OPTIONAL')?
278 //accomerdate user-defined type only, no declarator follow.
279 | pointer* IDENTIFIER
288 : specifier_qualifier_list abstract_declarator?
293 : pointer direct_abstract_declarator?
294 | direct_abstract_declarator
297 direct_abstract_declarator
298 : ( '(' abstract_declarator ')' | abstract_declarator_suffix ) abstract_declarator_suffix*
301 abstract_declarator_suffix
303 | '[' constant_expression ']'
305 | '(' parameter_type_list ')'
310 : assignment_expression
311 | '{' initializer_list ','? '}'
315 : initializer (',' initializer )*
318 // E x p r e s s i o n s
320 argument_expression_list
321 : assignment_expression ('OPTIONAL')? (',' assignment_expression ('OPTIONAL')?)*
325 : (multiplicative_expression) ('+' multiplicative_expression | '-' multiplicative_expression)*
328 multiplicative_expression
329 : (cast_expression) ('*' cast_expression | '/' cast_expression | '%' cast_expression)*
333 : '(' type_name ')' cast_expression
339 | '++' unary_expression
340 | '--' unary_expression
341 | unary_operator cast_expression
342 | 'sizeof' unary_expression
343 | 'sizeof' '(' type_name ')'
351 $postfix_expression::FuncCallText = '';
353 : p=primary_expression {$postfix_expression::FuncCallText += $p.text}
355 | '(' a=')'{self.StoreFunctionCalling($p.start.line, $p.start.charPositionInLine, $a.line, $a.charPositionInLine, $postfix_expression::FuncCallText, '')}
356 | '(' c=argument_expression_list b=')' {self.StoreFunctionCalling($p.start.line, $p.start.charPositionInLine, $b.line, $b.charPositionInLine, $postfix_expression::FuncCallText, $c.text)}
357 | '(' macro_parameter_list ')'
358 | '.' x=IDENTIFIER {$postfix_expression::FuncCallText += '.' + $x.text}
359 | '*' y=IDENTIFIER {$postfix_expression::FuncCallText = $y.text}
360 | '->' z=IDENTIFIER {$postfix_expression::FuncCallText += '->' + $z.text}
367 : parameter_declaration (',' parameter_declaration)*
390 | (IDENTIFIER* STRING_LITERAL+)+ IDENTIFIER*
391 | FLOATING_POINT_LITERAL
397 : assignment_expression (',' assignment_expression)*
401 : conditional_expression
404 assignment_expression
405 : lvalue assignment_operator assignment_expression
406 | conditional_expression
427 conditional_expression
428 : e=logical_or_expression ('?' expression ':' conditional_expression {self.StorePredicateExpression($e.start.line, $e.start.charPositionInLine, $e.stop.line, $e.stop.charPositionInLine, $e.text)})?
431 logical_or_expression
432 : logical_and_expression ('||' logical_and_expression)*
435 logical_and_expression
436 : inclusive_or_expression ('&&' inclusive_or_expression)*
439 inclusive_or_expression
440 : exclusive_or_expression ('|' exclusive_or_expression)*
443 exclusive_or_expression
444 : and_expression ('^' and_expression)*
448 : equality_expression ('&' equality_expression)*
451 : relational_expression (('=='|'!=') relational_expression )*
454 relational_expression
455 : shift_expression (('<'|'>'|'<='|'>=') shift_expression)*
459 : additive_expression (('<<'|'>>') additive_expression)*
462 // S t a t e m e n t s
467 | expression_statement
468 | selection_statement
469 | iteration_statement
479 : '__asm__'? IDENTIFIER '(' (~(';'))* ')' ';'
483 : '_asm' '{' (~('}'))* '}'
487 : '__asm' '{' (~('}'))* '}'
491 : IDENTIFIER '(' declaration* statement_list? expression? ')'
495 : IDENTIFIER ':' statement
496 | 'case' constant_expression ':' statement
497 | 'default' ':' statement
501 : '{' declaration* statement_list? '}'
514 : '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)?
515 | 'switch' '(' expression ')' statement
519 : 'while' '(' e=expression ')' statement {self.StorePredicateExpression($e.start.line, $e.start.charPositionInLine, $e.stop.line, $e.stop.charPositionInLine, $e.text)}
520 | 'do' statement 'while' '(' e=expression ')' ';' {self.StorePredicateExpression($e.start.line, $e.start.charPositionInLine, $e.stop.line, $e.stop.charPositionInLine, $e.text)}
521 | 'for' '(' expression_statement e=expression_statement expression? ')' statement {self.StorePredicateExpression($e.start.line, $e.start.charPositionInLine, $e.stop.line, $e.stop.charPositionInLine, $e.text)}
525 : 'goto' IDENTIFIER ';'
529 | 'return' expression ';'
533 : LETTER (LETTER|'0'..'9')*
545 : ('L')? '\'' ( EscapeSequence | ~('\''|'\\') ) '\''
549 : ('L')? '"' ( EscapeSequence | ~('\\'|'"') )* '"'
552 HEX_LITERAL : '0' ('x'|'X') HexDigit+ IntegerTypeSuffix? ;
554 DECIMAL_LITERAL : ('0' | '1'..'9' '0'..'9'*) IntegerTypeSuffix? ;
556 OCTAL_LITERAL : '0' ('0'..'7')+ IntegerTypeSuffix? ;
559 HexDigit : ('0'..'9'|'a'..'f'|'A'..'F') ;
565 | ('u'|'U') ('l'|'L')
566 | ('u'|'U') ('l'|'L') ('l'|'L')
569 FLOATING_POINT_LITERAL
570 : ('0'..'9')+ '.' ('0'..'9')* Exponent? FloatTypeSuffix?
571 | '.' ('0'..'9')+ Exponent? FloatTypeSuffix?
572 | ('0'..'9')+ Exponent FloatTypeSuffix?
573 | ('0'..'9')+ Exponent? FloatTypeSuffix
577 Exponent : ('e'|'E') ('+'|'-')? ('0'..'9')+ ;
580 FloatTypeSuffix : ('f'|'F'|'d'|'D') ;
584 : '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
590 : '\\' ('0'..'3') ('0'..'7') ('0'..'7')
591 | '\\' ('0'..'7') ('0'..'7')
597 : '\\' 'u' HexDigit HexDigit HexDigit HexDigit
600 WS : (' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;}
603 // ingore '\' of line concatenation
604 BS : ('\\') {$channel=HIDDEN;}
607 // ingore function modifiers
608 //FUNC_MODIFIERS : 'EFIAPI' {$channel=HIDDEN;}
615 : '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}
620 : '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
623 // ignore #line info for now
625 : '#' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}