wip II
[sdk] / compiler / libec / src / grammar.y
index e04150a..1d6902d 100644 (file)
@@ -2,6 +2,7 @@
 import "ecdefs"
 
 #define YYLTYPE Location
+#include "grammar.h"
 
 #ifndef YYLLOC_DEFAULT
 # define YYLLOC_DEFAULT(Current, Rhs, N)         \
@@ -24,13 +25,7 @@ int defaultMemberAccess = -1;
 
 #define POP_DEFAULT_ACCESS    if(defaultMemberAccess > -1) defaultMemberAccess--;
 
-public void SetAST(OldList * list) { ast = list; }
-public OldList * GetAST() { return ast; }
-
-public void ParseEc()
-{
-   yyparse();
-}
+#define C89_DECL_WARNING   "eC expects all declarations to precede statements in the block (C89 style)\n"
 
 #define uint _uint
 default:
@@ -59,6 +54,9 @@ default:
    External external;
    Context context;
    AsmField asmField;
+   Attrib attrib;
+   ExtDecl extDecl;
+   Attribute attribute;
 
    Instantiation instance;
    MembersInit membersInit;
@@ -92,9 +90,8 @@ default:
             exclusive_or_expression inclusive_or_expression logical_and_expression
             logical_or_expression conditional_expression assignment_expression
             constant_expression constant_expression_error
-            anon_instantiation_expression anon_instantiation_expression_error
-
-%type <exp> postfix_expression_error unary_expression_error cast_expression_error
+            anon_instantiation_expression anon_instantiation_expression_error i18n_string
+            postfix_expression_error unary_expression_error cast_expression_error
             multiplicative_expression_error additive_expression_error shift_expression_error
             relational_expression_error equality_expression_error and_expression_error
             exclusive_or_expression_error inclusive_or_expression_error logical_and_expression_error
@@ -104,7 +101,7 @@ default:
             common_unary_expression common_unary_expression_error
             simple_unary_expression simple_unary_expression_error
             database_open dbfield dbindex dbtable
-            
+
 %type <list> argument_expression_list expression expression_anon_inst expression_anon_inst_error enumerator_list type_qualifier_list
              struct_declarator_list struct_declaration_list
              declaration_specifiers identifier_list identifier_list_error initializer_list init_declarator_list
@@ -120,7 +117,7 @@ default:
              new_specifiers renew_specifiers asm_field_list
              property_watch_list watch_property_list
              dbindex_item_list dbfield_definition_list
-             template_arguments_list template_parameters_list
+             template_arguments_list template_parameters_list attribs_list
 
 %type <asmField> asm_field
 %type <specifier> storage_class_specifier enum_specifier_compound enum_specifier_nocompound type_qualifier type_specifier class_specifier class_specifier_error
@@ -132,7 +129,8 @@ default:
 %type <declarator> declarator direct_declarator direct_abstract_declarator abstract_declarator
                    direct_abstract_declarator_noarray abstract_declarator_noarray
                    struct_declarator direct_declarator_function direct_declarator_function_start declarator_function_error direct_declarator_function_error declarator_function direct_declarator_nofunction
-                   declarator_nofunction
+                   direct_declarator_function_type_ok declarator_nofunction_type_ok direct_declarator_nofunction_type_ok declarator_function_type_ok direct_declarator_function_error_type_ok
+                   direct_declarator_function_start_type_ok direct_declarator_type_ok declarator_type_ok declarator_function_error_type_ok
 %type <pointer> pointer
 %type <initializer> initializer initializer_error initializer_condition initializer_condition_error
 %type <initDeclarator> init_declarator init_declarator_error
@@ -155,7 +153,10 @@ default:
 %type <classFunction> instance_class_function_definition instance_class_function_definition_error instance_class_function_definition_start instance_class_function_definition_start_error 
 %type <_class> class class_error class_head
 %type <classDef> struct_declaration struct_declaration_error
-%type <string> ext_decl string_literal ext_attrib base_strict_type_name
+%type <string> string_literal base_strict_type_name attribute_word
+%type <extDecl> ext_decl
+%type <attrib> attrib
+%type <attribute> attribute
 %type <prop> property property_start property_body class_property class_property_start class_property_body
 %type <propertyWatch> property_watch self_watch_definition
 
@@ -166,6 +167,7 @@ default:
 %type <dbtableEntry> dbindex_entry dbfield_entry
 %type <dbindexItem> dbindex_item
 %type <dbtableDef> dbtable_definition
+%type <context> compound_start class_entry
 
 %token IDENTIFIER CONSTANT STRING_LITERAL SIZEOF
 %token PTR_OP INC_OP DEC_OP LEFT_OP RIGHT_OP LE_OP GE_OP EQ_OP NE_OP
@@ -182,14 +184,14 @@ default:
 %nonassoc IFX
 %nonassoc ELSE
 %token CLASS THISCLASS CLASS_NAME
-%token PROPERTY SETPROP GETPROP NEWOP RENEW DELETE EXT_DECL EXT_STORAGE IMPORT DEFINE VIRTUAL EXT_ATTRIB
+%token PROPERTY SETPROP GETPROP NEWOP RENEW DELETE EXT_DECL EXT_STORAGE IMPORT DEFINE VIRTUAL ATTRIB
 %token PUBLIC PRIVATE
 %token TYPED_OBJECT ANY_OBJECT _INCREF EXTENSION ASM TYPEOF
 %token WATCH STOPWATCHING FIREWATCHERS WATCHABLE CLASS_DESIGNER CLASS_NO_EXPANSION CLASS_FIXED ISPROPSET
 %token CLASS_DEFAULT_PROPERTY PROPERTY_CATEGORY CLASS_DATA CLASS_PROPERTY SUBCLASS NAMESPACE
 %token NEW0OP RENEW0 VAARG
 %token DBTABLE DBFIELD DBINDEX DATABASE_OPEN
-
+%token ALIGNOF ATTRIB_DEP __ATTRIB
 
 %destructor { FreeIdentifier($$); } identifier 
 %destructor { FreePointer($$); } pointer
@@ -203,16 +205,18 @@ default:
                                     multiplicative_expression_error additive_expression_error shift_expression_error
                                     relational_expression_error equality_expression_error and_expression_error
                                     exclusive_or_expression_error inclusive_or_expression_error logical_and_expression_error
-                                    logical_or_expression_error conditional_expression_error assignment_expression_error
-%destructor { FreeSpecifier($$); }  storage_class_specifier external_storage_class_specifier type_qualifier type_specifier
-                                    struct_or_union_specifier_compound struct_or_union_specifier_nocompound type ext_storage class_specifier class_specifier_error
-                                    struct_or_union_specifier_compound_error struct_class struct_class_error
-                                    enum_specifier_compound_error
+                                    logical_or_expression_error conditional_expression_error assignment_expression_error i18n_string
+%destructor { FreeSpecifier($$); }  storage_class_specifier enum_specifier_compound enum_specifier_nocompound type_qualifier type_specifier class_specifier class_specifier_error
+                                    struct_or_union_specifier_compound struct_or_union_specifier_nocompound ext_storage type strict_type guess_type enum_class strict_type_specifier struct_class
+                                    struct_or_union_specifier_compound_error struct_class_error struct_decl
+                                    enum_specifier_compound_error enum_class_error external_storage_class_specifier
+                                    base_strict_type struct_head struct_entry
 %destructor { FreeEnumerator($$); } enumerator
 %destructor { FreeDeclarator($$); } declarator direct_declarator direct_abstract_declarator abstract_declarator
                                     direct_abstract_declarator_noarray abstract_declarator_noarray
                                     struct_declarator direct_declarator_function direct_declarator_function_start declarator_function_error direct_declarator_function_error declarator_function direct_declarator_nofunction
-                                    declarator_nofunction
+                                    direct_declarator_function_type_ok declarator_nofunction_type_ok direct_declarator_nofunction_type_ok declarator_function_type_ok direct_declarator_function_error_type_ok
+                                    direct_declarator_function_start_type_ok direct_declarator_type_ok declarator_type_ok declarator_function_error_type_ok
 
 %destructor { FreeInitializer($$); } initializer initializer_error initializer_condition initializer_condition_error
 %destructor { FreeInitDeclarator($$); } init_declarator init_declarator_error
@@ -233,14 +237,17 @@ default:
                                        class_function_definition_start_error virtual_class_function_definition_start virtual_class_function_definition_start_error
                                        constructor_function_definition_start destructor_function_definition_start 
                                        instance_class_function_definition instance_class_function_definition_error instance_class_function_definition_start instance_class_function_definition_start_error 
-%destructor { FreeClass($$); } class class_error 
+%destructor { Context ctx = curContext; PopContext(ctx); FreeContext(ctx); delete ctx; } class_entry
+%destructor { Context ctx = curContext; PopContext(ctx); FreeContext(ctx); delete ctx; } class_decl
+%destructor { FreeClass($$); } class class_error class_head
 %destructor { FreeClassDef($$); } struct_declaration struct_declaration_error
-%destructor { delete $$; } ext_decl string_literal
+%destructor { delete $$; } string_literal attribute_word base_strict_type_name
 %destructor { FreeProperty($$); } property
 
 %destructor { FreeList($$, FreeExpression); }  argument_expression_list expression expression_error argument_expression_list_error 
 %destructor { FreeList($$, FreeEnumerator); }  enumerator_list 
-%destructor { FreeList($$, FreeSpecifier); }   type_qualifier_list specifier_qualifier_list declaration_specifiers inheritance_specifiers _inheritance_specifiers
+%destructor { FreeList($$, FreeSpecifier); }   type_qualifier_list specifier_qualifier_list declaration_specifiers inheritance_specifiers _inheritance_specifiers external_guess_declaration_specifiers external_guess_declaration_specifiers_error
+                                               guess_declaration_specifiers guess_specifier_qualifier_list
 %destructor { FreeList($$, FreeDeclarator); }  struct_declarator_list
 %destructor { FreeList($$, FreeDeclaration); } declaration_list declaration_list_error 
 %destructor { FreeList($$, FreeInitializer); } initializer_list
@@ -251,8 +258,17 @@ default:
 %destructor { FreeList($$, FreeClassDef); } struct_declaration_list struct_declaration_list_error
 %destructor { FreeList($$, FreeMemberInit); } default_property_list default_property_list_error data_member_initialization_list data_member_initialization_list_coloned data_member_initialization_list_error
 %destructor { FreeList($$, FreeMembersInit); } members_initialization_list members_initialization_list_coloned members_initialization_list_error  
+%destructor { PopContext($$); FreeContext($$); delete $$; } compound_start
+%destructor { FreeTemplateParameter($$); } template_parameter template_type_parameter template_identifier_parameter template_expression_parameter
+%destructor { FreeTemplateArgument($$); } template_argument template_type_argument template_identifier_argument template_expression_argument
+%destructor { FreeTemplateDataType($$); } template_datatype
+%destructor { FreeList($$, FreeTemplateParameter); } template_parameters_list
+%destructor { FreeList($$, FreeTemplateArgument); } template_arguments_list
 %destructor { } declaration_mode
-
+%destructor { FreeAttrib($$); } attrib
+%destructor { FreeExtDecl($$); } ext_decl
+%destructor { FreeAttribute($$); } attribute
+%destructor { FreeList($$, FreeAttribute); }  attribs_list
 
 %start thefile
 
@@ -261,6 +277,7 @@ default:
 guess_type:
    identifier '*'
    {
+      $$ = null;
       // if($1._class && !$1._class.name)
       if($1._class)
       {
@@ -279,16 +296,17 @@ guess_type:
       resetScannerPos(&@1.start);
       yyclearin;
 
-      YYPOPSTACK;
+      YYPOPSTACK(1);
       yystate = *yyssp;
       YY_STACK_PRINT (yyss, yyssp);
-      YYPOPSTACK;
+      YYPOPSTACK(1);
       yystate = *yyssp;
       YY_STACK_PRINT (yyss, yyssp);
       goto yysetstate;
    }
    | identifier '<'
    {
+      $$ = null;
    #ifdef PRECOMPILER
       // if($1._class && !$1._class.name)
       if($1._class)
@@ -308,10 +326,10 @@ guess_type:
       resetScannerPos(&@1.start);
       yyclearin;
 
-      YYPOPSTACK;
+      YYPOPSTACK(1);
       yystate = *yyssp;
       YY_STACK_PRINT (yyss, yyssp);
-      YYPOPSTACK;
+      YYPOPSTACK(1);
       yystate = *yyssp;
       YY_STACK_PRINT (yyss, yyssp);
       goto yysetstate;
@@ -334,10 +352,10 @@ guess_type:
       resetScannerPos(&@1.start);
       yyclearin;
 
-      YYPOPSTACK;
+      YYPOPSTACK(1);
       yystate = *yyssp;
       YY_STACK_PRINT (yyss, yyssp);
-      YYPOPSTACK;
+      YYPOPSTACK(1);
       yystate = *yyssp;
       YY_STACK_PRINT (yyss, yyssp);
       goto yysetstate;
@@ -367,16 +385,16 @@ type:
       resetScannerPos(&@1.start);
       yyclearin;
 
-      YYPOPSTACK;
+      YYPOPSTACK(1);
       yystate = *yyssp;
       YY_STACK_PRINT (yyss, yyssp);
-      YYPOPSTACK;
+      YYPOPSTACK(1);
       yystate = *yyssp;
       YY_STACK_PRINT (yyss, yyssp);
       goto yysetstate;
    #else
       Location tmpLoc = yylloc; $$ = $2; yylloc = @1; 
-      Compiler_Error("Not a type: %s\n", $1.string);      
+      Compiler_Error($"Not a type: %s\n", $1.string);      
       yylloc = tmpLoc; $2.badID = $1;
    #endif
    }
@@ -399,10 +417,10 @@ type:
       resetScannerPos(&@1.start);
       yyclearin;
 
-      YYPOPSTACK;
+      YYPOPSTACK(1);
       yystate = *yyssp;
       YY_STACK_PRINT (yyss, yyssp);
-      YYPOPSTACK;
+      YYPOPSTACK(1);
       yystate = *yyssp;
       YY_STACK_PRINT (yyss, yyssp);
       goto yysetstate;
@@ -430,16 +448,16 @@ type:
       resetScannerPos(&@1.start);
       yyclearin;
 
-      YYPOPSTACK;
+      YYPOPSTACK(1);
       yystate = *yyssp;
       YY_STACK_PRINT (yyss, yyssp);
-      YYPOPSTACK;
+      YYPOPSTACK(1);
       yystate = *yyssp;
       YY_STACK_PRINT (yyss, yyssp);
       goto yysetstate;
    #else
       Location tmpLoc = yylloc; $$ = $2; yylloc = @1; 
-      Compiler_Error("Not a type: %s\n", $1.string);      
+      Compiler_Error($"Not a type: %s\n", $1.string);      
       yylloc = tmpLoc; $2.badID = $1;
    #endif
    }*/
@@ -488,13 +506,13 @@ strict_type:
          resetScannerPos(&@1.start);
          yyclearin;
 
-         YYPOPSTACK;
+         YYPOPSTACK(1);
          yystate = *yyssp;
          YY_STACK_PRINT (yyss, yyssp);
-         YYPOPSTACK;
+         YYPOPSTACK(1);
          yystate = *yyssp;
          YY_STACK_PRINT (yyss, yyssp);
-         YYPOPSTACK;
+         YYPOPSTACK(1);
          yystate = *yyssp;
          YY_STACK_PRINT (yyss, yyssp);
          goto yysetstate;
@@ -504,7 +522,7 @@ strict_type:
    ;
 
 class_function_definition_start:
-   guess_declaration_specifiers declarator_function
+   guess_declaration_specifiers declarator_function_type_ok
       { $$ = MkClassFunction($1, null, $2, null); $$.loc = @$; $$.id = ++globalContext.nextID; }
    | declarator_function
       { $$ = MkClassFunction(null, null, $1, null); $$.loc = @$; $$.id = ++globalContext.nextID; }
@@ -521,21 +539,21 @@ destructor_function_definition_start:
    ;
 
 virtual_class_function_definition_start:
-     VIRTUAL guess_declaration_specifiers declarator_function
+     VIRTUAL guess_declaration_specifiers declarator_function_type_ok
       { $$ = MkClassFunction($2, null, $3, null); $$.isVirtual = true; $$.loc = @$; $$.id = ++globalContext.nextID; }
    | VIRTUAL declarator_function
       { $$ = MkClassFunction(null, null, $2, null); $$.isVirtual = true; $$.loc = @$; $$.id = ++globalContext.nextID; }
       ;
 
 class_function_definition_start_error:
-     guess_declaration_specifiers declarator_function_error
+     guess_declaration_specifiers declarator_function_error_type_ok
       { $$ = MkClassFunction($1, null, $2, null); $$.loc = @$; $$.id = ++globalContext.nextID; }
    | declarator_function_error
       { $$ = MkClassFunction(null, null, $1, null); $$.loc = @$; $$.id = ++globalContext.nextID; }
    ;
 
 virtual_class_function_definition_start_error:
-     VIRTUAL guess_declaration_specifiers declarator_function_error
+     VIRTUAL guess_declaration_specifiers declarator_function_error_type_ok
       { $$ = MkClassFunction($2, null, $3, null); $$.isVirtual = true; $$.loc = @$; $$.id = ++globalContext.nextID; }
    | VIRTUAL declarator_function_error
       { $$ = MkClassFunction(null, null, $2, null); $$.isVirtual = true; $$.loc = @$; $$.id = ++globalContext.nextID; }
@@ -573,14 +591,14 @@ class_function_definition_error:
 
 // In Instances, return type is required to distinguish from calling the function
 instance_class_function_definition_start:
-   declaration_specifiers declarator_function
+   declaration_specifiers declarator_function_type_ok
       { $$ = MkClassFunction($1, null, $2, null); $$.loc = @$; $$.id = ++globalContext.nextID; }
