k=2;\r
}\r
\r
-scope Symbols {\r
- types;\r
- inFunc;\r
+@header {\r
+ import CodeFragment\r
+ import FileProfile\r
}\r
\r
@members {\r
- def isTypeName(self, name):\r
- for scope in reversed(self.Symbols_stack):\r
- if name in scope.types:\r
- return True\r
-\r
- return False\r
\r
def printTokenInfo(self, line, offset, tokenText):\r
print str(line)+ ',' + str(offset) + ':' + str(tokenText)\r
+ \r
+ def StorePredicateExpression(self, StartLine, StartOffset, EndLine, EndOffset, Text):\r
+ PredExp = CodeFragment.PredicateExpression(Text, (StartLine, StartOffset), (EndLine, EndOffset))\r
+ FileProfile.PredicateExpressionList.append(PredExp)\r
+ \r
+ def StoreEnumerationDefinition(self, StartLine, StartOffset, EndLine, EndOffset, Text):\r
+ EnumDef = CodeFragment.EnumerationDefinition(Text, (StartLine, StartOffset), (EndLine, EndOffset))\r
+ FileProfile.EnumerationDefinitionList.append(EnumDef)\r
+ \r
+ def StoreStructUnionDefinition(self, StartLine, StartOffset, EndLine, EndOffset, Text):\r
+ SUDef = CodeFragment.StructUnionDefinition(Text, (StartLine, StartOffset), (EndLine, EndOffset))\r
+ FileProfile.StructUnionDefinitionList.append(SUDef)\r
+ \r
+ def StoreTypedefDefinition(self, StartLine, StartOffset, EndLine, EndOffset, FromText, ToText):\r
+ Tdef = CodeFragment.TypedefDefinition(FromText, ToText, (StartLine, StartOffset), (EndLine, EndOffset))\r
+ FileProfile.TypedefDefinitionList.append(Tdef)\r
+ \r
+ def StoreFunctionDefinition(self, StartLine, StartOffset, EndLine, EndOffset, ModifierText, DeclText):\r
+ FuncDef = CodeFragment.FunctionDefinition(ModifierText, DeclText, (StartLine, StartOffset), (EndLine, EndOffset))\r
+ FileProfile.FunctionDefinitionList.append(FuncDef)\r
\r
- def printFuncHeader(self, line, offset, tokenText):\r
- print str(line)+ ',' + str(offset) + ':' + str(tokenText) + ' is function header.'\r
+ def StoreVariableDeclaration(self, StartLine, StartOffset, EndLine, EndOffset, ModifierText, DeclText):\r
+ VarDecl = CodeFragment.VariableDeclaration(ModifierText, DeclText, (StartLine, StartOffset), (EndLine, EndOffset))\r
+ FileProfile.VariableDeclarationList.append(VarDecl)\r
\r
}\r
\r
translation_unit\r
-scope Symbols; // entire file is a scope\r
-@init {\r
- $Symbols::types = set()\r
- $Symbols::inFunc = False\r
-}\r
: external_declaration+\r
;\r
\r
}*/\r
: ( declaration_specifiers? declarator declaration* '{' )=> function_definition\r
| declaration\r
- | macro_statement\r
+ | macro_statement (';')?\r
;\r
\r
\r
\r
function_definition\r
-scope Symbols;\r
-@init{\r
- $Symbols::inFunc = True\r
-}/*\r
+scope {\r
+ ModifierText;\r
+ DeclText;\r
+}\r
+@init {\r
+ $function_definition::ModifierText = '';\r
+ $function_definition::DeclText = '';\r
+}\r
@after{\r
- print str($function_definition.start.line) + ',' + str($function_definition.start.charPositionInLine)\r
- print str($function_definition.stop.line) + ',' + str($function_definition.stop.charPositionInLine)\r
-}*/\r
+ self.StoreFunctionDefinition($function_definition.start.line, $function_definition.start.charPositionInLine, $function_definition.stop.line, $function_definition.stop.charPositionInLine, $function_definition::ModifierText, $function_definition::DeclText)\r
+}\r
: declaration_specifiers? declarator\r
( declaration+ compound_statement // K&R style\r
| compound_statement // ANSI style\r
- ) //{self.printFuncHeader($declarator.start.line, $declarator.start.charPositionInLine, $declarator.text)}\r
+ ) { $function_definition::ModifierText = $declaration_specifiers.text\r
+ $function_definition::DeclText = $declarator.text}\r
;\r
\r
declaration\r
-scope {\r
- isTypedef;\r
-}\r
-@init {\r
- $declaration::isTypedef = False;\r
-}\r
- : a='typedef' declaration_specifiers? //{self.printTokenInfo($a.line, $a.pos, $a.text)}\r
- init_declarator_list ';' // special case, looking for typedef \r
- | declaration_specifiers init_declarator_list? ';'\r
- //| function_declaration\r
+ : a='typedef' b=declaration_specifiers? \r
+ c=init_declarator_list d=';' \r
+ {\r
+ if b != None:\r
+ self.StoreTypedefDefinition($a.line, $a.charPositionInLine, $d.line, $d.charPositionInLine, $b.text, $c.text)\r
+ else:\r
+ self.StoreTypedefDefinition($a.line, $a.charPositionInLine, $d.line, $d.charPositionInLine, '', $c.text)\r
+ } \r
+ | s=declaration_specifiers t=init_declarator_list? e=';' \r
+ {self.StoreVariableDeclaration($s.start.line, $s.start.charPositionInLine, $e.line, $e.charPositionInLine, $s.text, $t.text)}\r
;\r
\r
declaration_specifiers\r
\r
init_declarator\r
: declarator ('=' initializer)? \r
- //{self.printTokenInfo($declarator.start.line, $declarator.start.charPositionInLine, $declarator.text)}\r
;\r
\r
storage_class_specifier\r
;\r
\r
type_specifier\r
-options {k=3;}\r
: 'void'\r
| 'char'\r
| 'short'\r
| 'double'\r
| 'signed'\r
| 'unsigned'\r
- | struct_or_union_specifier\r
- | enum_specifier\r
+ | s=struct_or_union_specifier {self.StoreStructUnionDefinition($s.start.line, $s.start.charPositionInLine, $s.stop.line, $s.stop.charPositionInLine, $s.text)}\r
+ | e=enum_specifier {self.StoreEnumerationDefinition($e.start.line, $e.start.charPositionInLine, $e.stop.line, $e.stop.charPositionInLine, $e.text)}\r
| (IDENTIFIER declarator)=> type_id\r
;\r
\r
\r
struct_or_union_specifier\r
options {k=3;}\r
-scope Symbols; // structs are scopes\r
-@init {\r
- $Symbols::types = set()\r
-}\r
: struct_or_union IDENTIFIER? '{' struct_declaration_list '}'\r
| struct_or_union IDENTIFIER\r
;\r
;\r
\r
direct_declarator\r
-scope Symbols;\r
: IDENTIFIER declarator_suffix*\r
- //{if $Symbols::inFunc: self.printFuncName($IDENTIFIER.line, $IDENTIFIER.charPositonInLine, $IDENTIFIER.text)}\r
| '(' declarator ')' declarator_suffix+\r
;\r
\r
;\r
\r
conditional_expression\r
- : e=logical_or_expression ('?' expression ':' conditional_expression {self.printTokenInfo($e.start.line, $e.start.charPositionInLine, $e.text)})?\r
+ : e=logical_or_expression ('?' expression ':' conditional_expression {self.StorePredicateExpression($e.start.line, $e.start.charPositionInLine, $e.stop.line, $e.stop.charPositionInLine, $e.text)})?\r
;\r
\r
logical_or_expression\r
;\r
\r
compound_statement\r
-scope Symbols; // blocks have a scope of symbols\r
-@init {\r
- $Symbols::types = set()\r
-}\r
: '{' declaration* statement_list? '}'\r
;\r
\r
;\r
\r
selection_statement\r
- : 'if' '(' e=expression ')' {self.printTokenInfo($e.start.line, $e.start.charPositionInLine, $e.text)} statement (options {k=1; backtrack=false;}:'else' statement)?\r
+ : '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)?\r
| 'switch' '(' expression ')' statement\r
;\r
\r
iteration_statement\r
- : 'while' '(' e=expression ')' statement {self.printTokenInfo($e.start.line, $e.start.charPositionInLine, $e.text)}\r
- | 'do' statement 'while' '(' e=expression ')' ';' {self.printTokenInfo($e.start.line, $e.start.charPositionInLine, $e.text)}\r
- | 'for' '(' expression_statement e=expression_statement expression? ')' statement {self.printTokenInfo($e.start.line, $e.start.charPositionInLine, $e.text)}\r
+ : 'while' '(' e=expression ')' statement {self.StorePredicateExpression($e.start.line, $e.start.charPositionInLine, $e.stop.line, $e.stop.charPositionInLine, $e.text)}\r
+ | 'do' statement 'while' '(' e=expression ')' ';' {self.StorePredicateExpression($e.start.line, $e.start.charPositionInLine, $e.stop.line, $e.stop.charPositionInLine, $e.text)}\r
+ | 'for' '(' expression_statement e=expression_statement expression? ')' statement {self.StorePredicateExpression($e.start.line, $e.start.charPositionInLine, $e.stop.line, $e.stop.charPositionInLine, $e.text)}\r
;\r
\r
jump_statement\r