code fragment storage initial check-in.
[people/mcb30/basetools.git] / Source / Python / Ecc / C.g
index 8caea3e..714966d 100644 (file)
@@ -7,33 +7,43 @@ options {
     k=2;\r
 }\r
 \r
     k=2;\r
 }\r
 \r
-scope Symbols {\r
-       types;\r
-       inFunc;\r
+@header {\r
+    import CodeFragment\r
+    import FileProfile\r
 }\r
 \r
 @members {\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 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
        \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
 \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
        : external_declaration+\r
        ;\r
 \r
@@ -52,37 +62,41 @@ options {k=1;}
 }*/\r
        : ( declaration_specifiers? declarator declaration* '{' )=> function_definition\r
        | declaration\r
 }*/\r
        : ( declaration_specifiers? declarator declaration* '{' )=> function_definition\r
        | declaration\r
-       | macro_statement\r
+       | macro_statement (';')?\r
        ;\r
        \r
 \r
 \r
 function_definition\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
 @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
        :       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
        ;\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
 \r
 declaration_specifiers\r
@@ -98,7 +112,6 @@ init_declarator_list
 \r
 init_declarator\r
        : declarator ('=' initializer)? \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
 storage_class_specifier\r
@@ -109,7 +122,6 @@ storage_class_specifier
        ;\r
 \r
 type_specifier\r
        ;\r
 \r
 type_specifier\r
-options {k=3;}\r
        : 'void'\r
        | 'char'\r
        | 'short'\r
        : 'void'\r
        | 'char'\r
        | 'short'\r
@@ -119,8 +131,8 @@ options {k=3;}
        | 'double'\r
        | 'signed'\r
        | 'unsigned'\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
        | (IDENTIFIER declarator)=> type_id\r
        ;\r
 \r
@@ -131,10 +143,6 @@ type_id
 \r
 struct_or_union_specifier\r
 options {k=3;}\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
        : struct_or_union IDENTIFIER? '{' struct_declaration_list '}'\r
        | struct_or_union IDENTIFIER\r
        ;\r
@@ -193,9 +201,7 @@ declarator
        ;\r
 \r
 direct_declarator\r
        ;\r
 \r
 direct_declarator\r
-scope Symbols;\r
        : IDENTIFIER declarator_suffix*\r
        : IDENTIFIER declarator_suffix*\r
-         //{if $Symbols::inFunc: self.printFuncName($IDENTIFIER.line, $IDENTIFIER.charPositonInLine, $IDENTIFIER.text)}\r
        | '(' declarator ')' declarator_suffix+\r
        ;\r
 \r
        | '(' declarator ')' declarator_suffix+\r
        ;\r
 \r
@@ -360,7 +366,7 @@ assignment_operator
        ;\r
 \r
 conditional_expression\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
 logical_or_expression\r
@@ -417,10 +423,6 @@ labeled_statement
        ;\r
 \r
 compound_statement\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
        : '{' declaration* statement_list? '}'\r
        ;\r
 \r
@@ -434,14 +436,14 @@ expression_statement
        ;\r
 \r
 selection_statement\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
        | '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
        ;\r
 \r
 jump_statement\r