-   |  declaration_specifiers declarator_nofunction
+   |  declaration_specifiers declarator_nofunction_type_ok
       { $$ = MkClassFunction($1, null, MkDeclaratorFunction($2, null), null); $$.loc = @$; $$.id = ++globalContext.nextID; }
       ; 
 
 instance_class_function_definition_start_error:
-   declaration_specifiers declarator_function_error
+   declaration_specifiers declarator_function_error_type_ok
       { $$ = MkClassFunction($1, null, $2, null); $$.loc = @$; $$.id = ++globalContext.nextID; }
       ;
 
@@ -622,17 +640,17 @@ data_member_initialization_error:
 data_member_initialization_list:
    data_member_initialization { $$ = MkList(); ListAdd($$, $1); }
    | data_member_initialization_list ',' data_member_initialization
-      { ((MemberInit)$1->last).loc.end = @3.start; ListAdd($1, $3); }
+      { ((MemberInit)$1->last).loc.end = @3.start; ListAdd($1, $3); $$ = $1; }
    | data_member_initialization_list_error ',' data_member_initialization
-      { ((MemberInit)$1->last).loc.end = @3.start; ListAdd($1, $3); }
+      { ((MemberInit)$1->last).loc.end = @3.start; ListAdd($1, $3); $$ = $1; }
    ;
 
 data_member_initialization_list_error:
    data_member_initialization_error { $$ = MkList(); ListAdd($$, $1); }
    | data_member_initialization_list ',' data_member_initialization_error
-      { ((MemberInit)$1->last).loc.end = @3.start; ListAdd($1, $3); }
+      { ((MemberInit)$1->last).loc.end = @3.start; ListAdd($1, $3); $$ = $1; }
    | data_member_initialization_list_error ',' data_member_initialization_error
-      { ((MemberInit)$1->last).loc.end = @3.start; ListAdd($1, $3); }
+      { ((MemberInit)$1->last).loc.end = @3.start; ListAdd($1, $3); $$ = $1; }
 
    | data_member_initialization_list ',' error
       { ((MemberInit)$1->last).loc.end = @2.end; 
@@ -642,7 +660,8 @@ data_member_initialization_list_error:
             memberInit.realLoc.start = memberInit.loc.start = dummy.loc.start = @2.end; 
             memberInit.realLoc.end = memberInit.loc.end = dummy.loc.end = @2.end; 
             ListAdd($1, memberInit); 
-          } 
+          }
+          $$ = $1;
        }
    |
    data_member_initialization_list_error ',' error
@@ -653,7 +672,8 @@ data_member_initialization_list_error:
             memberInit.realLoc.start = memberInit.loc.start = dummy.loc.start = @2.end; 
             memberInit.realLoc.end = memberInit.loc.end = dummy.loc.end = @2.end; 
             ListAdd($1, memberInit); 
-          } 
+          }
+          $$ = $1;
        }
        |   ','
       {
@@ -675,21 +695,21 @@ data_member_initialization_list_error:
 
 data_member_initialization_list_coloned:
    data_member_initialization_list ';'
-      { if($1->last) ((MemberInit)$1->last).loc.end = @2.end; }
+      { if($1->last) ((MemberInit)$1->last).loc.end = @2.end; $$ = $1; }
    | data_member_initialization_list_error ';'
-      { if($1->last) ((MemberInit)$1->last).loc.end = @2.end; }
+      { if($1->last) ((MemberInit)$1->last).loc.end = @2.end; $$ = $1; }
    ;
 
 members_initialization_list_coloned:
      data_member_initialization_list_coloned                                        { MembersInit members = MkMembersInitList($1); $$ = MkList(); ListAdd($$, members); members.loc = @1; }
    | instance_class_function_definition                                             { $$ = MkList(); ListAdd($$, MkMembersInitMethod($1)); ((MembersInit)$$->last).loc = @1; }
-   | members_initialization_list_error data_member_initialization_list_coloned      { MembersInit members = MkMembersInitList($2); ListAdd($$, members);  members.loc = @2;  }
-   | members_initialization_list_error    instance_class_function_definition        { ListAdd($$, MkMembersInitMethod($2)); ((MembersInit)$$->last).loc = @2; }
-   | members_initialization_list_coloned  data_member_initialization_list_coloned   { MembersInit members = MkMembersInitList($2); ListAdd($$, members); members.loc = @2;  }
-   | members_initialization_list_coloned  instance_class_function_definition        { ListAdd($$, MkMembersInitMethod($2)); ((MembersInit)$$->last).loc = @2; }
+   | members_initialization_list_error data_member_initialization_list_coloned      { MembersInit members = MkMembersInitList($2); ListAdd($$, members);  members.loc = @2; $$ = $1; }
+   | members_initialization_list_error    instance_class_function_definition        { ListAdd($$, MkMembersInitMethod($2)); ((MembersInit)$$->last).loc = @2; $$ = $1; }
+   | members_initialization_list_coloned  data_member_initialization_list_coloned   { MembersInit members = MkMembersInitList($2); ListAdd($$, members); members.loc = @2; $$ = $1; }
+   | members_initialization_list_coloned  instance_class_function_definition        { ListAdd($$, MkMembersInitMethod($2)); ((MembersInit)$$->last).loc = @2; $$ = $1; }
    | ';'                                                                            { MembersInit members = MkMembersInitList(MkList()); $$ = MkList(); ListAdd($$, members); members.loc = @1;  }
    | members_initialization_list_error ';'
-   | members_initialization_list_coloned ';'       { MembersInit members = MkMembersInitList(MkList()); ListAdd($$, members); members.loc = @2;  }
+   | members_initialization_list_coloned ';'       { MembersInit members = MkMembersInitList(MkList()); ListAdd($$, members); members.loc = @2; $$ = $1; }
    ;
 
 members_initialization_list:
@@ -701,19 +721,19 @@ members_initialization_list:
 
 members_initialization_list_error:
      instance_class_function_definition_error                                 { $$ = MkList(); ListAdd($$, MkMembersInitMethod($1)); ((MembersInit)$$->last).loc = @1; }
-     | members_initialization_list instance_class_function_definition_error  { ListAdd($$, MkMembersInitMethod($2)); ((MembersInit)$$->last).loc = @2; }
-     | members_initialization_list_error instance_class_function_definition_error  { ListAdd($$, MkMembersInitMethod($2)); ((MembersInit)$$->last).loc = @2; }
-     | members_initialization_list_coloned instance_class_function_definition_error  { ListAdd($$, MkMembersInitMethod($2)); ((MembersInit)$$->last).loc = @2; }
-     | members_initialization_list_coloned data_member_initialization_list_error  { ListAdd($$, MkMembersInitList($2)); ((MembersInit)$$->last).loc = @2; }
+     | members_initialization_list instance_class_function_definition_error  { ListAdd($$, MkMembersInitMethod($2)); ((MembersInit)$$->last).loc = @2; $$ = $1; }
+     | members_initialization_list_error instance_class_function_definition_error  { ListAdd($$, MkMembersInitMethod($2)); ((MembersInit)$$->last).loc = @2; $$ = $1; }
+     | members_initialization_list_coloned instance_class_function_definition_error  { ListAdd($$, MkMembersInitMethod($2)); ((MembersInit)$$->last).loc = @2; $$ = $1; }
+     | members_initialization_list_coloned data_member_initialization_list_error  { ListAdd($$, MkMembersInitList($2)); ((MembersInit)$$->last).loc = @2; $$ = $1; }
      | data_member_initialization_list_error                                  { $$ = MkList(); ListAdd($$, MkMembersInitList($1)); ((MembersInit)$$->last).loc = @1; }
      | data_member_initialization_list error                                  { $$ = MkList(); ListAdd($$, MkMembersInitList($1)); ((MembersInit)$$->last).loc = @2; }
    ;
 
 instantiation_named:
      instantiation_named_error '}'
-      { $$.loc = @$; $$.insideLoc.end = @2.start; }
+      { $$.loc = @$; $$.insideLoc.end = @2.start; $$ = $1; }
     | instantiation_named_error error '}'
-      { $$.loc = @$; $$.insideLoc.end = @2.start; }
+      { $$.loc = @$; $$.insideLoc.end = @2.start; $$ = $1; }
    ;
 
 instantiation_named_error:
@@ -809,9 +829,9 @@ external_guess_instantiation_named:
 
 instantiation_unnamed:
      instantiation_unnamed_error '}'
-      { $$.loc = @$; $$.insideLoc.end = @2.start; }
+      { $$.loc = @$; $$.insideLoc.end = @2.start; $$ = $1; }
     | instantiation_unnamed_error error '}'
-      { $$.loc = @$; $$.insideLoc.end = @2.start; }
+      { $$.loc = @$; $$.insideLoc.end = @2.start; $$ = $1; }
    ;
 
 instantiation_unnamed_error:
@@ -963,14 +983,14 @@ default_property_error:
 
 default_property_list:
      default_property        { $$ = MkList(); ListAdd($$, $1); ((MemberInit)$$->last).loc = @$; }
-   | default_property_list ',' default_property      { ((MemberInit)$1->last).loc.end = @3.start; ListAdd($1, $3); }
-   | default_property_list_error ',' default_property      { ((MemberInit)$1->last).loc.end = @3.start; ListAdd($1, $3); }
+   | default_property_list ',' default_property      { ((MemberInit)$1->last).loc.end = @3.start; ListAdd($1, $3); $$ = $1; }
+   | default_property_list_error ',' default_property      { ((MemberInit)$1->last).loc.end = @3.start; ListAdd($1, $3); $$ = $1; }
    ;
 
 default_property_list_error:
       default_property_error      { $$ = MkList(); ListAdd($$, $1); ((MemberInit)$$->last).loc = @$; }
-   | default_property_list ',' default_property_error      { ((MemberInit)$1->last).loc.end = @3.start; ListAdd($1, $3); }
-   | default_property_list_error ',' default_property_error      { ((MemberInit)$1->last).loc.end = @3.start; ListAdd($1, $3); } 
+   | default_property_list ',' default_property_error      { ((MemberInit)$1->last).loc.end = @3.start; ListAdd($1, $3); $$ = $1; }
+   | default_property_list_error ',' default_property_error      { ((MemberInit)$1->last).loc.end = @3.start; ListAdd($1, $3); $$ = $1; 
    | default_property_list error   
    ;
 
@@ -1001,12 +1021,12 @@ property_body:
       { $1.issetStmt = $3; }
    | property_body WATCHABLE
       { $1.isWatchable = true; }
-   | property_body PROPERTY_CATEGORY string_literal
+   | property_body PROPERTY_CATEGORY i18n_string
       { $1.category = $3; }
        ;
 
 property:
-   property_body '}' { $1.loc.end = @2.end; }
+   property_body '}' { $1.loc.end = @2.end; $$ = $1; }
    ;
 
 class_property_start:
@@ -1094,30 +1114,16 @@ firewatchers:
        ;
 
 struct_declaration:
-         guess_declaration_specifiers struct_declarator_list ';'         { $$ = MkClassDefDeclaration(MkStructDeclaration($1, $2, null)); $$.decl.loc = @$; $$.loc = @$; $$.memberAccess = memberAccessStack[defaultMemberAccess]; }
-   | guess_declaration_specifiers ';'                                { $$ = MkClassDefDeclaration(MkStructDeclaration($1, null, null)); $$.decl.loc = @$; $$.loc = @$; $$.memberAccess = memberAccessStack[defaultMemberAccess]; }
-   | instantiation_unnamed ';'                                       { $$ = MkClassDefDeclaration(MkDeclarationClassInst($1)); $$.loc = @$; $$.decl.loc = @$; $$.memberAccess = memberAccessStack[defaultMemberAccess]; }
-   | guess_instantiation_named ';'                                   { $$ = MkClassDefDeclaration(MkDeclarationClassInst($1)); $$.loc = @$; $$.decl.loc = @$; $$.memberAccess = memberAccessStack[defaultMemberAccess]; }
+     struct_declaration_error ';' { $$ = $1; $$.loc.end = @2.start; }
+   | default_property_list ';'     { $$ = MkClassDefDefaultProperty($1); if($1->last) ((MemberInit)$1->last).loc.end = @2.start; $$.loc = @$; }
    | class_function_definition                                       { $$ = MkClassDefFunction($1); $$.loc = @$; $$.memberAccess = memberAccessStack[defaultMemberAccess]; }
    | property                       { $$ = MkClassDefProperty($1); $$.loc = @$; globalContext.nextID++; $$.memberAccess = memberAccessStack[defaultMemberAccess]; }
-
-       | member_access guess_declaration_specifiers struct_declarator_list ';'         { $$ = MkClassDefDeclaration(MkStructDeclaration($2, $3, null)); $$.decl.loc = @$; $$.loc = @$; $$.memberAccess = $1; }
-   | member_access guess_declaration_specifiers ';'                                { $$ = MkClassDefDeclaration(MkStructDeclaration($2, null, null)); $$.decl.loc = @$; $$.loc = @$; $$.memberAccess = $1; }
-   | member_access instantiation_unnamed ';'                                       { $$ = MkClassDefDeclaration(MkDeclarationClassInst($2)); $$.loc = @$; $$.decl.loc = @$; $$.memberAccess = $1; }
-   | member_access guess_instantiation_named ';'                                   { $$ = MkClassDefDeclaration(MkDeclarationClassInst($2)); $$.loc = @$; $$.decl.loc = @$; $$.memberAccess = $1; }
    | member_access class_function_definition                                       { $$ = MkClassDefFunction($2); $$.loc = @$; $$.memberAccess = $1; }
    | member_access property                       { $$ = MkClassDefProperty($2); $$.loc = @$; globalContext.nextID++; $$.memberAccess = $1; }
-
-   | default_property_list ';'      { $$ = MkClassDefDefaultProperty($1); if($1->last) ((MemberInit)$1->last).loc.end = @2.start; $$.loc = @$; }
-   | CLASS_DATA guess_declaration_specifiers struct_declarator_list ';' { $$ = MkClassDefClassData(MkStructDeclaration($2, $3, null)); $$.decl.loc = @$; $$.loc = @$; }
    | class_property                 { $$ = MkClassDefClassProperty($1); $$.loc = @$; globalContext.nextID++; }
-   | self_watch_definition ';'      { $$ = MkClassDefPropertyWatch($1); $$.loc = @$; globalContext.nextID++; }
    | WATCHABLE { $$ = null; deleteWatchable = true; }
-   | CLASS_DESIGNER identifier ';' { $$ = MkClassDefDesigner($2.string); FreeIdentifier($2); }
-   | CLASS_DESIGNER strict_type ';' { $$ = MkClassDefDesigner($2.name); FreeSpecifier($2); }
    | CLASS_NO_EXPANSION             { $$ = MkClassDefNoExpansion(); }
    | CLASS_FIXED                    { $$ = MkClassDefFixed(); }
-   | CLASS_DEFAULT_PROPERTY identifier ';' { $$ = MkClassDefDesignerDefaultProperty($2); }
    | CLASS_PROPERTY '(' identifier ')' '=' initializer_condition ';' { $$ = MkClassDefClassPropertyValue($3, $6); $$.loc = @$; }
 
    | ';' { $$ = null; }
@@ -1128,42 +1134,67 @@ struct_declaration:
 
 struct_declaration_error:
      class_function_definition_error { $$ = MkClassDefFunction($1); $$.loc = $1.loc;  $$.loc.end.charPos++; $$.loc.end.pos++; $$.memberAccess = memberAccessStack[defaultMemberAccess]; }
+
+// Moved all these in here without the ';'
+   | guess_declaration_specifiers                                { $$ = MkClassDefDeclaration(MkStructDeclaration($1, null, null)); $$.decl.loc = @$; $$.loc = @$; $$.memberAccess = memberAccessStack[defaultMemberAccess]; }
+       | guess_declaration_specifiers struct_declarator_list          { $$ = MkClassDefDeclaration(MkStructDeclaration($1, $2, null)); $$.decl.loc = @$; $$.loc = @$; $$.memberAccess = memberAccessStack[defaultMemberAccess]; }
+       | member_access guess_declaration_specifiers struct_declarator_list         { $$ = MkClassDefDeclaration(MkStructDeclaration($2, $3, null)); $$.decl.loc = @$; $$.loc = @$; $$.memberAccess = $1; }
+   | member_access guess_declaration_specifiers                                { $$ = MkClassDefDeclaration(MkStructDeclaration($2, null, null)); $$.decl.loc = @$; $$.loc = @$; $$.memberAccess = $1; }
+   | member_access instantiation_unnamed                                       { $$ = MkClassDefDeclaration(MkDeclarationClassInst($2)); $$.loc = @$; $$.decl.loc = @$; $$.memberAccess = $1; }
+   | member_access guess_instantiation_named                                   { $$ = MkClassDefDeclaration(MkDeclarationClassInst($2)); $$.loc = @$; $$.decl.loc = @$; $$.memberAccess = $1; }
+   | CLASS_DATA guess_declaration_specifiers struct_declarator_list { $$ = MkClassDefClassData(MkStructDeclaration($2, $3, null)); $$.decl.loc = @$; $$.loc = @$; }
+   | self_watch_definition      { $$ = MkClassDefPropertyWatch($1); $$.loc = @$; globalContext.nextID++; }
+   | CLASS_DESIGNER identifier { $$ = MkClassDefDesigner($2.string); FreeIdentifier($2); }
+   | CLASS_DESIGNER strict_type { $$ = MkClassDefDesigner($2.name); FreeSpecifier($2); }
+   | CLASS_DEFAULT_PROPERTY identifier { $$ = MkClassDefDesignerDefaultProperty($2); }
+   | instantiation_unnamed                                       { $$ = MkClassDefDeclaration(MkDeclarationClassInst($1)); $$.loc = @$; $$.decl.loc = @$; $$.memberAccess = memberAccessStack[defaultMemberAccess]; }
+   | guess_instantiation_named                                   { $$ = MkClassDefDeclaration(MkDeclarationClassInst($1)); $$.loc = @$; $$.decl.loc = @$; $$.memberAccess = memberAccessStack[defaultMemberAccess]; }
+   | default_property_list     { $$ = MkClassDefDefaultProperty($1); if($1->last) ((MemberInit)$1->last).loc.end = @1.end; $$.loc = @$; }
+
    | guess_instantiation_named_error error { $$ = MkClassDefDeclaration(MkDeclarationClassInst($1)); $$.loc = $1.loc; $$.decl.loc = $$.loc;  $$.memberAccess = memberAccessStack[defaultMemberAccess]; }
    | instantiation_unnamed_error error { $$ = MkClassDefDeclaration(MkDeclarationClassInst($1)); $$.loc = $1.loc; $$.decl.loc = $$.loc;  $$.memberAccess = memberAccessStack[defaultMemberAccess]; }
-   | guess_instantiation_named { $$ = MkClassDefDeclaration(MkDeclarationClassInst($1)); $$.loc = $1.loc; $$.decl.loc = $$.loc;  $$.memberAccess = memberAccessStack[defaultMemberAccess]; }
-   | instantiation_unnamed { $$ = MkClassDefDeclaration(MkDeclarationClassInst($1)); $$.loc = $1.loc; $$.decl.loc = $$.loc;  $$.memberAccess = memberAccessStack[defaultMemberAccess]; }
+//   | guess_instantiation_named { $$ = MkClassDefDeclaration(MkDeclarationClassInst($1)); $$.loc = $1.loc; $$.decl.loc = $$.loc;  $$.memberAccess = memberAccessStack[defaultMemberAccess]; }
+//   | instantiation_unnamed { $$ = MkClassDefDeclaration(MkDeclarationClassInst($1)); $$.loc = $1.loc; $$.decl.loc = $$.loc;  $$.memberAccess = memberAccessStack[defaultMemberAccess]; }
 
    | member_access class_function_definition_error { $$ = MkClassDefFunction($2); $$.loc = @$;  $$.loc.end.charPos++; $$.loc.end.pos++; $$.memberAccess = $1; }
    | member_access guess_instantiation_named_error error { $$ = MkClassDefDeclaration(MkDeclarationClassInst($2)); $$.loc = @$; $$.decl.loc = $$.loc; $$.memberAccess = $1; }
    | member_access instantiation_unnamed_error error { $$ = MkClassDefDeclaration(MkDeclarationClassInst($2)); $$.loc = @$; $$.decl.loc = $$.loc; $$.memberAccess = $1; }
-   | member_access guess_instantiation_named { $$ = MkClassDefDeclaration(MkDeclarationClassInst($2)); $$.loc = @$; $$.decl.loc = $$.loc; $$.memberAccess = $1; }
-   | member_access instantiation_unnamed { $$ = MkClassDefDeclaration(MkDeclarationClassInst($2)); $$.loc = @$; $$.decl.loc = $$.loc; $$.memberAccess = $1; }
+//   | member_access guess_instantiation_named { $$ = MkClassDefDeclaration(MkDeclarationClassInst($2)); $$.loc = @$; $$.decl.loc = $$.loc; $$.memberAccess = $1; }
+//   | member_access instantiation_unnamed { $$ = MkClassDefDeclaration(MkDeclarationClassInst($2)); $$.loc = @$; $$.decl.loc = $$.loc; $$.memberAccess = $1; }
 
    | default_property_list_error { $$ = MkClassDefDefaultProperty($1); $$.loc = @$;  $$.loc.end.charPos++; $$.loc.end.pos++; }
    ;
 
 struct_declaration_list:
          struct_declaration { $$ = MkList(); ListAdd($$, $1); }
-       | struct_declaration_list struct_declaration   { ListAdd($1, $2); }
-   | struct_declaration_list_error struct_declaration   { ListAdd($1, $2); }
+       | struct_declaration_list struct_declaration   { $$ = $1; ListAdd($1, $2); }
+   | struct_declaration_list_error struct_declaration   { $$ = $1; ListAdd($1, $2); }
        ;
 
 struct_declaration_list_error:
      struct_declaration_error { $$ = MkList(); ListAdd($$, $1); }
    | struct_declaration_list error
    | struct_declaration_list_error error
-   | struct_declaration_list struct_declaration_error { ListAdd($$, $2); }
-   | struct_declaration_list_error struct_declaration_error { ListAdd($$, $2); }
+   | struct_declaration_list struct_declaration_error { $$ = $1; ListAdd($$, $2); }
+   | struct_declaration_list_error struct_declaration_error { $$ = $1; ListAdd($$, $2); }
        ;
 
 template_datatype:
-     declaration_specifiers { $$ = MkTemplateDatatype($1, null); }
-   | declaration_specifiers abstract_declarator { $$ = MkTemplateDatatype($1, $2); }
-   | identifier { $$ = MkTemplateDatatype(MkListOne(MkSpecifierName($1.string)), null); FreeIdentifier($1); }
+     guess_declaration_specifiers { $$ = MkTemplateDatatype($1, null); }
+   | guess_declaration_specifiers abstract_declarator { $$ = MkTemplateDatatype($1, $2); }
+//   | identifier { $$ = MkTemplateDatatype(MkListOne(MkSpecifierName($1.string)), null); FreeIdentifier($1); }
    ;
 
 template_type_argument:
-     template_datatype { $$ = MkTemplateTypeArgument($1); }
+//     template_datatype { $$ = MkTemplateTypeArgument($1); }
+
+//    Explicitly copied the rules here to handle:
+//      ast.ec:  Map<List<Location>> intlStrings { };
+//          vs
+//      LinkList.ec:   class LinkList<bool circ = false>
+
+     guess_declaration_specifiers { $$ = MkTemplateTypeArgument(MkTemplateDatatype($1, null)); }
+   | guess_declaration_specifiers abstract_declarator { $$ = MkTemplateTypeArgument(MkTemplateDatatype($1, $2)); }
    ;
 
 template_type_parameter:
@@ -1187,12 +1218,16 @@ template_identifier_parameter:
    ;
 
 template_expression_argument:
-     constant_expression { $$ = MkTemplateExpressionArgument($1); }
+     shift_expression /*constant_expression*/ { $$ = MkTemplateExpressionArgument($1); }
    ;
 
 template_expression_parameter:
+/*
      template_datatype identifier     { $$ = MkExpressionTemplateParameter($2, $1, null); }
    | template_datatype identifier '=' template_expression_argument    { $$ = MkExpressionTemplateParameter($2, $1, $4); }
+*/
+     guess_declaration_specifiers identifier '=' template_expression_argument    { $$ = MkExpressionTemplateParameter($2, MkTemplateDatatype($1, null), $4); }
+   | guess_declaration_specifiers abstract_declarator identifier '=' template_expression_argument    { $$ = MkExpressionTemplateParameter($3, MkTemplateDatatype($1, $2), $5); }
    ;
 
 template_parameter:
@@ -1203,7 +1238,7 @@ template_parameter:
 
 template_parameters_list:
      template_parameter                               { $$ = MkList(); ListAdd($$, $1); }
-   | template_parameters_list ',' template_parameter  { ListAdd($1, $3); }
+   | template_parameters_list ',' template_parameter  { $$ = $1; ListAdd($1, $3); }
    ;
 
 template_argument:
@@ -1213,7 +1248,7 @@ template_argument:
    | identifier '=' template_expression_argument   { $$ = $3; $$.name = $1; $$.loc = @$; }
    | identifier '=' template_identifier_argument   { $$ = $3; $$.name = $1; $$.loc = @$; }
    | identifier '=' template_type_argument         { $$ = $3; $$.name = $1; $$.loc = @$; }
-   | template_datatype '=' template_expression_argument 
+   /*| template_datatype '=' template_expression_argument
    {
       $$ = $3; 
       if($1.specifiers && $1.specifiers->first)
@@ -1248,51 +1283,55 @@ template_argument:
       }
       FreeTemplateDataType($1);
       $$.loc = @$;
-   }
+   }*/
    ;
 
 template_arguments_list:
      template_argument                                { $$ = MkList(); ListAdd($$, $1); }
-   | template_arguments_list ',' template_argument    { ListAdd($1, $3); }
+   | template_arguments_list ',' template_argument    { $$ = $1; ListAdd($1, $3); }
    ;
 
 class_entry:
    CLASS
    {
-      PushContext();
+      if(curContext != globalContext)
+         PopContext(curContext);
+      $$ = PushContext();
    };
 
 class_decl:
-     class_entry identifier { $$ = DeclClassAddNameSpace(globalContext.nextID++, $2.string); FreeIdentifier($2); $$.nameLoc = @2; memberAccessStack[++defaultMemberAccess] = privateAccess; }
+     class_entry identifier { $1; $$ = DeclClassAddNameSpace(globalContext.nextID++, $2.string); FreeIdentifier($2); $$.nameLoc = @2; memberAccessStack[++defaultMemberAccess] = privateAccess; }
    | class_entry base_strict_type 
    { 
-      $$ = DeclClass(globalContext.nextID++, $2.name); 
+      $1; $$ = DeclClass(globalContext.nextID++, $2.name); 
       $$.nameLoc = @2; 
       FreeSpecifier($2); 
       ++defaultMemberAccess;
       memberAccessStack[defaultMemberAccess] = privateAccess;
    }
-   | identifier class_entry identifier { $$ = DeclClassAddNameSpace(globalContext.nextID++, $3.string); FreeIdentifier($1); FreeIdentifier($3); $$.nameLoc = @3; $$.isRemote = true; memberAccessStack[++defaultMemberAccess] = privateAccess; }
-   | identifier class_entry base_strict_type { $$ = DeclClass(globalContext.nextID++, $3.name); FreeIdentifier($1); $$.nameLoc = @3; $$.isRemote = true; FreeSpecifier($3); memberAccessStack[++defaultMemberAccess] = privateAccess; }
+   | identifier class_entry identifier { $2; $$ = DeclClassAddNameSpace(globalContext.nextID++, $3.string); FreeIdentifier($1); FreeIdentifier($3); $$.nameLoc = @3; $$.isRemote = true; memberAccessStack[++defaultMemberAccess] = privateAccess; }
+   | identifier class_entry base_strict_type { $2; $$ = DeclClass(globalContext.nextID++, $3.name); FreeIdentifier($1); $$.nameLoc = @3; $$.isRemote = true; FreeSpecifier($3); memberAccessStack[++defaultMemberAccess] = privateAccess; }
 
-   | class_entry identifier '<' template_parameters_list '>' { $$ = DeclClassAddNameSpace(globalContext.nextID++, $2.string); $$.templateParams = $4; FreeIdentifier($2); $$.nameLoc = @2; memberAccessStack[++defaultMemberAccess] = privateAccess; }
+   | class_entry identifier '<' template_parameters_list '>' { $1; $$ = DeclClassAddNameSpace(globalContext.nextID++, $2.string); $$.templateParams = $4; FreeIdentifier($2); $$.nameLoc = @2; memberAccessStack[++defaultMemberAccess] = privateAccess; }
    | class_entry base_strict_type '<' template_parameters_list '>' 
    { 
-      $$ = DeclClass(globalContext.nextID++, $2.name);
+      $1; $$ = DeclClass(globalContext.nextID++, $2.name);
       $$.templateParams = $4; 
       $$.nameLoc = @2; 
       FreeSpecifier($2); 
       ++defaultMemberAccess;
       memberAccessStack[defaultMemberAccess] = privateAccess;
    }
-   | identifier class_entry identifier '<' template_parameters_list '>' { $$ = DeclClassAddNameSpace(globalContext.nextID++, $3.string); $$.templateParams = $5; FreeIdentifier($1); FreeIdentifier($3); $$.nameLoc = @3; $$.isRemote = true; memberAccessStack[++defaultMemberAccess] = privateAccess; }
-   | identifier class_entry base_strict_type '<' template_parameters_list '>' { $$ = DeclClass(globalContext.nextID++, $3.name); $$.templateParams = $5; FreeIdentifier($1); $$.nameLoc = @3; $$.isRemote = true; FreeSpecifier($3); memberAccessStack[++defaultMemberAccess] = privateAccess; }
+   | identifier class_entry identifier '<' template_parameters_list '>' { $2; $$ = DeclClassAddNameSpace(globalContext.nextID++, $3.string); $$.templateParams = $5; FreeIdentifier($1); FreeIdentifier($3); $$.nameLoc = @3; $$.isRemote = true; memberAccessStack[++defaultMemberAccess] = privateAccess; }
+   | identifier class_entry base_strict_type '<' template_parameters_list '>' { $2; $$ = DeclClass(globalContext.nextID++, $3.name); $$.templateParams = $5; FreeIdentifier($1); $$.nameLoc = @3; $$.isRemote = true; FreeSpecifier($3); memberAccessStack[++defaultMemberAccess] = privateAccess; }
+
    ;
 
 class:
      class_error '}'
       {
          $$.loc = @$;
+         $$ = $1; 
       }
 
    // Added this for unit classes...
@@ -1318,13 +1357,13 @@ class:
 
        | class_entry identifier ';'
       {
-         $$ = MkClass(DeclClassAddNameSpace(0, $2.string), null, null); FreeIdentifier($2);
+         $1; $$ = MkClass(DeclClassAddNameSpace(0, $2.string), null, null); FreeIdentifier($2);
          POP_DEFAULT_ACCESS
          PopContext(curContext);
       }
        | class_entry type ';'
       {
-         $$ = MkClass(DeclClass(0, $2.name), null, null); FreeSpecifier($2);
+         $1; $$ = MkClass(DeclClass(0, $2.name), null, null); FreeSpecifier($2);
          POP_DEFAULT_ACCESS
          PopContext(curContext);
       }
@@ -1389,6 +1428,12 @@ primary_expression:
       { $$ = MkExpBrackets($2); $$.loc = @$; }
    ;
 
+i18n_string:
+         string_literal     { $$ = MkExpString($1); delete $1; $$.loc = @$; }
+   | '$' string_literal     { $$ = MkExpIntlString($2, null); delete $2; $$.loc = @$; }
+   | '$' string_literal '.' string_literal     { $$ = MkExpIntlString($4, $2); delete $2; delete $4; $$.loc = @$; }
+   ;
+
 simple_primary_expression:
          identifier         { $$ = MkExpIdentifier($1); $$.loc = @$; }
    | instantiation_unnamed      { $$ = MkExpInstance($1); $$.loc = @$; }
@@ -1397,7 +1442,7 @@ simple_primary_expression:
    | EXTENSION '(' type_name ')' initializer     { $$ = MkExpExtensionInitializer($3, $5); $$.loc = @$; }
    | EXTENSION '(' type_name ')' '(' type_name ')' initializer     { $$ = MkExpExtensionInitializer($3, MkInitializerAssignment(MkExpExtensionInitializer($6, $8))); $$.loc = @$; }
        | CONSTANT           { $$ = MkExpConstant(yytext); $$.loc = @$; }
-       | string_literal     { $$ = MkExpString($1); delete $1; $$.loc = @$; }
+   | i18n_string
    | '(' ')' { Expression exp = MkExpDummy(); exp.loc.start = @1.end; exp.loc.end = @2.start; $$ = MkExpBrackets(MkListOne(exp)); $$.loc = @$; yyerror(); }
    | NEWOP new_specifiers abstract_declarator_noarray '[' constant_expression ']' { $$ = MkExpNew(MkTypeName($2,$3), $5); $$.loc = @$; }
    | NEWOP new_specifiers abstract_declarator_noarray '[' constant_expression_error ']' { $$ = MkExpNew(MkTypeName($2,$3), $5); $$.loc = @$; }
@@ -1491,16 +1536,16 @@ simple_postfix_expression:
 argument_expression_list:
          assignment_expression          { $$ = MkList(); ListAdd($$, $1); }
    | anon_instantiation_expression  { $$ = MkList(); ListAdd($$, $1); }
-       | argument_expression_list ',' assignment_expression   { ListAdd($1, $3);  }
-   | argument_expression_list ',' anon_instantiation_expression   { ListAdd($1, $3);  }
+       | argument_expression_list ',' assignment_expression   { $$ = $1; ListAdd($1, $3);  }
+   | argument_expression_list ',' anon_instantiation_expression   { $$ = $1; ListAdd($1, $3);  }
        ;
 
 argument_expression_list_error:
      assignment_expression_error    { $$ = MkList(); ListAdd($$, $1); }
    | anon_instantiation_expression_error    { $$ = MkList(); ListAdd($$, $1); }
-   | argument_expression_list ',' assignment_expression_error  { ListAdd($1, $3);  }
-   | argument_expression_list ',' anon_instantiation_expression_error  { ListAdd($1, $3);  }
-   | argument_expression_list ',' { Expression exp = MkExpDummy(); exp.loc.start = @2.end; exp.loc.end = @2.end; ListAdd($1, exp); }
+   | argument_expression_list ',' assignment_expression_error  { $$ = $1; ListAdd($1, $3);  }
+   | argument_expression_list ',' anon_instantiation_expression_error  { $$ = $1; ListAdd($1, $3);  }
+   | argument_expression_list ',' { Expression exp = MkExpDummy(); exp.loc.start = @2.end; exp.loc.end = @2.end; $$ = $1; ListAdd($1, exp); }
        ;
 
 common_unary_expression:
@@ -1513,6 +1558,10 @@ common_unary_expression:
    | SIZEOF '(' guess_type_name ')'          { $$ = MkExpTypeSize($3); $$.loc = @$; }
    | SIZEOF '(' CLASS type ')'          { $$ = MkExpClassSize($4); $$.loc = @$; }
    | SIZEOF '(' CLASS guess_type ')'          { $$ = MkExpClassSize($4); $$.loc = @$; }
+
+       | ALIGNOF '(' unary_expression ')'         { $$ = MkExpOp(null, ALIGNOF, $3); $$.loc = @$; }
+   | ALIGNOF simple_unary_expression           { $$ = MkExpOp(null, ALIGNOF, $2); $$.loc = @$; }
+   | ALIGNOF '(' guess_type_name ')'          { $$ = MkExpTypeAlign($3); $$.loc = @$; }
        ;
 
 unary_expression:
@@ -1691,15 +1740,15 @@ assignment_operator:
 
 expression: 
    assignment_expression                 { $$ = MkList(); ListAdd($$, $1); }
-       | expression ',' assignment_expression  { ListAdd($1, $3); }
-   | expression_error ',' assignment_expression  { ListAdd($1, $3); }
+       | expression ',' assignment_expression  { $$ = $1; ListAdd($1, $3); }
+   | expression_error ',' assignment_expression  { $$ = $1; ListAdd($1, $3); }
    | expression_error  ')'
        ;
 
 expression_anon_inst: 
      anon_instantiation_expression                 { $$ = MkList(); ListAdd($$, $1); }
-   | expression ',' anon_instantiation_expression  { ListAdd($1, $3); }
-       | expression_error ',' anon_instantiation_expression  { ListAdd($1, $3); }
+   | expression ',' anon_instantiation_expression  { $$ = $1; ListAdd($1, $3); }
+       | expression_error ',' anon_instantiation_expression  { $$ = $1; ListAdd($1, $3); }
    ;
 
 postfix_expression_error:
@@ -1713,13 +1762,17 @@ postfix_expression_error:
 
    | postfix_expression '(' argument_expression_list { $$ = MkExpCall($1, $3); $$.call.argLoc.start = @2.start; $$.call.argLoc.end = @3.end; $$.loc = @$; $$.call.argLoc.end.charPos++;} 
        | postfix_expression '(' argument_expression_list_error { $$ = MkExpCall($1, $3); $$.call.argLoc.start = @2.start; $$.call.argLoc.end = @3.end; $$.loc = @$; $$.call.argLoc.end.charPos++;} 
+   /* Useless rules due to conflicts
    | postfix_expression '(' argument_expression_list ',' error { $$ = MkExpCall($1, $3); $$.call.argLoc.start = @2.start; $$.call.argLoc.end = @4.end;$$.loc = @$; $$.call.argLoc.end.charPos++;}
-   | postfix_expression '(' error { $$ = MkExpCall($1, MkList() ); @$.end = yylloc.start; $$.loc = @$; $$.call.argLoc.start = @2.start; $$.call.argLoc.end = yylloc.start; /*@2.end; $$.call.argLoc.end.charPos++;*/ }
+   | postfix_expression '(' error { $$ = MkExpCall($1, MkList() ); @$.end = yylloc.start; $$.loc = @$; $$.call.argLoc.start = @2.start; $$.call.argLoc.end = yylloc.start; }
+   */
    | postfix_expression '.' error                   { $$ = MkExpMember($1, null); $$.loc = @$; }
 
        | postfix_expression_error '(' argument_expression_list_error { $$ = MkExpCall($1, $3); $$.loc = @$; $$.call.argLoc.start = @2.start; $$.call.argLoc.end = @3.end; $$.call.argLoc.end.charPos++;} 
+   /* Useless rules due to conflicts
    | postfix_expression_error '(' argument_expression_list ',' error { $$ = MkExpCall($1, $3); $$.loc = @$; $$.call.argLoc.start = @2.start; $$.call.argLoc.end = @4.end; $$.call.argLoc.end.charPos++;}
    | postfix_expression_error '(' error { $$ = MkExpCall($1, MkList() ); $$.loc = @$; $$.call.argLoc.start = @2.start; $$.call.argLoc.end = @2.end; $$.call.argLoc.end.charPos++;}
+   */
    | postfix_expression_error '.' error                   { $$ = MkExpMember($1, null); $$.loc = @$; }
        ;
 
@@ -1733,13 +1786,17 @@ simple_postfix_expression_error:
 
    | simple_postfix_expression '(' argument_expression_list { $$ = MkExpCall($1, $3); $$.call.argLoc.start = @2.start; $$.call.argLoc.end = @3.end; $$.loc = @$; $$.call.argLoc.end.charPos++;} 
        | simple_postfix_expression '(' argument_expression_list_error { $$ = MkExpCall($1, $3); $$.call.argLoc.start = @2.start; $$.call.argLoc.end = @3.end; $$.loc = @$; $$.call.argLoc.end.charPos++;} 
+   /* Useless rules due to conflicts
    | simple_postfix_expression '(' argument_expression_list ',' error { $$ = MkExpCall($1, $3); $$.call.argLoc.start = @2.start; $$.call.argLoc.end = @4.end;$$.loc = @$; $$.call.argLoc.end.charPos++;}
-   | simple_postfix_expression '(' error { $$ = MkExpCall($1, MkList() ); @$.end = yylloc.start; $$.loc = @$; $$.call.argLoc.start = @2.start; $$.call.argLoc.end = yylloc.start; /*@2.end; $$.call.argLoc.end.charPos++;*/ }
+   | simple_postfix_expression '(' error { $$ = MkExpCall($1, MkList() ); @$.end = yylloc.start; $$.loc = @$; $$.call.argLoc.start = @2.start; $$.call.argLoc.end = yylloc.start; }
+   */
    | simple_postfix_expression '.' error                   { $$ = MkExpMember($1, null); $$.loc = @$; }
 
-       | simple_postfix_expression_error '(' argument_expression_list_error { $$ = MkExpCall($1, $3); $$.loc = @$; $$.call.argLoc.start = @2.start; $$.call.argLoc.end = @3.end; $$.call.argLoc.end.charPos++;} 
+       | simple_postfix_expression_error '(' argument_expression_list_error { $$ = MkExpCall($1, $3); $$.loc = @$; $$.call.argLoc.start = @2.start; $$.call.argLoc.end = @3.end; $$.call.argLoc.end.charPos++;}
+   /* Useless rules due to conflicts
    | simple_postfix_expression_error '(' argument_expression_list ',' error { $$ = MkExpCall($1, $3); $$.loc = @$; $$.call.argLoc.start = @2.start; $$.call.argLoc.end = @4.end; $$.call.argLoc.end.charPos++;}
    | simple_postfix_expression_error '(' error { $$ = MkExpCall($1, MkList() ); $$.loc = @$; $$.call.argLoc.start = @2.start; $$.call.argLoc.end = @2.end; $$.call.argLoc.end.charPos++;}
+   */
    | simple_postfix_expression_error '.' error                   { $$ = MkExpMember($1, null); $$.loc = @$; }
        ;
 
@@ -1753,6 +1810,9 @@ common_unary_expression_error:
         | SIZEOF '(' guess_type_name ')' error          { $$ = MkExpTypeSize($3); $$.loc = @$; }
     | SIZEOF '(' CLASS type ')' error   { $$ = MkExpClassSize($4); $$.loc = @$; }
     | SIZEOF '(' CLASS guess_type ')' error   { $$ = MkExpClassSize($4); $$.loc = @$; }
+    | ALIGNOF '(' unary_expression_error           { $$ = MkExpOp(null, ALIGNOF, $3); $$.loc = @$; }
+        | ALIGNOF simple_unary_expression_error           { $$ = MkExpOp(null, ALIGNOF, $2); $$.loc = @$; }
+        | ALIGNOF '(' guess_type_name ')' error          { $$ = MkExpTypeAlign($3); $$.loc = @$; }
        ;
 
 unary_expression_error:
@@ -1784,13 +1844,21 @@ multiplicative_expression_error:
 additive_expression_error:
     multiplicative_expression_error
        | additive_expression '+' multiplicative_expression_error  { $$ = MkExpOp($1, '+', $3); $$.loc = @$; }
+   /* Useless rules due to conflicts
        | additive_expression '+' error { $$ = MkExpOp($1, '+', null); $$.loc = @$; }
+   */
        | additive_expression '-' multiplicative_expression_error  { $$ = MkExpOp($1, '-', $3); $$.loc = @$; }
+   /* Useless rules due to conflicts
    | additive_expression '-' error { $$ = MkExpOp($1, '-', null); $$.loc = @$; }
+   */
        | additive_expression_error '+' multiplicative_expression_error  { $$ = MkExpOp($1, '+', $3); $$.loc = @$; }
+   /* Useless rules due to conflicts
        | additive_expression_error '+' error { $$ = MkExpOp($1, '+', null); $$.loc = @$; }
+   */
        | additive_expression_error '-' multiplicative_expression_error  { $$ = MkExpOp($1, '-', $3); $$.loc = @$; }
+   /* Useless rules due to conflicts
    | additive_expression_error '-' error { $$ = MkExpOp($1, '-', null); $$.loc = @$; }
+   */
        ;
 
 shift_expression_error:
@@ -1821,24 +1889,25 @@ relational_expression_error:
          skipErrors = false;
 
          FreeExpression($1);
+         FreeExpression($2);
          
          fileInput.Seek(@1.start.pos, start); 
          resetScannerPos(&@1.start);
          yyclearin;
 
-         YYPOPSTACK;
+         YYPOPSTACK(1);
          yystate = *yyssp;
          YY_STACK_PRINT (yyss, yyssp);
 
-         YYPOPSTACK;
+         YYPOPSTACK(1);
          yystate = *yyssp;
          YY_STACK_PRINT (yyss, yyssp);
 /*         
-         YYPOPSTACK;
+         YYPOPSTACK(1);
          yystate = *yyssp;
          YY_STACK_PRINT (yyss, yyssp);
 
-         YYPOPSTACK;
+         YYPOPSTACK(1);
          yystate = *yyssp;
          YY_STACK_PRINT (yyss, yyssp);
 */
@@ -1868,12 +1937,12 @@ equality_expression_error:
          | equality_expression NE_OP relational_expression_error  { $$ = MkExpOp($1, NE_OP, $3); $$.loc = @$; }
      | equality_expression_error EQ_OP relational_expression_error  { $$ = MkExpOp($1, EQ_OP, $3); $$.loc = @$; }
          | equality_expression_error NE_OP relational_expression_error  { $$ = MkExpOp($1, NE_OP, $3); $$.loc = @$; }
-
+     /* Useless rules due to conflicts
      | equality_expression EQ_OP error        { $$ = MkExpOp($1, EQ_OP, MkExpDummy()); $$.loc = @$; }
          | equality_expression NE_OP error        { $$ = MkExpOp($1, NE_OP, MkExpDummy()); $$.loc = @$; }
      | equality_expression_error EQ_OP error  { $$ = MkExpOp($1, EQ_OP, MkExpDummy()); $$.loc = @$; }
          | equality_expression_error NE_OP error  { $$ = MkExpOp($1, NE_OP, MkExpDummy()); $$.loc = @$; }
-
+     */
      | equality_expression EQ_OP anon_instantiation_expression_error  { $$ = MkExpOp($1, EQ_OP, $3); $$.loc = @$; }
          | equality_expression NE_OP anon_instantiation_expression_error  { $$ = MkExpOp($1, NE_OP, $3); $$.loc = @$; }
      | equality_expression_error EQ_OP anon_instantiation_expression_error  { $$ = MkExpOp($1, EQ_OP, $3); $$.loc = @$; }
@@ -1973,9 +2042,13 @@ conditional_expression_error:
 assignment_expression_error:
      conditional_expression_error
    | unary_expression assignment_operator assignment_expression_error   { $$ = MkExpOp($1, $2, $3); $$.loc = @$; }
+   /* Useless rules due to conflicts
    | unary_expression assignment_operator error   { $$ = MkExpOp($1, $2, MkExpDummy()); $$.loc = @$; $$.op.exp2.loc = @2; }
+   */
    | unary_expression_error assignment_operator assignment_expression_error   { $$ = MkExpOp($1, $2, $3); $$.loc = @$; }
+   /* Useless rules due to conflicts
    | unary_expression_error assignment_operator error   { $$ = MkExpOp($1, $2, MkExpDummy()); $$.loc = @$; $$.op.exp2.loc = @2; }
+   */
 
    | unary_expression assignment_operator anon_instantiation_expression_error   { $$ = MkExpOp($1, $2, $3); $$.loc = @$; }
    | unary_expression_error assignment_operator anon_instantiation_expression_error   { $$ = MkExpOp($1, $2, $3); $$.loc = @$; }
@@ -1984,21 +2057,23 @@ assignment_expression_error:
 expression_error: 
      assignment_expression_error                 { $$ = MkList(); ListAdd($$, $1); }
    | assignment_expression error                 { $$ = MkList(); ListAdd($$, $1); }
-   | expression ',' assignment_expression_error  { ListAdd($1, $3); }
-       | expression_error ',' assignment_expression_error  { ListAdd($1, $3); }
+   | expression ',' assignment_expression_error  { $$ = $1; ListAdd($1, $3); }
+       | expression_error ',' assignment_expression_error  { $$ = $1; ListAdd($1, $3); }
+   /* Useless rules due to conflicts
    | expression ',' error 
    | expression_error ',' error 
    | expression error
-   | expression expression
-   | expression_error expression
-   | expression expression_error
+   */
+   | expression expression                      { $$ = $1; FreeList($2, FreeExpression); }
+   | expression_error expression                { $$ = $1; FreeList($2, FreeExpression); }
+   | expression expression_error                { $$ = $1; FreeList($2, FreeExpression); }
    ;
 
 expression_anon_inst_error: 
      anon_instantiation_expression_error                 { $$ = MkList(); ListAdd($$, $1); }
    | anon_instantiation_expression error                 { $$ = MkList(); ListAdd($$, $1); }
-   | expression ',' anon_instantiation_expression_error  { ListAdd($1, $3); }
-       | expression_error ',' anon_instantiation_expression_error  { ListAdd($1, $3); }
+   | expression ',' anon_instantiation_expression_error  { $$ = $1; ListAdd($1, $3); }
+       | expression_error ',' anon_instantiation_expression_error  { $$ = $1; ListAdd($1, $3); }
    ;
 
 
@@ -2031,7 +2106,7 @@ enumerator:
 
 enumerator_list:
          enumerator                        { $$ = MkList(); ListAdd($$, $1); }
-       | enumerator_list ',' enumerator    { ListAdd($1, $3); }
+       | enumerator_list ',' enumerator    { $$ = $1; ListAdd($1, $3); }
    | enumerator_list ','
        ;
 
@@ -2045,7 +2120,7 @@ enum_specifier_nocompound:
    ;
 
 enum_specifier_compound:
-         enum_specifier_compound_error '}' { $$.loc = @$; POP_DEFAULT_ACCESS }
+         enum_specifier_compound_error '}' { $$.loc = @$; POP_DEFAULT_ACCESS $$ = $1; }
        | enum_specifier identifier '{' '}'    { $$ = MkEnum($2, null); $$.loc = @$; POP_DEFAULT_ACCESS }
    | enum_specifier strict_type '{' '}'          { $$ = MkEnum(MkIdentifier($2.name), null); FreeSpecifier($2); $$.loc = @$; POP_DEFAULT_ACCESS }
        ;
@@ -2073,7 +2148,7 @@ enum_decl:
    ;
 
 enum_class:
-     enum_class_error '}'  { $$.loc = @$; }
+     enum_class_error '}'  { $$ = $1; $$.loc = @$; }
    | enum_decl ':' inheritance_specifiers '{' '}' { $$ = MkEnum($1, null); $$.baseSpecs = $3; $$.loc = @$; POP_DEFAULT_ACCESS }
    | enum_decl '{' '}'    { $$ = MkEnum($1, null); POP_DEFAULT_ACCESS }
    ;
@@ -2110,8 +2185,7 @@ class_specifier_error:
    ;
 
 ext_storage:
-     EXT_STORAGE  { $$ = MkSpecifierExtended(yytext); }
-   | ext_decl   { $$ = MkSpecifierExtended($1); delete $1; }
+   ext_decl   { $$ = MkSpecifierExtended($1); }
    ;
 
 type_qualifier:
@@ -2123,7 +2197,7 @@ type_qualifier:
 
 type_qualifier_list:
          type_qualifier                          { $$ = MkList(); ListAdd($$, $1); }
-       | type_qualifier_list type_qualifier      { ListAdd($1, $2);  }
+       | type_qualifier_list type_qualifier      { $$ = $1; ListAdd($1, $2);  }
        ;
 
 type_specifier:
@@ -2177,31 +2251,31 @@ strict_type_specifier:
 // TESTING declarator_nofunction here... For function declarations
 
 struct_declarator:
-         declarator_nofunction
+         declarator_nofunction_type_ok
       { $$ = MkStructDeclarator($1, null); $$.loc = @$; }
-       | declarator_nofunction ext_attrib
+       | declarator_nofunction_type_ok attrib
       { $$ = MkStructDeclarator($1, null); $$.structDecl.attrib = $2; $$.loc = @$; }  
        | ':' constant_expression
       { $$ = MkStructDeclarator(null, $2);  $$.loc = @$; }
-       | declarator_nofunction ':' constant_expression
+       | declarator_nofunction_type_ok ':' constant_expression
       { $$ = MkStructDeclarator($1, $3);  $$.loc = @$; }
-   | declarator_nofunction ':' constant_expression ':' constant_expression
+   | declarator_nofunction_type_ok ':' constant_expression ':' constant_expression
       { $$ = MkStructDeclarator($1, $3); $$.structDecl.posExp = $5; $$.loc = @$; }
        | ':' constant_expression_error
       { $$ = MkStructDeclarator(null, $2);  $$.loc = @$; }
-       | declarator_nofunction ':' constant_expression_error
+       | declarator_nofunction_type_ok ':' constant_expression_error
       { $$ = MkStructDeclarator($1, $3);  $$.loc = @$; }
-   | declarator_nofunction ':' constant_expression ':' constant_expression_error
+   | declarator_nofunction_type_ok ':' constant_expression ':' constant_expression_error
       { $$ = MkStructDeclarator($1, $3); $$.structDecl.posExp = $5; $$.loc = @$; }
-   | declarator_nofunction ':' constant_expression_error ':' constant_expression_error
+   | declarator_nofunction_type_ok ':' constant_expression_error ':' constant_expression_error
       { $$ = MkStructDeclarator($1, $3); $$.structDecl.posExp = $5; $$.loc = @$; }
-   | declarator_nofunction ':' constant_expression_error ':' constant_expression
+   | declarator_nofunction_type_ok ':' constant_expression_error ':' constant_expression
       { $$ = MkStructDeclarator($1, $3); $$.structDecl.posExp = $5; $$.loc = @$; }
    ;
 
 struct_declarator_list:
          struct_declarator                                { $$ = MkList(); ListAdd($$, $1); }
-       | struct_declarator_list ',' struct_declarator     { ListAdd($1, $3); }
+       | struct_declarator_list ',' struct_declarator     { $$ = $1; ListAdd($1, $3); }
        ;
 
 struct_entry:
@@ -2217,12 +2291,27 @@ struct_entry:
          $$.ctx = PushContext();
          FreeSpecifier($2);
       }
+   | struct_or_union ext_decl identifier 
+      {
+         $$ = MkStructOrUnion($1, $3, null);
+         $$.extDeclStruct = $2;
+         $$.addNameSpace = true;
+         $$.ctx = PushContext();
+      }
+   | struct_or_union ext_decl base_strict_type
+      {
+         $$ = MkStructOrUnion($1, MkIdentifier($3.name), null);
+         $$.extDeclStruct = $2;
+         $$.ctx = PushContext();
+         FreeSpecifier($3);
+      }
    ;
 
 struct_or_union_specifier_compound:
-     struct_or_union_specifier_compound_error '}' { $$.loc = @$; }
+     struct_or_union_specifier_compound_error '}' { $$ = $1; $$.loc = @$; }
    | struct_entry '{' '}'                 { $$ = $1; $$.loc = @$; POP_DEFAULT_ACCESS PopContext(curContext); }
    | struct_or_union '{' '}'              { $$ = MkStructOrUnion($1, null, null); $$.loc = @$; POP_DEFAULT_ACCESS }
+   | struct_or_union ext_decl '{' '}'              { $$ = MkStructOrUnion($1, null, null); $$.extDeclStruct = $2; $$.loc = @$; POP_DEFAULT_ACCESS }
        ;
 
 struct_or_union_specifier_compound_error:
@@ -2233,6 +2322,10 @@ struct_or_union_specifier_compound_error:
        | struct_or_union '{' struct_declaration_list               { $$ = MkStructOrUnion($1, null, $3); POP_DEFAULT_ACCESS }
    | struct_or_union '{' struct_declaration_list_error               { $$ = MkStructOrUnion($1, null, $3); POP_DEFAULT_ACCESS }
    | struct_or_union '{' error              { $$ = MkStructOrUnion($1, null, null); POP_DEFAULT_ACCESS }
+
+       | struct_or_union ext_decl '{' struct_declaration_list               { $$ = MkStructOrUnion($1, null, $4); $$.extDeclStruct = $2; POP_DEFAULT_ACCESS }
+   | struct_or_union ext_decl '{' struct_declaration_list_error               { $$ = MkStructOrUnion($1, null, $4); $$.extDeclStruct = $2; POP_DEFAULT_ACCESS }
+   | struct_or_union ext_decl '{' error              { $$ = MkStructOrUnion($1, null, null); $$.extDeclStruct = $2; POP_DEFAULT_ACCESS }
        ;
 
 struct_or_union_specifier_nocompound:
@@ -2266,10 +2359,10 @@ struct_head:
    ;
 
 struct_class:
-     struct_class_error '}' { $$.loc = @$; }
+     struct_class_error '}' { $$ = $1; $$.loc = @$; }
    | struct_head '{' '}'
       { $$ = $1; POP_DEFAULT_ACCESS PopContext(curContext); }
-   | struct_decl '{' '}'   { POP_DEFAULT_ACCESS PopContext(curContext); }
+   | struct_decl '{' '}'   { $$ = $1; POP_DEFAULT_ACCESS PopContext(curContext); }
    | struct_or_union '{' '}' { $$ = MkStructOrUnion($1, null, null); POP_DEFAULT_ACCESS }
    ;
 
@@ -2319,7 +2412,7 @@ struct_class_error:
         POP_DEFAULT_ACCESS
      }
    | struct_decl '{' error
-      { POP_DEFAULT_ACCESS PopContext(curContext); }
+      { $$ = $1; POP_DEFAULT_ACCESS PopContext(curContext); }
 
        | struct_or_union '{' struct_declaration_list
       { $$ = MkStructOrUnion($1, null, $3); POP_DEFAULT_ACCESS  }
@@ -2336,86 +2429,86 @@ struct_or_union:
 
 specifier_qualifier_list:
      type_qualifier                                   { $$ = MkList(); ListAdd($$, $1); }
-   | specifier_qualifier_list  type_qualifier            { ListAdd($1, $2); }
+   | specifier_qualifier_list  type_qualifier            { $$ = $1; ListAdd($1, $2); }
    | type_specifier                                   { $$ = MkList(); ListAdd($$, $1); }
-   | specifier_qualifier_list  type_specifier            { ListAdd($1, $2); }
+   | specifier_qualifier_list  type_specifier            { $$ = $1; ListAdd($1, $2); }
    | enum_specifier_compound              { $$ = MkList(); ListAdd($$, $1); }
-       | specifier_qualifier_list enum_specifier_compound          { ListAdd($1, $2); }
+       | specifier_qualifier_list enum_specifier_compound          { $$ = $1; ListAdd($1, $2); }
    | struct_or_union_specifier_compound              { $$ = MkList(); ListAdd($$, $1); }
-       | specifier_qualifier_list struct_or_union_specifier_compound          { ListAdd($1, $2); }
+       | specifier_qualifier_list struct_or_union_specifier_compound          { $$ = $1; ListAdd($1, $2); }
    ;
 
 guess_specifier_qualifier_list:
      type_qualifier                                   { $$ = MkList(); ListAdd($$, $1); }
-   | guess_specifier_qualifier_list  type_qualifier            { ListAdd($1, $2); }
+   | guess_specifier_qualifier_list  type_qualifier            { $$ = $1; ListAdd($1, $2); }
    | type_specifier                                   { $$ = MkList(); ListAdd($$, $1); }
-   | guess_specifier_qualifier_list  type_specifier            { ListAdd($1, $2); }
+   | guess_specifier_qualifier_list  type_specifier            { $$ = $1; ListAdd($1, $2); }
    | guess_type                                       { $$ = MkList(); ListAdd($$, $1); }
-   | guess_specifier_qualifier_list  guess_type            { ListAdd($1, $2); }
+   | guess_specifier_qualifier_list  guess_type            { $$ = $1; ListAdd($1, $2); }
    | enum_specifier_compound              { $$ = MkList(); ListAdd($$, $1); }
-       | guess_specifier_qualifier_list enum_specifier_compound          { ListAdd($1, $2); }
+       | guess_specifier_qualifier_list enum_specifier_compound          { $$ = $1; ListAdd($1, $2); }
    | struct_or_union_specifier_compound              { $$ = MkList(); ListAdd($$, $1); }
-       | guess_specifier_qualifier_list struct_or_union_specifier_compound          { ListAdd($1, $2); }
+       | guess_specifier_qualifier_list struct_or_union_specifier_compound          { $$ = $1; ListAdd($1, $2); }
    ;
 
 declaration_specifiers:
      storage_class_specifier                          { $$ = MkList(); ListAdd($$, $1); }
-   | declaration_specifiers storage_class_specifier    { ListAdd($1, $2); }
+   | declaration_specifiers storage_class_specifier    { $$ = $1; ListAdd($1, $2); }
    | type_qualifier                                   { $$ = MkList(); ListAdd($$, $1); }
-   | declaration_specifiers  type_qualifier            { ListAdd($1, $2); }
+   | declaration_specifiers  type_qualifier            { $$ = $1; ListAdd($1, $2); }
    | strict_type_specifier                                   { $$ = MkList(); ListAdd($$, $1); }
-   | declaration_specifiers  strict_type_specifier            { ListAdd($1, $2); }
+   | declaration_specifiers  strict_type_specifier            { $$ = $1; ListAdd($1, $2); }
    | enum_specifier_compound              { $$ = MkList(); ListAdd($$, $1); }
-       | declaration_specifiers enum_specifier_compound          { ListAdd($1, $2); }
+       | declaration_specifiers enum_specifier_compound          { $$ = $1; ListAdd($1, $2); }
    | struct_or_union_specifier_compound              { $$ = MkList(); ListAdd($$, $1); }
-       | declaration_specifiers struct_or_union_specifier_compound          { ListAdd($1, $2); }
+       | declaration_specifiers struct_or_union_specifier_compound          { $$ = $1; ListAdd($1, $2); }
    ;
 
 guess_declaration_specifiers:
      storage_class_specifier                          { $$ = MkList(); ListAdd($$, $1); }
-   | guess_declaration_specifiers storage_class_specifier    { ListAdd($1, $2); }
+   | guess_declaration_specifiers storage_class_specifier    { $$ = $1; ListAdd($1, $2); }
    | type_qualifier                                   { $$ = MkList(); ListAdd($$, $1); }
-   | guess_declaration_specifiers  type_qualifier            { ListAdd($1, $2); }
+   | guess_declaration_specifiers  type_qualifier            { $$ = $1; ListAdd($1, $2); }
    | type_specifier                                   { $$ = MkList(); ListAdd($$, $1); }
-   | guess_declaration_specifiers  type_specifier            { ListAdd($1, $2); }
+   | guess_declaration_specifiers  type_specifier            { $$ = $1; ListAdd($1, $2); }
    | guess_type                                       { $$ = MkList(); ListAdd($$, $1); }
-       | guess_declaration_specifiers guess_type          { ListAdd($1, $2); }
+       | guess_declaration_specifiers guess_type          { $$ = $1; ListAdd($1, $2); }
    | struct_or_union_specifier_compound              { $$ = MkList(); ListAdd($$, $1); }
-       | guess_declaration_specifiers struct_or_union_specifier_compound          { ListAdd($1, $2); }
+       | guess_declaration_specifiers struct_or_union_specifier_compound          { $$ = $1; ListAdd($1, $2); }
    | enum_specifier_compound              { $$ = MkList(); ListAdd($$, $1); }
-       | guess_declaration_specifiers enum_specifier_compound          { ListAdd($1, $2); }
+       | guess_declaration_specifiers enum_specifier_compound          { $$ = $1; ListAdd($1, $2); }
    ;
 
 external_guess_declaration_specifiers:
      external_storage_class_specifier                          { $$ = MkList(); ListAdd($$, $1); }
-   | external_guess_declaration_specifiers external_storage_class_specifier    { ListAdd($1, $2); }
+   | external_guess_declaration_specifiers external_storage_class_specifier    { $$ = $1; ListAdd($1, $2); }
    | type_qualifier                                   { $$ = MkList(); ListAdd($$, $1); }
-   | external_guess_declaration_specifiers  type_qualifier            { ListAdd($1, $2); }
+   | external_guess_declaration_specifiers  type_qualifier            { $$ = $1; ListAdd($1, $2); }
    | type_specifier                                   { $$ = MkList(); ListAdd($$, $1); }
-   | external_guess_declaration_specifiers  type_specifier            { ListAdd($1, $2); }
+   | external_guess_declaration_specifiers  type_specifier            { $$ = $1; ListAdd($1, $2); }
    | guess_type                                       { $$ = MkList(); ListAdd($$, $1); }
-       | external_guess_declaration_specifiers guess_type          { ListAdd($1, $2); }
+       | external_guess_declaration_specifiers guess_type          { $$ = $1; ListAdd($1, $2); }
    | class_specifier                                   { $$ = MkList(); ListAdd($$, $1); }
-   | external_guess_declaration_specifiers class_specifier            { ListAdd($1, $2); }
+   | external_guess_declaration_specifiers class_specifier            { $$ = $1; ListAdd($1, $2); }
    ;
 
 external_guess_declaration_specifiers_error:
      class_specifier_error                             { $$ = MkList(); ListAdd($$, $1); }
-   | external_guess_declaration_specifiers class_specifier_error      { ListAdd($1, $2); }
+   | external_guess_declaration_specifiers class_specifier_error      { $$ = $1; ListAdd($1, $2); }
    ;
 
 _inheritance_specifiers:
      PRIVATE                                          { $$ = MkList(); ListAdd($$, MkSpecifier(PRIVATE)); }
    | PUBLIC                                           { $$ = MkList(); ListAdd($$, MkSpecifier(PUBLIC)); }
    | storage_class_specifier                          { $$ = MkList(); ListAdd($$, $1); }
-   | _inheritance_specifiers storage_class_specifier   { ListAdd($1, $2); }
+   | _inheritance_specifiers storage_class_specifier   { $$ = $1; ListAdd($1, $2); }
    | type_qualifier                                   { $$ = MkList(); ListAdd($$, $1); }
-   | _inheritance_specifiers type_qualifier            { ListAdd($1, $2); }
+   | _inheritance_specifiers type_qualifier            { $$ = $1; ListAdd($1, $2); }
    | strict_type_specifier                                   { $$ = MkList(); ListAdd($$, $1); }
-   | _inheritance_specifiers strict_type_specifier            { ListAdd($1, $2); }
+   | _inheritance_specifiers strict_type_specifier            { $$ = $1; ListAdd($1, $2); }
    | identifier                                       
       { _DeclClass(0, $1.string); $$ = MkListOne(MkSpecifierName($1.string)); FreeIdentifier($1); }
-       | _inheritance_specifiers identifier                { _DeclClass(0, $2.string); ListAdd($1, MkSpecifierName($2.string)); FreeIdentifier($2); }
+       | _inheritance_specifiers identifier                { $$ = $1; _DeclClass(0, $2.string); ListAdd($1, MkSpecifierName($2.string)); FreeIdentifier($2); }
 
    | identifier '<' template_arguments_list '>'
       {
@@ -2437,6 +2530,7 @@ _inheritance_specifiers:
       }
    | _inheritance_specifiers identifier '<' template_arguments_list '>'
       {
+         $$ = $1;
          if($2._class && !$2._class.name)
          {
             char name[1024];
@@ -2458,13 +2552,13 @@ inheritance_specifiers:
 
 property_specifiers:
      storage_class_specifier                          { $$ = MkList(); ListAdd($$, $1); }
-   | property_specifiers storage_class_specifier     { ListAdd($1, $2); }
+   | property_specifiers storage_class_specifier     { $$ = $1; ListAdd($1, $2); }
    | type_qualifier                                   { $$ = MkList(); ListAdd($$, $1); }
-   | property_specifiers type_qualifier            { ListAdd($1, $2); }
+   | property_specifiers type_qualifier            { $$ = $1; ListAdd($1, $2); }
    | strict_type_specifier                                   { $$ = MkList(); ListAdd($$, $1); }
-   | property_specifiers strict_type_specifier            { ListAdd($1, $2); }
+   | property_specifiers strict_type_specifier            { $$ = $1; ListAdd($1, $2); }
    | identifier                        { $$ = MkList(); ListAdd($$, MkSpecifierName($1.string)); FreeIdentifier($1)}
-   | property_specifiers identifier          { ListAdd($1, MkSpecifierName($2.string)); FreeIdentifier($2)}
+   | property_specifiers identifier          { $$ = $1; ListAdd($1, MkSpecifierName($2.string)); FreeIdentifier($2)}
    | identifier '<' template_arguments_list '>'
       {
          // if($1._class && !$1._class.name)
@@ -2501,17 +2595,17 @@ property_specifiers:
 
 renew_specifiers:
      storage_class_specifier                          { $$ = MkList(); ListAdd($$, $1); }
-   | renew_specifiers storage_class_specifier    { ListAdd($1, $2); }
+   | renew_specifiers storage_class_specifier    { $$ = $1; ListAdd($1, $2); }
    | type_qualifier                                   { $$ = MkList(); ListAdd($$, $1); }
-   | renew_specifiers type_qualifier            { ListAdd($1, $2); }
+   | renew_specifiers type_qualifier            { $$ = $1; ListAdd($1, $2); }
    | strict_type_specifier                                   { $$ = MkList(); ListAdd($$, $1); }
-   | renew_specifiers strict_type_specifier            { ListAdd($1, $2); }
+   | renew_specifiers strict_type_specifier            { $$ = $1; ListAdd($1, $2); }
    | struct_or_union_specifier_compound              { $$ = MkList(); ListAdd($$, $1); }
-       | renew_specifiers struct_or_union_specifier_compound          { ListAdd($1, $2); }
+       | renew_specifiers struct_or_union_specifier_compound          { $$ = $1; ListAdd($1, $2); }
    | enum_specifier_compound              { $$ = MkList(); ListAdd($$, $1); }
-       | renew_specifiers enum_specifier_compound          { ListAdd($1, $2); }
+       | renew_specifiers enum_specifier_compound          { $$ = $1; ListAdd($1, $2); }
    | identifier                        { $$ = MkList(); ListAdd($$, MkSpecifierName($1.string)); FreeIdentifier($1)}
-   | renew_specifiers identifier          { ListAdd($1, MkSpecifierName($2.string)); FreeIdentifier($2)}
+   | renew_specifiers identifier          { $$ = $1; ListAdd($1, MkSpecifierName($2.string)); FreeIdentifier($2)}
    | identifier '<' template_arguments_list '>'
       {
          // if($1._class && !$1._class.name)
@@ -2548,17 +2642,17 @@ renew_specifiers:
 
 new_specifiers:
      storage_class_specifier                          { $$ = MkList(); ListAdd($$, $1); }
-   | new_specifiers storage_class_specifier    { ListAdd($1, $2); }
+   | new_specifiers storage_class_specifier    { $$ = $1; ListAdd($1, $2); }
    | type_qualifier                                   { $$ = MkList(); ListAdd($$, $1); }
-   | new_specifiers  type_qualifier            { ListAdd($1, $2); }
+   | new_specifiers  type_qualifier            { $$ = $1; ListAdd($1, $2); }
    | strict_type_specifier                                   { $$ = MkList(); ListAdd($$, $1); }
-   | new_specifiers strict_type_specifier            { ListAdd($1, $2); }
+   | new_specifiers strict_type_specifier            { $$ = $1; ListAdd($1, $2); }
    | struct_or_union_specifier_compound              { $$ = MkList(); ListAdd($$, $1); }
-       | new_specifiers struct_or_union_specifier_compound          { ListAdd($1, $2); }
+       | new_specifiers struct_or_union_specifier_compound          { $$ = $1; ListAdd($1, $2); }
    | enum_specifier_compound              { $$ = MkList(); ListAdd($$, $1); }
-       | new_specifiers enum_specifier_compound          { ListAdd($1, $2); }
+       | new_specifiers enum_specifier_compound          { $$ = $1; ListAdd($1, $2); }
    | identifier                        { $$ = MkList(); ListAdd($$, MkSpecifierName($1.string)); FreeIdentifier($1)}
-   | new_specifiers identifier          { ListAdd($1, MkSpecifierName($2.string)); FreeIdentifier($2)}
+   | new_specifiers identifier          { $$ = $1; ListAdd($1, MkSpecifierName($2.string)); FreeIdentifier($2)}
    | identifier '<' template_arguments_list '>'
       {
          // if($1._class && !$1._class.name)
@@ -2594,21 +2688,77 @@ new_specifiers:
    ;
 
 identifier_list_error:
-     identifier_list ',' error         { ListAdd($1, null); }
-   | identifier_list_error ',' error         { ListAdd($1, null); }
+     identifier_list ',' error         { $$ = $1; ListAdd($1, null); }
+   | identifier_list_error ',' error         { $$ = $1; ListAdd($1, null); }
    ;
 
 identifier_list:
          identifier                        { $$ = MkList(); ListAdd($$, MkTypeName(null, MkDeclaratorIdentifier($1))); }
-       | identifier_list ',' identifier    { ListAdd($1, MkTypeName(null, MkDeclaratorIdentifier($3))); }
-   | identifier_list_error ',' identifier    { ListAdd($1, MkTypeName(null, MkDeclaratorIdentifier($3))); }
-       | parameter_list ',' identifier    { ListAdd($1, MkTypeName(null, MkDeclaratorIdentifier($3))); }
-   | parameter_list_error ',' identifier    { ListAdd($1, MkTypeName(null, MkDeclaratorIdentifier($3))); }
+       | identifier_list ',' identifier    { $$ = $1; ListAdd($1, MkTypeName(null, MkDeclaratorIdentifier($3))); }
+   | identifier_list_error ',' identifier    { $$ = $1; ListAdd($1, MkTypeName(null, MkDeclaratorIdentifier($3))); }
+       | parameter_list ',' identifier    { $$ = $1; ListAdd($1, MkTypeName(null, MkDeclaratorIdentifier($3))); }
+   | parameter_list_error ',' identifier    { $$ = $1; ListAdd($1, MkTypeName(null, MkDeclaratorIdentifier($3))); }
        ;
 
+direct_declarator_nofunction_type_ok:
+     direct_declarator_nofunction
+   | base_strict_type
+   {
+      char * colon = RSearchString($1.name, "::", strlen($1.name), true, false);
+      String s = colon ? colon + 2 : $1.name;
+      $$ = MkDeclaratorIdentifier(MkIdentifier(s));
+      FreeSpecifier($1);
+   }
+   | UINT { $$ = MkDeclaratorIdentifier(MkIdentifier("uint")); }
+   // These rules need to be reviewed in lights of prototypes with types only...
+       | base_strict_type '[' constant_expression ']'
+      {
+         Declarator decl;
+         char * colon = RSearchString($1.name, "::", strlen($1.name), true, false);
+         String s = colon ? colon + 2 : $1.name;
+         decl = MkDeclaratorIdentifier(MkIdentifier(s));
+         FreeSpecifier($1);
+         $$ = MkDeclaratorArray(decl, $3);
+      }
+   | base_strict_type '[' constant_expression_error ']'
+      {
+         Declarator decl;
+         char * colon = RSearchString($1.name, "::", strlen($1.name), true, false);
+         String s = colon ? colon + 2 : $1.name;
+         decl = MkDeclaratorIdentifier(MkIdentifier(s));
+         FreeSpecifier($1);
+         $$ = MkDeclaratorArray(decl, $3);
+      }
+       | base_strict_type '[' type ']'
+      {
+         Declarator decl;
+         char * colon = RSearchString($1.name, "::", strlen($1.name), true, false);
+         String s = colon ? colon + 2 : $1.name;
+         decl = MkDeclaratorIdentifier(MkIdentifier(s));
+         FreeSpecifier($1);
+         $$ = MkDeclaratorEnumArray(decl, $3);
+      }
+       | base_strict_type '[' ']'
+      {
+         Declarator decl;
+         char * colon = RSearchString($1.name, "::", strlen($1.name), true, false);
+         String s = colon ? colon + 2 : $1.name;
+         decl = MkDeclaratorIdentifier(MkIdentifier(s));
+         FreeSpecifier($1);
+         $$ = MkDeclaratorEnumArray(decl, null);
+      }
+       | direct_declarator_nofunction_type_ok '[' constant_expression ']' { $$ = MkDeclaratorArray($1, $3); }
+   | direct_declarator_nofunction_type_ok '[' constant_expression_error ']' { $$ = MkDeclaratorArray($1, $3); }
+       | direct_declarator_nofunction_type_ok '[' type ']' { $$ = MkDeclaratorEnumArray($1, $3); }
+       | direct_declarator_nofunction_type_ok '[' ']'                     { $$ = MkDeclaratorArray($1, null); }
+       ;
+
 direct_declarator_nofunction:
          identifier                                                   { $$ = MkDeclaratorIdentifier($1); }
        | '(' declarator ')'                            { $$ = MkDeclaratorBrackets($2); }
+   | '(' ext_decl declarator ')'                            { $$ = MkDeclaratorBrackets(MkDeclaratorExtended($2, $3)); }
+       | '(' declarator_type_ok ')'                            { $$ = MkDeclaratorBrackets($2); }
+   | '(' ext_decl declarator_type_ok ')'                            { $$ = MkDeclaratorBrackets(MkDeclaratorExtended($2, $3)); }
        | direct_declarator_nofunction '[' constant_expression ']' { $$ = MkDeclaratorArray($1, $3); }
    | direct_declarator_nofunction '[' constant_expression_error ']' { $$ = MkDeclaratorArray($1, $3); }
        | direct_declarator_nofunction '[' type ']' { $$ = MkDeclaratorEnumArray($1, $3); }
@@ -2629,9 +2779,9 @@ direct_declarator_function:
 
 // Tricky stuff here for overriding...
 direct_declarator_function_error:
-   direct_declarator_function_start identifier_list_error     
-      { 
-         $$ = MkDeclaratorFunction($1, null); 
+   direct_declarator_function_start identifier_list_error
+      {
+         $$ = MkDeclaratorFunction($1, $2); 
          fileInput.Seek(@1.end.pos, start); 
          yyclearin;
          resetScannerPos(&@1.end);
@@ -2649,7 +2799,7 @@ direct_declarator_function_error:
       }
    | direct_declarator_function_start parameter_list '('
       { 
-         $$ = MkDeclaratorFunction($1, null); 
+         $$ = MkDeclaratorFunction($1, $2); 
          fileInput.Seek(@1.end.pos, start); 
          yyclearin;
          resetScannerPos(&@1.end);
@@ -2664,6 +2814,7 @@ direct_declarator_function_error:
          resetScannerPos(&@1.end);
          @$.start = @1.start;
          @$.end = @1.end;
+         FreeList($2, FreeSpecifier);
          FreeIdentifier($3);
       }
        ;
@@ -2671,12 +2822,73 @@ direct_declarator_function_error:
 direct_declarator:
      direct_declarator_function
    | direct_declarator_nofunction
-   | ext_decl direct_declarator_function
+   ;
+
+
+direct_declarator_function_start_type_ok:
+     direct_declarator_nofunction_type_ok '('
+   ;
+
+direct_declarator_function_type_ok:
+         direct_declarator_function_start_type_ok parameter_type_list ')' { $$ = MkDeclaratorFunction($1, $2); }
+   | direct_declarator_function_start_type_ok parameter_type_list_error ')' { $$ = MkDeclaratorFunction($1, $2); }
+       | direct_declarator_function_start_type_ok identifier_list ')'     { $$ = MkDeclaratorFunction($1, $2); }
+   | direct_declarator_function_start_type_ok identifier_list_error ')'     { $$ = MkDeclaratorFunction($1, $2); }
+       | direct_declarator_function_start_type_ok ')'                     { $$ = MkDeclaratorFunction($1, null); }
+       ;
+
+// Tricky stuff here for overriding...
+direct_declarator_function_error_type_ok:
+   direct_declarator_function_start_type_ok identifier_list_error
+      {
+         $$ = MkDeclaratorFunction($1, $2); 
+         fileInput.Seek(@1.end.pos, start); 
+         yyclearin;
+         resetScannerPos(&@1.end);
+         @$.start = @1.start;
+         @$.end = @1.end;
+      }
+   | direct_declarator_function_start_type_ok error
+      { 
+         $$ = MkDeclaratorFunction($1, null); 
+         fileInput.Seek(@1.end.pos, start); 
+         yyclearin;
+         resetScannerPos(&@1.end);
+         @$.start = @1.start;
+         @$.end = @1.end;
+      }
+   | direct_declarator_function_start_type_ok parameter_list '('
+      { 
+         $$ = MkDeclaratorFunction($1, $2); 
+         fileInput.Seek(@1.end.pos, start); 
+         yyclearin;
+         resetScannerPos(&@1.end);
+         @$.start = @1.start;
+         @$.end = @1.end;
+      }
+   | direct_declarator_function_start_type_ok guess_declaration_specifiers identifier '('
+      { 
+         $$ = MkDeclaratorFunction($1, null); 
+         fileInput.Seek(@1.end.pos, start); 
+         yyclearin;
+         resetScannerPos(&@1.end);
+         @$.start = @1.start;
+         @$.end = @1.end;
+         FreeList($2, FreeSpecifier);
+         FreeIdentifier($3);
+      }
+       ;
+
+direct_declarator_type_ok:
+     direct_declarator_function_type_ok
+   | direct_declarator_nofunction_type_ok
+/*
+   | ext_decl direct_declarator_function_type_ok
       { $$ = MkDeclaratorExtended($1, $2); }
-   | ext_decl direct_declarator_nofunction
+   | ext_decl direct_declarator_nofunction_type_ok
       { $$ = MkDeclaratorExtended($1, $2); }
+*/
    ;
-
 /*
 asm_start:
     ASM '(' STRING_LITERAL { $<string>$ = CopyString(yytext); } STRING_LITERAL { $<string>$ = CopyString(yytext); }
@@ -2693,15 +2905,15 @@ asm_start:
    ;  
 
 ext_decl:
-     EXT_DECL { $$ = CopyString(yytext); }
-   | ext_attrib
+     EXT_DECL { $$ = MkExtDeclString(CopyString(yytext)); }
+   | attrib { $$ = MkExtDeclAttrib($1);
    | asm_start ')'
       {
          char temp[1024];
          strcpy(temp, $<string>1);
          strcat(temp, ")");
          delete $<string>1;
-         $$ = CopyString(temp);
+         $$ = MkExtDeclString(CopyString(temp));
       }
    | asm_start STRING_LITERAL { $$ = CopyString(yytext); } ')'
       {
@@ -2712,78 +2924,85 @@ ext_decl:
          strcat(temp, ")");
          delete $<string>1;
          delete $<string>3;
-         $$ = CopyString(temp);
+         $$ = MkExtDeclString(CopyString(temp));
       }
    ;
 */
 
 ext_decl:
-     EXT_DECL { $$ = CopyString(yytext); }
-   | ext_attrib
+     EXT_DECL { $$ = MkExtDeclString(CopyString(yytext)); }
+   | EXT_STORAGE  { $$ = MkExtDeclString(CopyString(yytext)); }
+   | attrib { $$ = MkExtDeclAttrib($1); }
    | ASM '(' string_literal ')'
       {
          char temp[1024];
          strcpy(temp, "__asm__(");
          strcat(temp, $3);
          strcat(temp, ")");
-         $$ = CopyString(temp);
+         $$ = MkExtDeclString(CopyString(temp));
          delete $3;
       }
    ;
 
-ext_attrib:
-   EXT_ATTRIB  { $$ = CopyString(yytext); }
+_attrib:
+   ATTRIB      { $<i>$ = ATTRIB; }
+ | ATTRIB_DEP  { $<i>$ = ATTRIB_DEP; }
+ | __ATTRIB    { $<i>$ = __ATTRIB; }
+ ;
+
+
+attribute_word:
+     IDENTIFIER   { $$  = CopyString(yytext); }
+   | TYPE_NAME    { $$  = CopyString(yytext); }
+   | EXT_STORAGE  { $$  = CopyString(yytext); }
+   | EXT_DECL     { $$  = CopyString(yytext); }
+   | CONST        { $$  = CopyString(yytext); }
+   ;
+
+attribute:
+     attribute_word  { $$ = MkAttribute($1, null); $$.loc = @$; }
+   | attribute_word '(' expression ')'  { $$ = MkAttribute($1, MkExpBrackets($3)); $$.loc = @$; }
+   ;
+
+attribs_list:
+     attribute { $$ = MkListOne($1); }
+   | attribs_list attribute { ListAdd($1, $2); $$ = $1; }
+   | attribs_list ',' attribute { ListAdd($1, $3); $$ = $1; }
+   ;
+
+attrib:
+     _attrib '(' '(' attribs_list ')' ')' { $$ = MkAttrib($<i>1, $4); $$.loc = @$; }
+   | _attrib '(' '('              ')' ')'  { $$ = MkAttrib($<i>1, null); $$.loc = @$; }
    ;
-   
 
 direct_abstract_declarator:
-         '(' abstract_declarator ')'
-                                 { $$ = MkDeclaratorBrackets($2); }
-       | '[' ']'
-                                 { $$ = MkDeclaratorArray(null, null); }
-   | '[' constant_expression ']'
-                                 { $$ = MkDeclaratorArray(null, $2); }
-       | '[' constant_expression_error ']'
-                                 { $$ = MkDeclaratorArray(null, $2); }
-   | '[' type ']'
-                                 { $$ = MkDeclaratorEnumArray(null, $2); }
-       | direct_abstract_declarator '[' ']'
-                                 { $$ = MkDeclaratorArray($1, null); }
-       | direct_abstract_declarator '[' constant_expression ']'
-                                 { $$ = MkDeclaratorArray($1, $3); }
-       | direct_abstract_declarator '[' type']'
-                                 { $$ = MkDeclaratorEnumArray($1, $3); }
-       | direct_abstract_declarator '[' constant_expression_error ']'
-                                 { $$ = MkDeclaratorArray($1, $3); }
-       | '(' ')'
-                                 { $$ = MkDeclaratorFunction(null, null); }
-       | '(' parameter_type_list ')'
-                                 { $$ = MkDeclaratorFunction(null, $2); }
-       | '(' parameter_type_list_error ')'
-                                 { $$ = MkDeclaratorFunction(null, $2); }
-       | direct_abstract_declarator '(' ')'
-                                 { $$ = MkDeclaratorFunction($1, null); }
-       | direct_abstract_declarator '(' parameter_type_list ')'
-                                 { $$ = MkDeclaratorFunction($1, $3); }
-       | direct_abstract_declarator '(' parameter_type_list_error ')'
-                                 { $$ = MkDeclaratorFunction($1, $3); }
+         '(' abstract_declarator ')'               { $$ = MkDeclaratorBrackets($2); }
+       | '(' ext_decl abstract_declarator ')'               { $$ = MkDeclaratorBrackets(MkDeclaratorExtended($2, $3)); }
+       | '[' ']'                                   { $$ = MkDeclaratorArray(null, null); }
+   | '[' constant_expression ']'               { $$ = MkDeclaratorArray(null, $2); }
+       | '[' constant_expression_error ']'         { $$ = MkDeclaratorArray(null, $2); }
+   | '[' type ']'                              { $$ = MkDeclaratorEnumArray(null, $2); }
+       | direct_abstract_declarator '[' ']'        { $$ = MkDeclaratorArray($1, null); }
+       | direct_abstract_declarator '[' constant_expression ']'        { $$ = MkDeclaratorArray($1, $3); }
+       | direct_abstract_declarator '[' type']'                        { $$ = MkDeclaratorEnumArray($1, $3); }
+       | direct_abstract_declarator '[' constant_expression_error ']'  { $$ = MkDeclaratorArray($1, $3); }
+       | '(' ')'                                   { $$ = MkDeclaratorFunction(null, null); }
+       | '(' parameter_type_list ')'               { $$ = MkDeclaratorFunction(null, $2); }
+       | '(' parameter_type_list_error ')'         { $$ = MkDeclaratorFunction(null, $2); }
+       | direct_abstract_declarator '(' ')'        { $$ = MkDeclaratorFunction($1, null); }
+       | direct_abstract_declarator '(' parameter_type_list ')'         { $$ = MkDeclaratorFunction($1, $3); }
+       | direct_abstract_declarator '(' parameter_type_list_error ')'   { $$ = MkDeclaratorFunction($1, $3); }
        ;
 
 direct_abstract_declarator_noarray:
-         '(' abstract_declarator_noarray ')'
-                                 { $$ = MkDeclaratorBrackets($2); }
-       | '(' ')'
-                                 { $$ = MkDeclaratorFunction(null, null); }
-       | '(' parameter_type_list ')'
-                                 { $$ = MkDeclaratorFunction(null, $2); }
-       | '(' parameter_type_list_error ')'
-                                 { $$ = MkDeclaratorFunction(null, $2); }
-       | direct_abstract_declarator_noarray '(' ')'
-                                 { $$ = MkDeclaratorFunction($1, null); }
-       | direct_abstract_declarator_noarray '(' parameter_type_list ')'
-                                 { $$ = MkDeclaratorFunction($1, $3); }
-       | direct_abstract_declarator_noarray '(' parameter_type_list_error ')'
-                                 { $$ = MkDeclaratorFunction($1, $3); }
+         '(' abstract_declarator_noarray ')'          { $$ = MkDeclaratorBrackets($2); }
+       | '(' ext_decl abstract_declarator_noarray ')' { $$ = MkDeclaratorBrackets(MkDeclaratorExtended($2, $3)); }
+       | '(' ')'                                      { $$ = MkDeclaratorFunction(null, null); }
+       | '(' parameter_type_list ')'                  { $$ = MkDeclaratorFunction(null, $2); }
+       | '(' parameter_type_list_error ')'         { $$ = MkDeclaratorFunction(null, $2); }
+       | direct_abstract_declarator_noarray '(' ')'   { $$ = MkDeclaratorFunction($1, null); }
+       | direct_abstract_declarator_noarray '(' parameter_type_list ')'       { $$ = MkDeclaratorFunction($1, $3); }
+       | direct_abstract_declarator_noarray '(' parameter_type_list_error ')' { $$ = MkDeclaratorFunction($1, $3); }
        ;
 
 pointer:
@@ -2798,7 +3017,6 @@ abstract_declarator:
        | direct_abstract_declarator
        | pointer direct_abstract_declarator   { $$ = MkDeclaratorPointer($1, $2); }
    | ext_decl pointer { $$ = MkDeclaratorExtended($1, MkDeclaratorPointer($2, null)); }
-   | ext_decl direct_abstract_declarator { $$ = MkDeclaratorExtended($1, $2); }
        | ext_decl pointer direct_abstract_declarator { $$ = MkDeclaratorExtended($1, MkDeclaratorPointer($2, $3)); }
        ;
 
@@ -2807,8 +3025,7 @@ abstract_declarator_noarray:
        | direct_abstract_declarator_noarray
        | pointer direct_abstract_declarator_noarray   { $$ = MkDeclaratorPointer($1, $2); }
    | ext_decl pointer { $$ = MkDeclaratorExtended($1, MkDeclaratorPointer($2, null)); }
-   | ext_decl direct_abstract_declarator_noarray { $$ = MkDeclaratorExtended($1, $2); }
-       | ext_decl pointer direct_abstract_declarator_noarray { $$ = MkDeclaratorExtended($1, MkDeclaratorPointer($2, $3)); }
+   | ext_decl pointer direct_abstract_declarator_noarray { $$ = MkDeclaratorExtended($1, MkDeclaratorPointer($2, $3)); }
        ;
 
 declarator:
@@ -2819,12 +3036,23 @@ declarator:
       { $$ = MkDeclaratorExtended($1, MkDeclaratorPointer($2, $3)); }
    | declarator ext_decl
       { $$ = MkDeclaratorExtendedEnd($2, $1); }  
+   | declarator_nofunction_type_ok ext_decl
+      { $$ = MkDeclaratorExtendedEnd($2, $1); }  
+   ;
+
+declarator_type_ok:
+         direct_declarator_type_ok
+       | pointer direct_declarator_type_ok
+      { $$ = MkDeclaratorPointer($1, $2); }
+  | ext_decl pointer direct_declarator_type_ok
+      { $$ = MkDeclaratorExtended($1, MkDeclaratorPointer($2, $3)); }
+   | declarator_type_ok ext_decl
+      { $$ = MkDeclaratorExtendedEnd($2, $1); }  
    ;
 
 declarator_function:
      direct_declarator_function
        | pointer direct_declarator_function      { $$ = MkDeclaratorPointer($1, $2); }
-   | ext_decl direct_declarator_function { $$ = MkDeclaratorExtended($1, $2); }
        | ext_decl pointer direct_declarator_function { $$ = MkDeclaratorExtended($1, MkDeclaratorPointer($2, $3)); }
        | pointer ext_decl direct_declarator_function { $$ = MkDeclaratorPointer($1, MkDeclaratorExtended($2, $3)); }
    ;
@@ -2832,17 +3060,29 @@ declarator_function:
 declarator_function_error:
          direct_declarator_function_error
        | pointer direct_declarator_function_error      { $$ = MkDeclaratorPointer($1, $2); }
-   | ext_decl direct_declarator_function_error { $$ = MkDeclaratorExtended($1, $2); }
        | ext_decl pointer direct_declarator_function_error { $$ = MkDeclaratorExtended($1, MkDeclaratorPointer($2, $3)); }
        | pointer ext_decl direct_declarator_function_error { $$ = MkDeclaratorPointer($1, MkDeclaratorExtended($2, $3)); }
    ;
 
-declarator_nofunction:
-         direct_declarator_nofunction
-       | pointer direct_declarator_nofunction      { $$ = MkDeclaratorPointer($1, $2); }
-   | ext_decl direct_declarator_nofunction { $$ = MkDeclaratorExtended($1, $2); }
-       | ext_decl pointer direct_declarator_nofunction { $$ = MkDeclaratorExtended($1, MkDeclaratorPointer($2, $3)); }
-       | pointer ext_decl direct_declarator_nofunction { $$ = MkDeclaratorPointer($1, MkDeclaratorExtended($2, $3)); }
+declarator_function_type_ok:
+     direct_declarator_function_type_ok
+       | pointer direct_declarator_function_type_ok      { $$ = MkDeclaratorPointer($1, $2); }
+       | ext_decl pointer direct_declarator_function_type_ok { $$ = MkDeclaratorExtended($1, MkDeclaratorPointer($2, $3)); }
+       | pointer ext_decl direct_declarator_function_type_ok { $$ = MkDeclaratorPointer($1, MkDeclaratorExtended($2, $3)); }
+   ;
+
+declarator_function_error_type_ok:
+         direct_declarator_function_error_type_ok
+       | pointer direct_declarator_function_error_type_ok      { $$ = MkDeclaratorPointer($1, $2); }
+       | ext_decl pointer direct_declarator_function_error_type_ok { $$ = MkDeclaratorExtended($1, MkDeclaratorPointer($2, $3)); }
+       | pointer ext_decl direct_declarator_function_error_type_ok { $$ = MkDeclaratorPointer($1, MkDeclaratorExtended($2, $3)); }
+   ;
+
+declarator_nofunction_type_ok:
+         direct_declarator_nofunction_type_ok
+       | pointer direct_declarator_nofunction_type_ok      { $$ = MkDeclaratorPointer($1, $2); }
+       | ext_decl pointer direct_declarator_nofunction_type_ok { $$ = MkDeclaratorExtended($1, MkDeclaratorPointer($2, $3)); }
+       | pointer ext_decl direct_declarator_nofunction_type_ok { $$ = MkDeclaratorPointer($1, MkDeclaratorExtended($2, $3)); }
    ;
 
 initializer:
@@ -2909,36 +3149,55 @@ initializer_condition_error:
 initializer_list:
          initializer                       { $$ = MkList(); ListAdd($$, $1); }
    | initializer_error                 { $$ = MkList(); ListAdd($$, $1); }
-       | initializer_list ',' initializer  { ListAdd($1, $3); }
-   | initializer_list ',' initializer_error  { ListAdd($1, $3); }
+       | initializer_list ',' initializer  { $$ = $1; ListAdd($1, $3); }
+   | initializer_list ',' initializer_error  { $$ = $1; ListAdd($1, $3); }
 
    // Errors
-       | initializer_list initializer  { ListAdd($1, $2); }
-   | initializer_list initializer_error  { ListAdd($1, $2); }
+       | initializer_list initializer  { $$ = $1; ListAdd($1, $2); }
+   | initializer_list initializer_error  { $$ = $1; ListAdd($1, $2); }
        ;
 
 init_declarator:
          declarator                     { $$ = MkInitDeclarator($1, null); $$.loc = @$; }
+   | declarator_type_ok             { $$ = MkInitDeclarator($1, null); $$.loc = @$; }
        | declarator '=' initializer     { $$ = MkInitDeclarator($1, $3); $$.loc = @$; $$.initializer.loc.start = @2.end; }
        ;
 
 init_declarator_error:
          declarator error                 { $$ = MkInitDeclarator($1, null); $$.loc = @$; }
+   /* Useless rules due to conflicts
    | declarator '=' error                 { $$ = MkInitDeclarator($1, MkInitializerAssignment(MkExpDummy())); $$.loc = @$; $$.initializer.loc = @2; $$.initializer.exp.loc = @2; }
+   */
        | declarator '=' initializer_error     { $$ = MkInitDeclarator($1, $3); $$.loc = @$; $$.initializer.loc.start = @2.end; }
        ;
 
 init_declarator_list:
          init_declarator                            { $$ = MkList(); ListAdd($$, $1); }
-       | init_declarator_list ',' init_declarator   { ListAdd($1, $3); }
-   | init_declarator_list_error ',' init_declarator   { ListAdd($1, $3); }
+       | init_declarator_list ',' init_declarator   { $$ = $1; ListAdd($1, $3); }
+       | UINT ',' init_declarator                  { $$ = MkList(); ListAdd($$, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("uint")), null)); ListAdd($$, $3); }
+   | INT64 ',' init_declarator                  { $$ = MkList(); ListAdd($$, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("int64")), null)); ListAdd($$, $3); }
+       | base_strict_type ',' init_declarator
+   {
+      char * colon = RSearchString($1.name, "::", strlen($1.name), true, false);
+      String s = colon ? colon + 2 : $1.name;
+      $$ = MkList();
+      ListAdd($$, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(s)), null));
+      ListAdd($$, $3);
+      FreeSpecifier($1);
+   }
+   | init_declarator_list_error ',' init_declarator   { $$ = $1; ListAdd($1, $3); }
+   /*| base_strict_type ',' init_declarator
+      {
+         $$ = MkList();
+         ListAdd($1, $3);
+      }*/
        ;
 
 init_declarator_list_error:
          init_declarator_error                            { $$ = MkList(); ListAdd($$, $1); }
    | init_declarator error                            { $$ = MkList(); ListAdd($$, $1); }
-       | init_declarator_list ',' init_declarator_error   { ListAdd($1, $3); }
-   | init_declarator_list_error ',' init_declarator_error   { ListAdd($1, $3); }
+       | init_declarator_list ',' init_declarator_error   { $$ = $1; ListAdd($1, $3); }
+   | init_declarator_list_error ',' init_declarator_error   { $$ = $1; ListAdd($1, $3); }
        ;
 
 type_name:
@@ -2953,11 +3212,11 @@ guess_type_name:
 
 /*** PARAMETERS **********************************************************************/
 parameter_declaration:
-     guess_declaration_specifiers declarator          { $$ = MkTypeName($1, $2); }
+     guess_declaration_specifiers declarator_type_ok          { $$ = MkTypeName($1, $2); }
    | guess_declaration_specifiers abstract_declarator { $$ = MkTypeName($1, $2); }
    | guess_declaration_specifiers '&'                 { $$ = MkTypeName($1, MkDeclaratorPointer(MkPointer(null,null), null)); }
-   | guess_declaration_specifiers '&' declarator      { $$ = MkTypeName($1, MkDeclaratorPointer(MkPointer(null,null), $3)); }
-       | guess_declaration_specifiers                     { $$ = MkTypeName($1, null); }
+   | guess_declaration_specifiers '&' declarator_type_ok      { $$ = MkTypeName($1, MkDeclaratorPointer(MkPointer(null,null), $3)); }
+       | guess_declaration_specifiers                     { $$ = MkTypeNameGuessDecl($1, null); }
    | CLASS
       { $$ = MkTypeName(MkListOne(MkSpecifier(CLASS)), null); }
 /*
@@ -2977,55 +3236,55 @@ parameter_declaration:
        ;
 
 parameter_declaration_error:
-         guess_declaration_specifiers declarator error          { $$ = MkTypeName($1, $2); }
+         guess_declaration_specifiers declarator_type_ok error          { $$ = MkTypeName($1, $2); }
        | guess_declaration_specifiers abstract_declarator error { $$ = MkTypeName($1, $2); }
        ;
 
 parameter_list:
          parameter_declaration                      { $$ = MkList(); ListAdd($$, $1); }
-       | parameter_list ',' parameter_declaration   { ListAdd($1, $3); }
-   | parameter_list error ',' parameter_declaration   { ListAdd($1, $4); }
-   | parameter_list_error ',' parameter_declaration   { ListAdd($1, $3); }
-   | parameter_list_error error ',' parameter_declaration   { ListAdd($1, $4); }
+       | parameter_list ',' parameter_declaration   { $$ = $1; ListAdd($1, $3); }
+   | parameter_list error ',' parameter_declaration   { $$ = $1; ListAdd($1, $4); }
+   | parameter_list_error ',' parameter_declaration   { $$ = $1; ListAdd($1, $3); }
+   | parameter_list_error error ',' parameter_declaration   { $$ = $1; ListAdd($1, $4); }
    | error ',' parameter_declaration   { $$ = MkList(); ListAdd($$, MkTypeName(MkList(), null)); ListAdd($$, $3); }
 
-       | identifier_list ',' parameter_declaration   { ListAdd($1, $3); }
-   | identifier_list error ',' parameter_declaration   { ListAdd($1, $4); }
-   | identifier_list_error ',' parameter_declaration   { ListAdd($1, $3); }
-   | identifier_list_error error ',' parameter_declaration   { ListAdd($1, $4); }
+       | identifier_list ',' parameter_declaration   { $$ = $1; ListAdd($1, $3); }
+   | identifier_list error ',' parameter_declaration   { $$ = $1; ListAdd($1, $4); }
+   | identifier_list_error ',' parameter_declaration   { $$ = $1; ListAdd($1, $3); }
+   | identifier_list_error error ',' parameter_declaration   { $$ = $1; ListAdd($1, $4); }
 ;
 
 parameter_list_error:
          parameter_declaration_error                      { $$ = MkList(); ListAdd($$, $1); }
-       | parameter_list ',' parameter_declaration_error   { ListAdd($1, $3); }
-   | parameter_list_error ',' parameter_declaration_error   { ListAdd($1, $3); }
-   | parameter_list_error error ',' parameter_declaration_error   { ListAdd($1, $4); }
+       | parameter_list ',' parameter_declaration_error   { $$ = $1; ListAdd($1, $3); }
+   | parameter_list_error ',' parameter_declaration_error   { $$ = $1; ListAdd($1, $3); }
+   | parameter_list_error error ',' parameter_declaration_error   { $$ = $1; ListAdd($1, $4); }
    | error ',' parameter_declaration_error   { $$ = MkList(); ListAdd($$, MkTypeName(MkList(), null)); ListAdd($$, $3); }
 
-       | identifier_list ',' parameter_declaration_error   { ListAdd($1, $3); }
-   | identifier_list_error ',' parameter_declaration_error   { ListAdd($1, $3); }
-   | identifier_list_error error ',' parameter_declaration_error   { ListAdd($1, $4); }
+       | identifier_list ',' parameter_declaration_error   { $$ = $1; ListAdd($1, $3); }
+   | identifier_list_error ',' parameter_declaration_error   { $$ = $1; ListAdd($1, $3); }
+   | identifier_list_error error ',' parameter_declaration_error   { $$ = $1; ListAdd($1, $4); }
        ;   
 
 parameter_type_list:
          parameter_list
-       | parameter_list ',' ELLIPSIS                { ListAdd($1, MkTypeName(null, null)); }
-   | parameter_list_error ',' ELLIPSIS                { ListAdd($1, MkTypeName(null, null)); }
-       | identifier_list ',' ELLIPSIS                { ListAdd($1, MkTypeName(null, null)); }
-   | identifier_list_error ',' ELLIPSIS                { ListAdd($1, MkTypeName(null, null)); }
+       | parameter_list ',' ELLIPSIS                { $$ = $1; ListAdd($1, MkTypeName(null, null)); }
+   | parameter_list_error ',' ELLIPSIS                { $$ = $1; ListAdd($1, MkTypeName(null, null)); }
+       | identifier_list ',' ELLIPSIS                { $$ = $1; ListAdd($1, MkTypeName(null, null)); }
+   | identifier_list_error ',' ELLIPSIS                { $$ = $1; ListAdd($1, MkTypeName(null, null)); }
    | error ',' ELLIPSIS                { $$ = MkList(); ListAdd($$, MkTypeName(null, null)); }
        ;
 
 parameter_type_list_error: 
     parameter_list_error
-   | parameter_list ',' error                { ListAdd($1, null); }
+   | parameter_list ',' error                { $$ = $1; ListAdd($1, null); }
    | parameter_list_error error
        ;
 
 /****** STATEMENTS *******************************************************************/
 statement:
          labeled_statement
-   | EXT_ATTRIB { $$ = MkExpressionStmt(null); }   // Ignoring this for now... ( For __attribute__ ((__unused__)) )
+   | attrib { $$ = MkExpressionStmt(null); FreeAttrib($1); }   // Ignoring this for now... ( For __attribute__ ((__unused__)) )
        | compound_statement
    | ';' { $$ = MkExpressionStmt(null); }
    | ':' { $$ = MkExpressionStmt(null); }
@@ -3033,21 +3292,20 @@ statement:
        | selection_statement
        | iteration_statement
        | jump_statement
-   | asm_statement {}
-
+   | asm_statement
    | firewatchers ';'
    | stopwatching ';'
    | watch_definition ';'
        ;
 
 statement_error:
-       labeled_statement_error          { $$ = $1; Compiler_Error("syntax error\n"); } 
-   | iteration_statement_error      { $$ = $1; Compiler_Error("syntax error\n"); } 
-   | compound_statement_error       { $$ = $1; Compiler_Error("syntax error\n"); } 
-       | selection_statement_error      { $$ = $1; Compiler_Error("syntax error\n"); } 
-   | jump_statement_error           { $$ = $1; Compiler_Error("syntax error\n"); } 
-       | jump_statement error           { $$ = $1; Compiler_Error("syntax error\n"); } 
-   | expression_error { $$ = MkExpressionStmt($1); Compiler_Error("syntax error\n"); $$.loc = @1; }
+       labeled_statement_error          { $$ = $1; Compiler_Error($"syntax error\n"); } 
+   | iteration_statement_error      { $$ = $1; Compiler_Error($"syntax error\n"); } 
+   | compound_statement_error       { $$ = $1; Compiler_Error($"syntax error\n"); } 
+       | selection_statement_error      { $$ = $1; Compiler_Error($"syntax error\n"); } 
+   | jump_statement_error           { $$ = $1; Compiler_Error($"syntax error\n"); } 
+       | jump_statement error           { $$ = $1; Compiler_Error($"syntax error\n"); } 
+   | expression_error { $$ = MkExpressionStmt($1); Compiler_Error($"syntax error\n"); $$.loc = @1; }
    ;
 
 asm_field:
@@ -3114,7 +3372,7 @@ declaration:
          declaration_specifiers ';'                       { $$ = MkDeclaration($1, null); $$.loc = @$; }
        | declaration_specifiers init_declarator_list ';'  { $$ = MkDeclaration($1, $2); $$.loc = @$; }
    | instantiation_named ';'                          { $$ = MkDeclarationInst($1); $$.loc = @$; }
-   | declaration_error ';'                          {}
+   | declaration_error ';'                            { $$ = $1; }
        ;
 
 external_guess_declaration:
@@ -3142,30 +3400,30 @@ declaration_error:
 
 declaration_list:
          declaration                       { $$ = MkList(); ListAdd($$, $1); /*declMode = defaultDeclMode;*/ }
-       | declaration_list declaration      { ListAdd($1, $2); /*declMode = defaultDeclMode; */}
-   | declaration_list_error declaration      { ListAdd($1, $2); /*declMode = defaultDeclMode; */}
-   | declaration_list error ';'       { }
+       | declaration_list declaration      { $$ = $1; ListAdd($1, $2); /*declMode = defaultDeclMode; */}
+   | declaration_list_error declaration      { $$ = $1; ListAdd($1, $2); /*declMode = defaultDeclMode; */}
+   | declaration_list error ';'       { $$ = $1; }
        ;
 
 declaration_list_error:
     declaration_error                       { $$ = MkList(); ListAdd($$, $1); }
-   | declaration_list declaration_error { ListAdd($1, $2); }
+   | declaration_list declaration_error { $$ = $1; ListAdd($1, $2); }
        ;
 
 statement_list:
          statement                         { $$ = MkList(); ListAdd($$, $1); }
-       | statement_list statement          { ListAdd($1, $2); }
-   | statement_list_error statement          { ListAdd($1, $2); }
+       | statement_list statement          { $$ = $1; ListAdd($1, $2); }
+   | statement_list_error statement          { $$ = $1; ListAdd($1, $2); }
        ;
 
 statement_list_error:
      statement_error                   { $$ = MkList(); ListAdd($$, $1); }
-   | statement_list statement_error          { ListAdd($1, $2); }
-   | statement_list_error statement_error          { ListAdd($1, $2); }
-   | statement_list declaration              { Statement stmt = MkBadDeclStmt($2); stmt.loc = @2; yyerror(); ListAdd($1, stmt); /*declMode = defaultDeclMode;*/ }
-   | statement_list_error declaration        { Statement stmt = MkBadDeclStmt($2); stmt.loc = @2; yyerror(); ListAdd($1, stmt); /*declMode = defaultDeclMode;*/ }
-   | statement_list declaration_error        { Statement stmt = MkBadDeclStmt($2); stmt.loc = @2; yyerror(); ListAdd($1, stmt); /*declMode = defaultDeclMode;*/ }
-   | statement_list_error declaration_error  { Statement stmt = MkBadDeclStmt($2); stmt.loc = @2; yyerror(); ListAdd($1, stmt); /*declMode = defaultDeclMode;*/ }
+   | statement_list statement_error          { $$ = $1; ListAdd($1, $2); }
+   | statement_list_error statement_error          { $$ = $1; ListAdd($1, $2); }
+   | statement_list declaration              { Statement stmt = MkBadDeclStmt($2); stmt.loc = @2; Compiler_Warning(C89_DECL_WARNING); $$ = $1; ListAdd($1, stmt); /*declMode = defaultDeclMode;*/ }
+   | statement_list_error declaration        { Statement stmt = MkBadDeclStmt($2); stmt.loc = @2; Compiler_Warning(C89_DECL_WARNING); $$ = $1; ListAdd($1, stmt); /*declMode = defaultDeclMode;*/ }
+   | statement_list declaration_error        { Statement stmt = MkBadDeclStmt($2); stmt.loc = @2; Compiler_Warning(C89_DECL_WARNING); $$ = $1; ListAdd($1, stmt); /*declMode = defaultDeclMode;*/ }
+   | statement_list_error declaration_error  { Statement stmt = MkBadDeclStmt($2); stmt.loc = @2; Compiler_Warning(C89_DECL_WARNING); $$ = $1; ListAdd($1, stmt); /*declMode = defaultDeclMode;*/ }
    ;
 
 compound_inside:
@@ -3187,7 +3445,7 @@ compound_start:
     ;
 
 compound_statement: 
-   compound_statement_error '}'     { $$.loc = @$; }
+   compound_statement_error '}'     { $$ = $1; $$.loc = @$; }
        ;
 
 compound_statement_error: 
@@ -3244,7 +3502,9 @@ iteration_statement_error:
        FOR '(' expression_error error                                       { $$ = MkForStmt(MkExpressionStmt($3), null, null, null); $$.forStmt.init.loc = @3; $$.loc = @$; } |
        FOR '(' expression_statement error                                   { $$ = MkForStmt($3, null, null, null); $$.loc = @$; } |
        FOR '(' expression_statement expression_error error                  { $$ = MkForStmt($3, MkExpressionStmt($4), null, null); $$.loc = @$; $$.forStmt.check.loc = @4; } |
+   /* Useless rules due to conflicts
        FOR '(' expression_statement expression_statement error              { $$ = MkForStmt($3, $4, null, null); $$.loc = @$; } |
+   */
    FOR '(' expression_statement expression_statement expression_error   { $$ = MkForStmt($3, $4, $5, null); $$.loc = @$; } |
        FOR '(' expression_statement expression_statement ')' statement_error                   { $$ = MkForStmt($3, $4, null, $6); $$.loc = @$; } |
        FOR '(' expression_statement expression_statement expression ')' statement_error  { $$ = MkForStmt($3, $4, $5, $7); $$.loc = @$; } |
@@ -3260,10 +3520,14 @@ iteration_statement_error:
 
 
    WHILE error           { $$ = MkWhileStmt(null, null); $$.loc = @$; } |
+   /* Useless rules due to conflicts
        WHILE '(' error           { $$ = MkWhileStmt(null, null); $$.loc = @$; } |
+   */
    WHILE '(' ')' error           { $$ = MkWhileStmt(null, null); $$.loc = @$; } |
        WHILE '(' expression_error           { $$ = MkWhileStmt($3, null); $$.loc = @$; } |
+   /* Useless rules due to conflicts
    WHILE '(' expression_error error          { $$ = MkWhileStmt($3, null); $$.loc = @$; } |
+   */
        WHILE '(' expression ')' statement_error           { $$ = MkWhileStmt($3, $5); $$.loc = @$; } |
    WHILE '(' expression_error statement_error     { $$ = MkWhileStmt($3, $4 ); $$.loc = @$; }
 
@@ -3290,7 +3554,10 @@ jump_statement_error:
 
 function_definition:
          external_guess_declaration_specifiers declarator_function declaration_list compound_statement      { $$ = MkFunction($1, $2, $3); ProcessFunctionBody($$, $4); $$.loc = @$; }
-       | external_guess_declaration_specifiers declarator_function compound_statement                       
+       | external_guess_declaration_specifiers declarator_function compound_statement
+       { $$ = MkFunction($1, $2, null); ProcessFunctionBody($$, $3); $$.loc = @$; }
+       | external_guess_declaration_specifiers declarator_function_type_ok declaration_list compound_statement      { $$ = MkFunction($1, $2, $3); ProcessFunctionBody($$, $4); $$.loc = @$; }
+       | external_guess_declaration_specifiers declarator_function_type_ok compound_statement                       
        { $$ = MkFunction($1, $2, null); ProcessFunctionBody($$, $3); $$.loc = @$; }
 
        | declarator_function declaration_list compound_statement                             { $$ = MkFunction(null, $1, $2); ProcessFunctionBody($$, $3); $$.loc = @$; }
@@ -3299,6 +3566,8 @@ function_definition:
 function_definition_error:
      external_guess_declaration_specifiers declarator_function declaration_list compound_statement_error      { $$ = MkFunction($1, $2, $3); ProcessFunctionBody($$, $4); $$.loc = @$; $$.loc.end = $4.loc.end; }
        | external_guess_declaration_specifiers declarator_function compound_statement_error                       { $$ = MkFunction($1, $2, null); ProcessFunctionBody($$, $3); $$.loc = @$; $$.loc.end = $3.loc.end; }
+   | external_guess_declaration_specifiers declarator_function_type_ok declaration_list compound_statement_error      { $$ = MkFunction($1, $2, $3); ProcessFunctionBody($$, $4); $$.loc = @$; $$.loc.end = $4.loc.end; }
+       | external_guess_declaration_specifiers declarator_function_type_ok compound_statement_error                       { $$ = MkFunction($1, $2, null); ProcessFunctionBody($$, $3); $$.loc = @$; $$.loc.end = $3.loc.end; }
        | declarator_function declaration_list compound_statement_error                             { $$ = MkFunction(null, $1, $2); ProcessFunctionBody($$, $3); $$.loc = @$; $$.loc.end = $3.loc.end; }
        | declarator_function compound_statement_error                                              { $$ = MkFunction(null, $1, null); ProcessFunctionBody($$, $2); $$.loc = @$; $$.loc.end = $2.loc.end; }
    ;
@@ -3309,7 +3578,7 @@ string_literal:
    { 
       int len1 = strlen($1);
       int len2 = strlen(yytext);
-      $$ = eSystem_New(len1-1 + len2-1 + 1);
+      $$ = new byte[len1-1 + len2-1 + 1];
       memcpy($$, $1, len1-1);
       memcpy($$ + len1-1, yytext+1, len2);
       delete $1;
@@ -3322,13 +3591,21 @@ external_declaration:
       { $$ = MkExternalClass($1);  $$.loc = @$; $1.declMode = (declMode != defaultAccess) ? declMode : privateAccess; declMode = defaultDeclMode; }
 
    | external_guess_declaration_specifiers class
-      { $$ = MkExternalClass($2);  $$.loc = @$; $2.declMode = (declMode != defaultAccess) ? declMode : privateAccess; declMode = defaultDeclMode; }
+      { $$ = MkExternalClass($2);  $$.loc = @$; $2.declMode = (declMode != defaultAccess) ? declMode : privateAccess; declMode = defaultDeclMode; FreeList($1, FreeSpecifier); }
 
        | external_guess_declaration
       { $$ = MkExternalDeclaration($1);  $$.loc = @$; $1.declMode = declMode; declMode = defaultDeclMode; }
    | IMPORT string_literal { $$ = MkExternalImport($2, normalImport, (declMode != defaultAccess) ? declMode : privateAccess);  $$.loc = @$; }
    | IMPORT STATIC string_literal { $$ = MkExternalImport($3, staticImport, (declMode != defaultAccess) ? declMode : privateAccess);  $$.loc = @$; }
-   | IMPORT identifier string_literal { if(!strcmp($2.string, "remote")) { $$ = MkExternalImport($3, remoteImport, (declMode != defaultAccess) ? declMode : privateAccess);  $$.loc = @$; } else yyerror(); FreeIdentifier($2); }
+   | IMPORT identifier string_literal
+   {
+      bool isRemote = !strcmp($2.string, "remote");
+      $$ = MkExternalImport($3, isRemote ? remoteImport : normalImport, (declMode != defaultAccess) ? declMode : privateAccess); 
+      $$.loc = @$;
+      FreeIdentifier($2);
+      if(!isRemote)
+         yyerror(); 
+   }
    
    | ';' { $$ = null; }
 
@@ -3338,7 +3615,16 @@ external_declaration:
        | declaration_mode external_guess_declaration         { $$ = MkExternalDeclaration($2); $$.loc = @$; $2.declMode = $1; declMode = defaultDeclMode; }
    | declaration_mode IMPORT string_literal { $$ = MkExternalImport($3, normalImport, ($1 != defaultAccess) ? $1 : privateAccess);  $$.loc = @$; declMode = defaultDeclMode; }
    | declaration_mode IMPORT STATIC string_literal { $$ = MkExternalImport($4, staticImport, ($1 != defaultAccess) ? $1 : privateAccess);  $$.loc = @$; declMode = defaultDeclMode; }
-   | declaration_mode IMPORT identifier string_literal { if(!strcmp($3.string, "remote")) { $$ = MkExternalImport($4, remoteImport, ($1 != defaultAccess) ? $1 : privateAccess);  $$.loc = @$; FreeIdentifier($3); } else yyerror();  declMode = defaultDeclMode; }
+   | declaration_mode IMPORT identifier string_literal
+   {
+      bool isRemote = !strcmp($3.string, "remote");
+      $$ = MkExternalImport($4, isRemote ? remoteImport : normalImport, ($1 != defaultAccess) ? $1 : privateAccess);
+      $$.loc = @$;
+      FreeIdentifier($3);
+      declMode = defaultDeclMode;
+      if(!isRemote)
+         yyerror();  
+   }
    | declaration_mode ':' { defaultDeclMode = $1; $$ = null; }
    | STATIC ':' { defaultDeclMode = staticAccess; $$ = null; }
    | NAMESPACE identifier { $$ = MkExternalNameSpace($2); $$.loc = @$; }
@@ -3349,7 +3635,14 @@ external_declaration:
 
 external_declaration_error:
      class_error               { $$ = MkExternalClass($1);  $$.loc = $1.loc; $1.declMode = (declMode != defaultAccess) ? declMode : privateAccess; declMode = defaultDeclMode; }
-   | external_guess_declaration_specifiers class_error               { $$ = MkExternalClass($2);  $$.loc = $2.loc; $2.declMode = (declMode != defaultAccess) ? declMode : privateAccess; declMode = defaultDeclMode; }
+   | external_guess_declaration_specifiers class_error
+   {
+      FreeList($1, FreeSpecifier);
+      $$ = MkExternalClass($2);
+      $$.loc = $2.loc;
+      $2.declMode = (declMode != defaultAccess) ? declMode : privateAccess;
+      declMode = defaultDeclMode;
+   }
    | function_definition_error { $$ = MkExternalFunction($1); $$.loc = $1.loc;  $1.declMode = declMode; declMode = defaultDeclMode; }
 
    | declaration_mode class_error               { $$ = MkExternalClass($2);  $$.loc = $2.loc; $2.declMode = ($1 != defaultAccess) ? $1 : privateAccess; declMode = defaultDeclMode; }
@@ -3362,19 +3655,19 @@ external_declaration_error:
 
 translation_unit_error:
      external_declaration_error                    { $$ = MkList(); ListAdd($$, $1); ast = $$; }
-   | translation_unit external_declaration_error   { ListAdd($1, $2); }
-   | translation_unit_error external_declaration_error   { ListAdd($1, $2); }
+   | translation_unit external_declaration_error   { $$ = $1; ListAdd($1, $2); }
+   | translation_unit_error external_declaration_error   { $$ = $1; ListAdd($1, $2); }
    | translation_unit error
    | translation_unit_error error
        ;
 
 translation_unit:
          external_declaration                    { $$ = MkList(); ListAdd($$, $1); ast = $$; }
-       | translation_unit external_declaration   { ListAdd($1, $2); }
+       | translation_unit external_declaration   { $$ = $1; ListAdd($1, $2); }
    | translation_unit_error class  
-      { External _class = MkExternalClass($2); ListAdd($1, _class); _class.loc = @2;  $2.declMode = (declMode != defaultAccess) ? declMode : privateAccess; declMode = defaultDeclMode; }
+      { External _class = MkExternalClass($2); $$ = $1; ListAdd($1, _class); _class.loc = @2;  $2.declMode = (declMode != defaultAccess) ? declMode : privateAccess; declMode = defaultDeclMode; }
    | translation_unit_error declaration_mode class
-      { External _class = MkExternalClass($3); ListAdd($1, _class); _class.loc = @3;  $3.declMode = ($2 != defaultAccess) ? $2 : privateAccess; declMode = defaultDeclMode; }
+      { External _class = MkExternalClass($3); $$ = $1; ListAdd($1, _class); _class.loc = @3;  $3.declMode = ($2 != defaultAccess) ? $2 : privateAccess; declMode = defaultDeclMode; }
        ;
 
 thefile: