compiler: (WIP) Fixes for MinGW/GCC 5
[sdk] / compiler / libec / src / grammar.y
index e506f47..b71106a 100644 (file)
@@ -1,6 +1,7 @@
 %{
 import "ecdefs"
 
+#define YYSIZE_T size_t
 #define YYLTYPE Location
 #include "grammar.h"
 
@@ -25,7 +26,8 @@ int defaultMemberAccess = -1;
 
 #define POP_DEFAULT_ACCESS    if(defaultMemberAccess > -1) defaultMemberAccess--;
 
-#define C89_DECL_WARNING   "eC expects all declarations to precede statements in the block (C89 style)\n"
+#define C89_DECL_WARNING            $"eC expects all declarations to precede statements in the block (C89 style)\n"
+#define CASE_LABELED_STMT_WARNING   $"labeled statement directly within a case statement\n"
 
 #define uint _uint
 default:
@@ -96,12 +98,13 @@ default:
             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
-            simple_primary_expression
-            simple_postfix_expression simple_postfix_expression_error
+            simple_primary_expression constant
             common_unary_expression common_unary_expression_error
-            simple_unary_expression simple_unary_expression_error
             database_open dbfield dbindex dbtable
 
+//simple_unary_expression simple_unary_expression_error
+// simple_postfix_expression simple_postfix_expression_error
+
 %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
@@ -176,7 +179,7 @@ default:
 %token XOR_ASSIGN OR_ASSIGN TYPE_NAME
 
 %token TYPEDEF EXTERN STATIC AUTO REGISTER
-%token CHAR SHORT INT UINT INT64 LONG SIGNED UNSIGNED FLOAT DOUBLE CONST VOLATILE VOID VALIST
+%token CHAR SHORT INT UINT INT64 INT128 LONG SIGNED UNSIGNED FLOAT DOUBLE CONST VOLATILE VOID VALIST
 %token STRUCT UNION ENUM ELLIPSIS
 
 %token CASE DEFAULT IF SWITCH WHILE DO FOR GOTO CONTINUE BREAK RETURN
@@ -192,6 +195,9 @@ default:
 %token NEW0OP RENEW0 VAARG
 %token DBTABLE DBFIELD DBINDEX DATABASE_OPEN
 %token ALIGNOF ATTRIB_DEP __ATTRIB
+%token BOOL _BOOL _COMPLEX _IMAGINARY RESTRICT THREAD
+%token WIDE_STRING_LITERAL
+%token BUILTIN_OFFSETOF
 
 %destructor { FreeIdentifier($$); } identifier
 %destructor { FreePointer($$); } pointer
@@ -278,17 +284,7 @@ guess_type:
    identifier '*'
    {
       $$ = null;
-      // if($1._class && !$1._class.name)
-      if($1._class)
-      {
-         char name[1024];
-         strcpy(name,  $1._class.name ? $1._class.name : "");
-         strcat(name, "::");
-         strcat(name, $1.string);
-         _DeclClass(0, name);
-      }
-      else
-         _DeclClass(0, $1.string);
+      _DeclClass($1._class, $1.string);
 
       FreeIdentifier($1);
 
@@ -308,17 +304,7 @@ guess_type:
    {
       $$ = null;
    #ifdef PRECOMPILER
-      // if($1._class && !$1._class.name)
-      if($1._class)
-      {
-         char name[1024];
-         strcpy(name,  $1._class.name ? $1._class.name : "");
-         strcat(name, "::");
-         strcat(name, $1.string);
-         _DeclClass(0, name);
-      }
-      else
-         _DeclClass(0, $1.string);
+      _DeclClass($1._class, $1.string);
 
       FreeIdentifier($1);
 
@@ -337,17 +323,7 @@ guess_type:
    }
 /*   | identifier '*' '<' template_arguments_list '>'
    {
-      //if($1._class && !$1._class.name)
-      if($1._class)
-      {
-         char name[1024];
-         strcpy(name,  $1._class.name ? $1._class.name : "");
-         strcat(name, "::");
-         strcat(name, $1.string);
-         _DeclClass(0, name);
-      }
-      else
-         _DeclClass(0, $1.string);
+      _DeclClass($1._class, $1.string);
       fileInput.Seek(@1.start.pos, start);
       resetScannerPos(&@1.start);
       yyclearin;
@@ -367,52 +343,42 @@ type:
    | identifier identifier
    {
    #ifdef PRECOMPILER
-      // if($1._class && !$1._class.name)
-      if($1._class)
+      if(!$1.string[0])
       {
-         char name[1024];
-         strcpy(name,  $1._class.name ? $1._class.name : "");
-         strcat(name, "::");
-         strcat(name, $1.string);
-         _DeclClass(0, name);
+         $$ = MkSpecifierName($1.string);
+         FreeIdentifier($1);
+         FreeIdentifier($2);
       }
       else
-         _DeclClass(0, $1.string);
-      FreeIdentifier($1);
-      FreeIdentifier($2);
+      {
+         _DeclClass($1._class, $1.string);
 
-      fileInput.Seek(@1.start.pos, start);
-      resetScannerPos(&@1.start);
-      yyclearin;
+         FreeIdentifier($1);
+         FreeIdentifier($2);
 
-      YYPOPSTACK(1);
-      yystate = *yyssp;
-      YY_STACK_PRINT (yyss, yyssp);
-      YYPOPSTACK(1);
-      yystate = *yyssp;
-      YY_STACK_PRINT (yyss, yyssp);
-      goto yysetstate;
+         fileInput.Seek(@1.start.pos, start);
+         resetScannerPos(&@1.start);
+         yyclearin;
+
+         YYPOPSTACK(1);
+         yystate = *yyssp;
+         YY_STACK_PRINT (yyss, yyssp);
+         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);
-      yylloc = tmpLoc; $2.badID = $1;
+         Location tmpLoc = yylloc; $$ = $2; yylloc = @1;
+         Compiler_Error($"Not a type: %s\n", $1.string);
+         yylloc = tmpLoc; $2.badID = $1;
    #endif
+      }
    }
    /*
    | identifier '<'
    {
    #ifdef PRECOMPILER
-      //if($1._class && !$1._class.name)
-      if($1._class)
-      {
-         char name[1024];
-         strcpy(name,  $1._class.name ? $1._class.name : "");
-         strcat(name, "::");
-         strcat(name, $1.string);
-         _DeclClass(0, name);
-      }
-      else
-         _DeclClass(0, $1.string);
+      _DeclClass($1._class, $1.string);
       fileInput.Seek(@1.start.pos, start);
       resetScannerPos(&@1.start);
       yyclearin;
@@ -430,17 +396,7 @@ type:
    | identifier identifier '<' template_arguments_list '>'
    {
    #ifdef PRECOMPILER
-      // if($1._class && !$1._class.name)
-      if($1._class)
-      {
-         char name[1024];
-         strcpy(name,  $1._class.name ? $1._class.name : "");
-         strcat(name, "::");
-         strcat(name, $1.string);
-         _DeclClass(0, name);
-      }
-      else
-         _DeclClass(0, $1.string);
+      _DeclClass($1._class, $1.string);
       FreeIdentifier($1);
       FreeIdentifier($2);
 
@@ -488,17 +444,7 @@ strict_type:
 /*    | identifier '<' template_arguments_list '>' */
       /*| identifier '<' error
       {
-         // if($1._class && !$1._class.name)
-         if($1._class)
-         {
-            char name[1024];
-            strcpy(name,  $1._class.name ? $1._class.name : "");
-            strcat(name, "::");
-            strcat(name, $1.string);
-            _DeclClass(0, name);
-         }
-         else
-            _DeclClass(0, $1.string);
+         _DeclClass($1._class, $1.string);
 
          yyerrok;
 
@@ -523,40 +469,40 @@ strict_type:
 
 class_function_definition_start:
    guess_declaration_specifiers declarator_function_type_ok
-      { $$ = MkClassFunction($1, null, $2, null); $$.loc = @$; $$.id = ++globalContext.nextID; }
+      { $$ = MkClassFunction($1, null, $2, null); $$.loc = @$; }
    | declarator_function
-      { $$ = MkClassFunction(null, null, $1, null); $$.loc = @$; $$.id = ++globalContext.nextID; }
+      { $$ = MkClassFunction(null, null, $1, null); $$.loc = @$; }
    ;
 
 constructor_function_definition_start:
    guess_declaration_specifiers '(' ')'
-      { $$ = MkClassFunction(null, null, null, null); $$.isConstructor = true; $$.loc = @$; $$.id = ++globalContext.nextID; FreeList($1, FreeSpecifier); }
+      { $$ = MkClassFunction($1, null, null, null); $$.isConstructor = true; $$.loc = @$; }
    ;
 
 destructor_function_definition_start:
    '~' guess_declaration_specifiers '(' ')'
-      { $$ = MkClassFunction(null, null, null, null); $$.isDestructor = true; $$.loc = @$; $$.id = ++globalContext.nextID; FreeList($2, FreeSpecifier) }
+      { $$ = MkClassFunction($2, null, null, null); $$.isDestructor = true; $$.loc = @$; }
    ;
 
 virtual_class_function_definition_start:
      VIRTUAL guess_declaration_specifiers declarator_function_type_ok
-      { $$ = MkClassFunction($2, null, $3, null); $$.isVirtual = true; $$.loc = @$; $$.id = ++globalContext.nextID; }
+      { $$ = MkClassFunction($2, null, $3, null); $$.isVirtual = true; $$.loc = @$; }
    | VIRTUAL declarator_function
-      { $$ = MkClassFunction(null, null, $2, null); $$.isVirtual = true; $$.loc = @$; $$.id = ++globalContext.nextID; }
+      { $$ = MkClassFunction(null, null, $2, null); $$.isVirtual = true; $$.loc = @$; }
       ;
 
 class_function_definition_start_error:
      guess_declaration_specifiers declarator_function_error_type_ok
-      { $$ = MkClassFunction($1, null, $2, null); $$.loc = @$; $$.id = ++globalContext.nextID; }
+      { $$ = MkClassFunction($1, null, $2, null); $$.loc = @$; }
    | declarator_function_error
-      { $$ = MkClassFunction(null, null, $1, null); $$.loc = @$; $$.id = ++globalContext.nextID; }
+      { $$ = MkClassFunction(null, null, $1, null); $$.loc = @$; }
    ;
 
 virtual_class_function_definition_start_error:
      VIRTUAL guess_declaration_specifiers declarator_function_error_type_ok
-      { $$ = MkClassFunction($2, null, $3, null); $$.isVirtual = true; $$.loc = @$; $$.id = ++globalContext.nextID; }
+      { $$ = MkClassFunction($2, null, $3, null); $$.isVirtual = true; $$.loc = @$; }
    | VIRTUAL declarator_function_error
-      { $$ = MkClassFunction(null, null, $2, null); $$.isVirtual = true; $$.loc = @$; $$.id = ++globalContext.nextID; }
+      { $$ = MkClassFunction(null, null, $2, null); $$.isVirtual = true; $$.loc = @$; }
       ;
 
 class_function_definition:
@@ -604,14 +550,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_type_ok
-      { $$ = MkClassFunction($1, null, $2, null); $$.loc = @$; $$.id = ++globalContext.nextID; }
+      { $$ = MkClassFunction($1, null, $2, null); $$.loc = @$; }
    |  declaration_specifiers declarator_nofunction_type_ok
-      { $$ = MkClassFunction($1, null, MkDeclaratorFunction($2, null), null); $$.loc = @$; $$.id = ++globalContext.nextID; }
+      { $$ = MkClassFunction($1, null, MkDeclaratorFunction($2, null), null); $$.loc = @$; }
       ;
 
 instance_class_function_definition_start_error:
    declaration_specifiers declarator_function_error_type_ok
-      { $$ = MkClassFunction($1, null, $2, null); $$.loc = @$; $$.id = ++globalContext.nextID; }
+      { $$ = MkClassFunction($1, null, $2, null); $$.loc = @$; }
       ;
 
 instance_class_function_definition:
@@ -719,9 +665,21 @@ members_initialization_list_coloned:
    | 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; $$ = $1; }
+   | members_initialization_list_coloned ';'
+   {
+      MembersInit members = (MembersInit)$$->last;
+      if(members.type == dataMembersInit)
+         members.loc.end = @$.end;
+      else
+      {
+         MembersInit members = MkMembersInitList(MkList());
+         ListAdd($$, members);
+         members.loc = @2;
+      }
+      $$ = $1;
+   }
+   | ';'                                                                            { MembersInit members = MkMembersInitList(MkList()); $$ = MkList(); ListAdd($$, members); members.loc = @1;  }
    ;
 
 members_initialization_list:
@@ -1126,13 +1084,13 @@ firewatchers:
        ;
 
 struct_declaration:
-     struct_declaration_error ';' { $$ = $1; $$.loc.end = @2.start; }
+     struct_declaration_error ';' { $$ = $1; $$.loc.end = @2.end; }
    | 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]; }
+   | property                       { $$ = MkClassDefProperty($1); $$.loc = @$; $$.memberAccess = memberAccessStack[defaultMemberAccess]; }
    | member_access class_function_definition                                       { $$ = MkClassDefFunction($2); $$.loc = @$; $$.memberAccess = $1; }
-   | member_access property                       { $$ = MkClassDefProperty($2); $$.loc = @$; globalContext.nextID++; $$.memberAccess = $1; }
-   | class_property                 { $$ = MkClassDefClassProperty($1); $$.loc = @$; globalContext.nextID++; }
+   | member_access property                       { $$ = MkClassDefProperty($2); $$.loc = @$; $$.memberAccess = $1; }
+   | class_property                 { $$ = MkClassDefClassProperty($1); $$.loc = @$; }
    | WATCHABLE { $$ = null; deleteWatchable = true; }
    | CLASS_NO_EXPANSION             { $$ = MkClassDefNoExpansion(); }
    | CLASS_FIXED                    { $$ = MkClassDefFixed(); }
@@ -1155,7 +1113,7 @@ struct_declaration_error:
    | 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++; }
+   | self_watch_definition      { $$ = MkClassDefPropertyWatch($1); $$.loc = @$; }
    | CLASS_DESIGNER identifier { $$ = MkClassDefDesigner($2.string); FreeIdentifier($2); }
    | CLASS_DESIGNER strict_type { $$ = MkClassDefDesigner($2.name); FreeSpecifier($2); }
    | CLASS_DEFAULT_PROPERTY identifier { $$ = MkClassDefDesignerDefaultProperty($2); }
@@ -1184,10 +1142,10 @@ struct_declaration_list:
        ;
 
 struct_declaration_list_error:
-     struct_declaration_error { $$ = MkList(); ListAdd($$, $1); }
+     struct_declaration_error { yyerror(); $$ = MkList(); ListAdd($$, $1); }
    | struct_declaration_list error
    | struct_declaration_list_error error
-   | struct_declaration_list struct_declaration_error { $$ = $1; ListAdd($$, $2); }
+   | struct_declaration_list struct_declaration_error { yyerror(); $$ = $1; ListAdd($$, $2); }
    | struct_declaration_list_error struct_declaration_error { $$ = $1; ListAdd($$, $2); }
        ;
 
@@ -1312,30 +1270,30 @@ class_entry:
    };
 
 class_decl:
-     class_entry identifier { $1; $$ = DeclClassAddNameSpace(globalContext.nextID++, $2.string); FreeIdentifier($2); $$.nameLoc = @2; memberAccessStack[++defaultMemberAccess] = privateAccess; }
+     class_entry identifier { (void)$1; $$ = DeclClassAddNameSpace($2._class, $2.string); FreeIdentifier($2); $$.nameLoc = @2; memberAccessStack[++defaultMemberAccess] = privateAccess; }
    | class_entry base_strict_type
    {
-      $1; $$ = DeclClass(globalContext.nextID++, $2.name);
+      (void)$1; $$ = DeclClass($2.nsSpec, $2.name);
       $$.nameLoc = @2;
       FreeSpecifier($2);
       ++defaultMemberAccess;
       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; }
+   | identifier class_entry identifier { (void)$2; $$ = DeclClassAddNameSpace($3._class, $3.string); FreeIdentifier($1); FreeIdentifier($3); $$.nameLoc = @3; $$.isRemote = true; memberAccessStack[++defaultMemberAccess] = privateAccess; }
+   | identifier class_entry base_strict_type { (void)$2; $$ = DeclClass($3.nsSpec, $3.name); FreeIdentifier($1); $$.nameLoc = @3; $$.isRemote = true; FreeSpecifier($3); 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 identifier '<' template_parameters_list '>' { (void)$1; $$ = DeclClassAddNameSpace($2._class, $2.string); $$.templateParams = $4; FreeIdentifier($2); $$.nameLoc = @2; memberAccessStack[++defaultMemberAccess] = privateAccess; }
    | class_entry base_strict_type '<' template_parameters_list '>'
    {
-      $1; $$ = DeclClass(globalContext.nextID++, $2.name);
+      (void)$1; $$ = DeclClass($2.nsSpec, $2.name);
       $$.templateParams = $4;
       $$.nameLoc = @2;
       FreeSpecifier($2);
       ++defaultMemberAccess;
       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; }
+   | identifier class_entry identifier '<' template_parameters_list '>' { (void)$2; $$ = DeclClassAddNameSpace($3._class, $3.string); $$.templateParams = $5; FreeIdentifier($1); FreeIdentifier($3); $$.nameLoc = @3; $$.isRemote = true; memberAccessStack[++defaultMemberAccess] = privateAccess; }
+   | identifier class_entry base_strict_type '<' template_parameters_list '>' { (void)$2; $$ = DeclClass($3.nsSpec, $3.name); $$.templateParams = $5; FreeIdentifier($1); $$.nameLoc = @3; $$.isRemote = true; FreeSpecifier($3); memberAccessStack[++defaultMemberAccess] = privateAccess; }
    ;
 
 class:
@@ -1348,33 +1306,33 @@ class:
    // Added this for unit classes...
        | class_head ';'
       {
-         $$ = $1; $$.definitions = MkList(); $$.blockStart = @2;  $$.loc = @$; $$.endid = globalContext.nextID++;
+         $$ = $1; $$.definitions = MkList(); $$.blockStart = @2;  $$.loc = @$;
          POP_DEFAULT_ACCESS
          PopContext(curContext);
       }
 
        | class_decl '{' '}'
       {
-         $$ = MkClass($1, null, MkList()); $$.blockStart = @2;  $$.loc = @$; $$.endid = globalContext.nextID++;
+         $$ = MkClass($1, null, MkList()); $$.blockStart = @2;  $$.loc = @$;
          POP_DEFAULT_ACCESS
          PopContext(curContext);
       }
        | class_head '{' '}'
       {
-         $$ = $1; $$.definitions = MkList(); $$.blockStart = @2;  $$.loc = @$; $$.endid = globalContext.nextID++;
+         $$ = $1; $$.definitions = MkList(); $$.blockStart = @2;  $$.loc = @$;
          POP_DEFAULT_ACCESS
          PopContext(curContext);
       }
 
        | class_entry identifier ';'
       {
-         $1; $$ = MkClass(DeclClassAddNameSpace(0, $2.string), null, null); FreeIdentifier($2);
+         (void)$1; $$ = MkClass(DeclClassAddNameSpace($2._class, $2.string), null, null); FreeIdentifier($2);
          POP_DEFAULT_ACCESS
          PopContext(curContext);
       }
        | class_entry type ';'
       {
-         $1; $$ = MkClass(DeclClass(0, $2.name), null, null); FreeSpecifier($2);
+         (void)$1; $$ = MkClass(DeclClass($2.nsSpec, $2.name), null, null); FreeSpecifier($2);
          POP_DEFAULT_ACCESS
          PopContext(curContext);
       }
@@ -1390,37 +1348,37 @@ class_head:
 class_error:
         class_decl '{' struct_declaration_list_error
       {
-         $$ = MkClass($1, null, $3); $$.deleteWatchable = deleteWatchable; deleteWatchable = false; $$.blockStart = @2; $$.loc = @$; $$.loc.end.charPos++; $$.loc.end.pos++; $$.endid = globalContext.nextID++;
+         $$ = MkClass($1, null, $3); $$.deleteWatchable = deleteWatchable; deleteWatchable = false; $$.blockStart = @2; $$.loc = @$; $$.loc.end.charPos++; $$.loc.end.pos++;
          POP_DEFAULT_ACCESS
          PopContext(curContext);
       }
        | class_head '{' struct_declaration_list_error
       {
-         $$ = $1; $$.definitions = $3; $$.deleteWatchable = deleteWatchable; deleteWatchable = false; $$.blockStart = @2;  $$.loc = @$; $$.loc.end.charPos++; $$.loc.end.pos++; $$.endid = globalContext.nextID++;
+         $$ = $1; $$.definitions = $3; $$.deleteWatchable = deleteWatchable; deleteWatchable = false; $$.blockStart = @2;  $$.loc = @$; $$.loc.end.charPos++; $$.loc.end.pos++;
          POP_DEFAULT_ACCESS
          PopContext(curContext);
       }
        | class_decl '{' struct_declaration_list
       {
-         $$ = MkClass($1, null, $3); $$.deleteWatchable = deleteWatchable; deleteWatchable = false; $$.blockStart = @2; $$.loc = @$; $$.loc.end.charPos++; $$.loc.end.pos++; $$.endid = globalContext.nextID++;
+         $$ = MkClass($1, null, $3); $$.deleteWatchable = deleteWatchable; deleteWatchable = false; $$.blockStart = @2; $$.loc = @$; $$.loc.end.charPos++; $$.loc.end.pos++;
          POP_DEFAULT_ACCESS
          PopContext(curContext);
       }
        | class_head '{' struct_declaration_list
       {
-         $$ = $1; $$.definitions = $3; $$.deleteWatchable = deleteWatchable; deleteWatchable = false; $$.blockStart = @2;  $$.loc = @$; $$.loc.end.charPos++; $$.loc.end.pos++; $$.endid = globalContext.nextID++;
+         $$ = $1; $$.definitions = $3; $$.deleteWatchable = deleteWatchable; deleteWatchable = false; $$.blockStart = @2;  $$.loc = @$; $$.loc.end.charPos++; $$.loc.end.pos++;
          POP_DEFAULT_ACCESS
          PopContext(curContext);
       }
        | class_decl '{' error
       {
-         $$ = MkClass($1, null, MkList()); $$.deleteWatchable = deleteWatchable; deleteWatchable = false; $$.blockStart = @2;  $$.loc = @$; $$.loc.end.charPos++; $$.loc.end.pos++; $$.endid = globalContext.nextID++;
+         $$ = MkClass($1, null, MkList()); $$.deleteWatchable = deleteWatchable; deleteWatchable = false; $$.blockStart = @2;  $$.loc = @$; $$.loc.end.charPos++; $$.loc.end.pos++;
          POP_DEFAULT_ACCESS
          PopContext(curContext);
       }
        | class_head '{' error
       {
-         $$ = $1; $$.definitions = MkList(); $$.deleteWatchable = deleteWatchable; deleteWatchable = false; $$.blockStart = @2;  $$.loc = @$; $$.loc.end.charPos++; $$.loc.end.pos++; $$.endid = globalContext.nextID++;
+         $$ = $1; $$.definitions = MkList(); $$.deleteWatchable = deleteWatchable; deleteWatchable = false; $$.blockStart = @2;  $$.loc = @$; $$.loc.end.charPos++; $$.loc.end.pos++;
          POP_DEFAULT_ACCESS
          PopContext(curContext);
       }
@@ -1445,6 +1403,10 @@ i18n_string:
    | '$' string_literal '.' string_literal     { $$ = MkExpIntlString($4, $2); delete $2; delete $4; $$.loc = @$; }
    ;
 
+constant:
+   CONSTANT { $$ = MkExpConstant(yytext); $$.loc = @$; }
+   ;
+
 simple_primary_expression:
          identifier         { $$ = MkExpIdentifier($1); $$.loc = @$; }
    | instantiation_unnamed      { $$ = MkExpInstance($1); $$.loc = @$; }
@@ -1452,8 +1414,22 @@ simple_primary_expression:
    | EXTENSION '(' expression ')'    { $$ = MkExpExtensionExpression($3); $$.loc = @$; }
    | 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 = @$; }
+   | constant identifier
+   {
+      char * constant = $1.constant;
+      int len = strlen(constant);
+      if(constant[len-1] == '.')
+      {
+         constant[len-1] = 0;
+         $$ = MkExpMember($1, $2);
+         $$.loc = @$;
+      }
+      else
+         yyerror();
+   }
+       | constant { $$ = $1; }
    | i18n_string
+   | WIDE_STRING_LITERAL { $$ = MkExpWideString(yytext); $$.loc = @$; }
    | '(' ')' { 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 = @$; }
@@ -1483,6 +1459,7 @@ simple_primary_expression:
    | dbtable
 
    | '[' argument_expression_list /*expression*/ ']' { $$ = MkExpArray($2); $$.loc = @$; }
+   | '[' ']' { $$ = MkExpArray(null); $$.loc = @$; }
    ;
 
 anon_instantiation_expression:
@@ -1494,7 +1471,7 @@ anon_instantiation_expression_error:
    ;
 
 primary_expression_error:
-         '(' expression  { $$ = MkExpBrackets($2); $$.loc = @$; }
+         '(' expression  { yyerror(); $$ = MkExpBrackets($2); $$.loc = @$; }
    | '(' expression_error { $$ = MkExpBrackets($2); $$.loc = @$; }
    ;
 
@@ -1521,7 +1498,7 @@ postfix_expression:
        | postfix_expression_error DEC_OP                           { $$ = MkExpOp($1, DEC_OP, null); $$.loc = @$; }
 ;
 
-simple_postfix_expression:
+/*simple_postfix_expression:
          simple_primary_expression
 
    | simple_postfix_expression '[' expression ']'               { $$ = MkExpIndex($1, $3); $$.loc = @$; }
@@ -1542,7 +1519,7 @@ simple_postfix_expression:
        | simple_postfix_expression_error PTR_OP identifier                { $$ = MkExpPointer($1, $3); $$.loc = @$; }
        | simple_postfix_expression_error INC_OP                           { $$ = MkExpOp($1, INC_OP, null); $$.loc = @$; }
        | simple_postfix_expression_error DEC_OP                           { $$ = MkExpOp($1, DEC_OP, null); $$.loc = @$; }
-;
+;*/
 
 argument_expression_list:
          assignment_expression          { $$ = MkList(); ListAdd($$, $1); }
@@ -1556,7 +1533,7 @@ argument_expression_list_error:
    | anon_instantiation_expression_error    { $$ = MkList(); ListAdd($$, $1); }
    | 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); }
+   | argument_expression_list ',' { Expression exp = MkExpDummy(); yyerror(); exp.loc.start = @2.end; exp.loc.end = @2.end; $$ = $1; ListAdd($1, exp); }
        ;
 
 common_unary_expression:
@@ -1564,27 +1541,29 @@ common_unary_expression:
        | DEC_OP unary_expression           { $$ = MkExpOp(null, DEC_OP, $2); $$.loc = @$; }
        | unary_operator cast_expression    { $$ = MkExpOp(null, $1, $2); $$.loc = @$; }
    | unary_operator anon_instantiation_expression    { $$ = MkExpOp(null, $1, $2); $$.loc = @$; }
-       | SIZEOF '(' unary_expression ')'         { $$ = MkExpOp(null, SIZEOF, $3); $$.loc = @$; }
-   | SIZEOF simple_unary_expression           { $$ = MkExpOp(null, SIZEOF, $2); $$.loc = @$; }
+       //| SIZEOF '(' unary_expression ')'         { $$ = MkExpOp(null, SIZEOF, $3); $$.loc = @$; }
+   | SIZEOF unary_expression           { $$ = MkExpOp(null, SIZEOF, $2); $$.loc = @$; }
    | 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 '(' unary_expression ')'         { $$ = MkExpOp(null, ALIGNOF, $3); $$.loc = @$; }
+   | ALIGNOF unary_expression           { $$ = MkExpOp(null, ALIGNOF, $2); $$.loc = @$; }
    | ALIGNOF '(' guess_type_name ')'          { $$ = MkExpTypeAlign($3); $$.loc = @$; }
+
+   | BUILTIN_OFFSETOF '(' guess_type_name ',' identifier ')'      { $$ = MkExpOffsetOf($3, $5); $$.loc = @$; }
        ;
 
 unary_expression:
        common_unary_expression
          | postfix_expression
        ;
-
-simple_unary_expression:
+/*
+?:
      common_unary_expression
        | simple_postfix_expression
        ;
-
+*/
 unary_operator:
          '&'     { $$ = '&'; }
        | '*'     { $$ = '*'; }
@@ -1726,8 +1705,8 @@ assignment_expression:
          conditional_expression
        | unary_expression assignment_operator assignment_expression   { $$ = MkExpOp($1, $2, $3); $$.loc = @$; }
    | unary_expression_error assignment_operator assignment_expression   { $$ = MkExpOp($1, $2, $3); $$.loc = @$; }
-       | conditional_expression assignment_operator assignment_expression   { $$ = MkExpOp($1, $2, $3); $$.loc = @$; }           // TODO: Generate error here:
-   | conditional_expression_error assignment_operator assignment_expression   { $$ = MkExpOp($1, $2, $3); $$.loc = @$; }     // TODO: Generate error here:
+       | conditional_expression assignment_operator assignment_expression   { Compiler_Error($"l-value expected\n"); $$ = MkExpOp($1, $2, $3); $$.loc = @$; }
+   | conditional_expression_error assignment_operator assignment_expression   { Compiler_Error($"l-value expected\n"); $$ = MkExpOp($1, $2, $3); $$.loc = @$; }
 
        | unary_expression assignment_operator anon_instantiation_expression   { $$ = MkExpOp($1, $2, $3); $$.loc = @$; }
    | unary_expression_error assignment_operator anon_instantiation_expression   { $$ = MkExpOp($1, $2, $3); $$.loc = @$; }
@@ -1771,7 +1750,7 @@ postfix_expression_error:
    | postfix_expression PTR_OP error                { $$ = MkExpPointer($1, null); $$.loc = @$; }
    | postfix_expression_error PTR_OP error                { $$ = MkExpPointer($1, null); $$.loc = @$; }
 
-   | 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 { yyerror(); $$ = 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++;}
@@ -1787,7 +1766,7 @@ postfix_expression_error:
    | postfix_expression_error '.' error                   { $$ = MkExpMember($1, null); $$.loc = @$; }
        ;
 
-simple_postfix_expression_error:
+/*simple_postfix_expression_error:
       error { $$ = MkExpDummy(); $$.loc = @$; }
    | simple_postfix_expression error
    | instantiation_unnamed_error error { $$ = MkExpInstance($1); $$.loc = @$; }
@@ -1795,34 +1774,34 @@ simple_postfix_expression_error:
    | simple_postfix_expression PTR_OP error                { $$ = MkExpPointer($1, null); $$.loc = @$; }
    | simple_postfix_expression_error PTR_OP error                { $$ = MkExpPointer($1, null); $$.loc = @$; }
 
-   | 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 { yyerror(); $$ = 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; }
-   */
+   // 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; }
+
    | 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++;}
-   /* 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++;}
-   */
+   // 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 = @$; }
        ;
+*/
 
 common_unary_expression_error:
           INC_OP unary_expression_error           { $$ = MkExpOp(null, INC_OP, $2); $$.loc = @$; }
         | DEC_OP unary_expression_error           { $$ = MkExpOp(null, DEC_OP, $2); $$.loc = @$; }
         | unary_operator cast_expression_error    { $$ = MkExpOp(null, $1, $2); $$.loc = @$; }
     | unary_operator anon_instantiation_expression_error    { $$ = MkExpOp(null, $1, $2); $$.loc = @$; }
-    | SIZEOF '(' unary_expression_error           { $$ = MkExpOp(null, SIZEOF, $3); $$.loc = @$; }
-        | SIZEOF simple_unary_expression_error           { $$ = MkExpOp(null, SIZEOF, $2); $$.loc = @$; }
+    //| SIZEOF '(' unary_expression_error           { $$ = MkExpOp(null, SIZEOF, $3); $$.loc = @$; }
+        | SIZEOF unary_expression_error           { $$ = MkExpOp(null, SIZEOF, $2); $$.loc = @$; }
         | 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 '(' unary_expression_error           { $$ = MkExpOp(null, ALIGNOF, $3); $$.loc = @$; }
+        | ALIGNOF unary_expression_error           { $$ = MkExpOp(null, ALIGNOF, $2); $$.loc = @$; }
         | ALIGNOF '(' guess_type_name ')' error          { $$ = MkExpTypeAlign($3); $$.loc = @$; }
        ;
 
@@ -1831,11 +1810,10 @@ unary_expression_error:
        | postfix_expression_error
    ;
 
-simple_unary_expression_error:
+/*simple_unary_expression_error:
      common_unary_expression_error
        | simple_postfix_expression_error
-   ;
-
+   ;*/
 
 cast_expression_error:
      unary_expression_error
@@ -1886,15 +1864,7 @@ relational_expression_error:
    {
       if($1.type == identifierExp)
       {
-         if($1.identifier._class && !$1.identifier._class.name)
-         {
-            char name[1024];
-            strcpy(name, "::");
-            strcat(name, $1.identifier.string);
-            _DeclClass(0, name);
-         }
-         else
-            _DeclClass(0, $1.identifier.string);
+         _DeclClass($1.identifier._class, $1.identifier.string);
 
          // printf("Declaring Class %s\n", $1.identifier.string);
          skipErrors = false;
@@ -2031,6 +2001,7 @@ conditional_expression_error:
 
        | logical_or_expression '?' ':'
       {
+         yyerror();
          $$ = MkExpCondition($1, MkListOne(MkExpDummy()), MkExpDummy());
          $$.loc = @$;
          ((Expression)$$.cond.exp->last).loc = @2;
@@ -2042,6 +2013,7 @@ conditional_expression_error:
       }
    | logical_or_expression '?'
       {
+         yyerror();
          $$ = MkExpCondition($1, MkListOne(MkExpDummy()), MkExpDummy()); $$.loc = @$; ((Expression)$$.cond.exp->last).loc = @2; $$.cond.elseExp.loc = @2;
       }
    | logical_or_expression_error '?'
@@ -2075,7 +2047,7 @@ expression_error:
    | expression_error ',' error
    | expression error
    */
-   | expression expression                      { $$ = $1; FreeList($2, FreeExpression); }
+   | expression expression                      { yyerror(); $$ = $1; FreeList($2, FreeExpression); }
    | expression_error expression                { $$ = $1; FreeList($2, FreeExpression); }
    | expression expression_error                { $$ = $1; FreeList($2, FreeExpression); }
    ;
@@ -2097,16 +2069,20 @@ storage_class_specifier:
          TYPEDEF       { $$ = MkSpecifier(TYPEDEF); }
        | EXTERN        { $$ = MkSpecifier(EXTERN); }
        | STATIC        { $$ = MkSpecifier(STATIC); }
+       | THREAD        { $$ = MkSpecifier(THREAD); }
        | AUTO          { $$ = MkSpecifier(AUTO); }
        | REGISTER      { $$ = MkSpecifier(REGISTER); }
+   | RESTRICT      { $$ = MkSpecifier(RESTRICT); }
        ;
 
 external_storage_class_specifier:
-         TYPEDEF       { $$ = MkSpecifier(TYPEDEF); declMode = defaultAccess; }
+         TYPEDEF       { $$ = MkSpecifier(TYPEDEF); structDeclMode = declMode = defaultAccess; }
        | EXTERN        { $$ = MkSpecifier(EXTERN); }
-       | STATIC        { $$ = MkSpecifier(STATIC); declMode = staticAccess; }
+       | STATIC        { $$ = MkSpecifier(STATIC); structDeclMode = declMode = staticAccess; }
+   | THREAD        { $$ = MkSpecifier(THREAD); }
        | AUTO          { $$ = MkSpecifier(AUTO); }
        | REGISTER      { $$ = MkSpecifier(REGISTER); }
+   | RESTRICT      { $$ = MkSpecifier(RESTRICT); }
        ;
 
 enumerator:
@@ -2151,11 +2127,14 @@ enum_specifier_compound_error:
    | enum_specifier strict_type '{' error                          { $$ = MkEnum(MkIdentifier($2.name), null); $$.loc = @$; FreeSpecifier($2); POP_DEFAULT_ACCESS }
        | enum_specifier strict_type '{' enumerator_list ';' struct_declaration_list           { $$ = MkEnum(MkIdentifier($2.name), $4); $$.loc = @$; $$.definitions = $6; FreeSpecifier($2); POP_DEFAULT_ACCESS }
        | enum_specifier strict_type '{' enumerator_list ';' struct_declaration_list_error           { $$ = MkEnum(MkIdentifier($2.name), $4); $$.loc = @$; $$.definitions = $6; FreeSpecifier($2); POP_DEFAULT_ACCESS }
+
+   | enum_specifier identifier '{' enumerator_list ';'      { $$ = MkEnum($2, $4); $$.loc = @$; POP_DEFAULT_ACCESS }
+       | enum_specifier strict_type '{' enumerator_list ';'            { $$ = MkEnum(MkIdentifier($2.name), $4); $$.loc = @$; FreeSpecifier($2); POP_DEFAULT_ACCESS }
        ;
 
 enum_decl:
-     enum_specifier identifier  { $$ = $2; if(declMode) DeclClassAddNameSpace(globalContext.nextID++, $2.string); }
-   | enum_specifier strict_type { $$ = MkIdentifier($2.name); if(declMode) DeclClass(globalContext.nextID++, $2.name); FreeSpecifier($2); }
+     enum_specifier identifier  { $$ = $2; if(declMode) DeclClassAddNameSpace($2._class, $2.string); }
+   | enum_specifier strict_type { $$ = MkIdentifier($2.name); if(declMode) DeclClass($2.nsSpec, $2.name); FreeSpecifier($2); }
    ;
 
 enum_class:
@@ -2183,6 +2162,11 @@ enum_class_error:
    | enum_decl '{' error    { $$ = MkEnum($1, null); $$.loc = @$; POP_DEFAULT_ACCESS }
    | enum_decl '{' enumerator_list ';' struct_declaration_list     { $$ = MkEnum($1, $3); $$.definitions = $5; $$.loc = @$; POP_DEFAULT_ACCESS }
    | enum_decl '{' enumerator_list ';' struct_declaration_list_error     { $$ = MkEnum($1, $3); $$.definitions = $5; $$.loc = @$; POP_DEFAULT_ACCESS }
+
+   | enum_decl ':' inheritance_specifiers '{' enumerator_list ';'            { $$ = MkEnum($1, $5); $$.baseSpecs = $3; $$.loc = @$; POP_DEFAULT_ACCESS }
+   | enum_decl ':' inheritance_specifiers '{' enumerator_list error ';'            { $$ = MkEnum($1, $5); $$.baseSpecs = $3;  $$.loc = @$; POP_DEFAULT_ACCESS }
+   | enum_decl ':' inheritance_specifiers '{' error ';'            { $$ = MkEnum($1, null); $$.baseSpecs = $3; $$.loc = @$; POP_DEFAULT_ACCESS }
+   | enum_decl '{' enumerator_list ';'      { $$ = MkEnum($1, $3);  $$.loc = @$; POP_DEFAULT_ACCESS }
    ;
 
 class_specifier:
@@ -2218,6 +2202,7 @@ type_specifier:
        | INT             { $$ = MkSpecifier(INT); }
    | UINT            { $$ = MkSpecifier(UINT); }
    | INT64           { $$ = MkSpecifier(INT64); }
+   | INT128          { $$ = MkSpecifier(INT128); }
    | VALIST          { $$ = MkSpecifier(VALIST); }
        | LONG            { $$ = MkSpecifier(LONG); }
        | FLOAT           { $$ = MkSpecifier(FLOAT); }
@@ -2230,10 +2215,14 @@ type_specifier:
        | type
    | TYPEOF '(' assignment_expression ')' { $$ = MkSpecifierTypeOf($3); }
    | SUBCLASS '(' type ')'                { $$ = MkSpecifierSubClass($3); }
-   | SUBCLASS '(' identifier ')'          { _DeclClass(0, $3.string); $$ = MkSpecifierSubClass(MkSpecifierName($3.string)); FreeIdentifier($3); }
+   | SUBCLASS '(' identifier ')'          { _DeclClass($3._class, $3.string); $$ = MkSpecifierSubClass(MkSpecifierName($3.string)); FreeIdentifier($3); }
    | THISCLASS       { $$ = MkSpecifier(THISCLASS); }
    | TYPED_OBJECT    { $$ = MkSpecifier(TYPED_OBJECT); }
    | ANY_OBJECT      { $$ = MkSpecifier(ANY_OBJECT); }
+   | _BOOL           { $$ = MkSpecifier(_BOOL); }
+   | BOOL            { $$ = MkSpecifier(BOOL); }
+   | _COMPLEX        { $$ = MkSpecifier(_COMPLEX); }
+   | _IMAGINARY      { $$ = MkSpecifier(_IMAGINARY); }
        ;
 
 strict_type_specifier:
@@ -2243,6 +2232,7 @@ strict_type_specifier:
        | INT             { $$ = MkSpecifier(INT); }
    | UINT            { $$ = MkSpecifier(UINT); }
    | INT64           { $$ = MkSpecifier(INT64); }
+   | INT128          { $$ = MkSpecifier(INT128); }
    | VALIST          { $$ = MkSpecifier(VALIST); }
        | LONG            { $$ = MkSpecifier(LONG); }
        | FLOAT           { $$ = MkSpecifier(FLOAT); }
@@ -2253,9 +2243,13 @@ strict_type_specifier:
        | struct_or_union_specifier_nocompound
        | enum_specifier_nocompound
        | strict_type
+   | _BOOL           { $$ = MkSpecifier(_BOOL); }
+   | BOOL            { $$ = MkSpecifier(BOOL); }
+   | _COMPLEX        { $$ = MkSpecifier(_COMPLEX); }
+   | _IMAGINARY      { $$ = MkSpecifier(_IMAGINARY); }
    | TYPEOF '(' assignment_expression ')' { $$ = MkSpecifierTypeOf($3); }
    | SUBCLASS '(' type ')'                { $$ = MkSpecifierSubClass($3); }
-   | SUBCLASS '(' identifier ')'          { _DeclClass(0, $3.string); $$ = MkSpecifierSubClass(MkSpecifierName($3.string)); FreeIdentifier($3); }
+   | SUBCLASS '(' identifier ')'          { _DeclClass($3._class, $3.string); $$ = MkSpecifierSubClass(MkSpecifierName($3.string)); FreeIdentifier($3); }
    | THISCLASS       { $$ = MkSpecifier(THISCLASS); }
        ;
 
@@ -2349,12 +2343,12 @@ struct_decl:
         $$ = $1;
         if(declMode)
         {
-           ($1.addNameSpace ? DeclClassAddNameSpace : DeclClass)(globalContext.nextID++, $1.id.string);
+           ($1.addNameSpace ? DeclClassAddNameSpace : DeclClass)($1.id._class, $1.id.string);
         }
      }
    | struct_entry '<' template_parameters_list '>'
    {
-      Symbol symbol = ($1.addNameSpace ? DeclClassAddNameSpace : DeclClass)(globalContext.nextID++, $1.id.string);
+      Symbol symbol = ($1.addNameSpace ? DeclClassAddNameSpace : DeclClass)($1.id._class, $1.id.string);
       $$ = $1;
       symbol.templateParams = $3;
    }
@@ -2518,22 +2512,12 @@ _inheritance_specifiers:
    | strict_type_specifier                                   { $$ = MkList(); ListAdd($$, $1); }
    | _inheritance_specifiers strict_type_specifier            { $$ = $1; ListAdd($1, $2); }
    | identifier
-      { _DeclClass(0, $1.string); $$ = MkListOne(MkSpecifierName($1.string)); FreeIdentifier($1); }
-       | _inheritance_specifiers identifier                { $$ = $1; _DeclClass(0, $2.string); ListAdd($1, MkSpecifierName($2.string)); FreeIdentifier($2); }
+      { _DeclClass($1._class, $1.string); $$ = MkListOne(MkSpecifierName($1.string)); FreeIdentifier($1); }
+       | _inheritance_specifiers identifier                { $$ = $1; _DeclClass($2._class, $2.string); ListAdd($1, MkSpecifierName($2.string)); FreeIdentifier($2); }
 
    | identifier '<' template_arguments_list '>'
       {
-         // if($1._class && !$1._class.name)
-         if($1._class)
-         {
-            char name[1024];
-            strcpy(name,  $1._class.name ? $1._class.name : "");
-            strcat(name, "::");
-            strcat(name, $1.string);
-            _DeclClass(0, name);
-         }
-         else
-            _DeclClass(0, $1.string);
+         _DeclClass($1._class, $1.string);
 
          $$ = MkList();
          ListAdd($$, MkSpecifierNameArgs($1.string, $3));
@@ -2542,15 +2526,7 @@ _inheritance_specifiers:
    | _inheritance_specifiers identifier '<' template_arguments_list '>'
       {
          $$ = $1;
-         if($2._class && !$2._class.name)
-         {
-            char name[1024];
-            strcpy(name, "::");
-            strcat(name, $2.string);
-            _DeclClass(0, name);
-         }
-         else
-            _DeclClass(0, $2.string);
+         _DeclClass($2._class, $2.string);
          ListAdd($1, MkSpecifierNameArgs($2.string, $4));
          FreeIdentifier($2);
       }
@@ -2572,17 +2548,7 @@ property_specifiers:
    | property_specifiers identifier          { $$ = $1; ListAdd($1, MkSpecifierName($2.string)); FreeIdentifier($2)}
    | identifier '<' template_arguments_list '>'
       {
-         // if($1._class && !$1._class.name)
-         if($1._class)
-         {
-            char name[1024];
-            strcpy(name,  $1._class.name ? $1._class.name : "");
-            strcat(name, "::");
-            strcat(name, $1.string);
-            _DeclClass(0, name);
-         }
-         else
-            _DeclClass(0, $1.string);
+         _DeclClass($1._class, $1.string);
 
          $$ = MkList();
          ListAdd($$, MkSpecifierNameArgs($1.string, $3));
@@ -2590,15 +2556,7 @@ property_specifiers:
       }
    | property_specifiers identifier '<' template_arguments_list '>'
       {
-         if($2._class && !$2._class.name)
-         {
-            char name[1024];
-            strcpy(name, "::");
-            strcat(name, $2.string);
-            _DeclClass(0, name);
-         }
-         else
-            _DeclClass(0, $2.string);
+         _DeclClass($2._class, $2.string);
          ListAdd($1, MkSpecifierNameArgs($2.string, $4));
          FreeIdentifier($2);
       }
@@ -2619,17 +2577,7 @@ renew_specifiers:
    | renew_specifiers identifier          { $$ = $1; ListAdd($1, MkSpecifierName($2.string)); FreeIdentifier($2)}
    | identifier '<' template_arguments_list '>'
       {
-         // if($1._class && !$1._class.name)
-         if($1._class)
-         {
-            char name[1024];
-            strcpy(name,  $1._class.name ? $1._class.name : "");
-            strcat(name, "::");
-            strcat(name, $1.string);
-            _DeclClass(0, name);
-         }
-         else
-            _DeclClass(0, $1.string);
+         _DeclClass($1._class, $1.string);
 
          $$ = MkList();
          ListAdd($$, MkSpecifierNameArgs($1.string, $3));
@@ -2637,15 +2585,7 @@ renew_specifiers:
       }
    | renew_specifiers identifier '<' template_arguments_list '>'
       {
-         if($2._class && !$2._class.name)
-         {
-            char name[1024];
-            strcpy(name, "::");
-            strcat(name, $2.string);
-            _DeclClass(0, name);
-         }
-         else
-            _DeclClass(0, $2.string);
+         _DeclClass($2._class, $2.string);
          ListAdd($1, MkSpecifierNameArgs($2.string, $4));
          FreeIdentifier($2);
       }
@@ -2666,17 +2606,7 @@ new_specifiers:
    | new_specifiers identifier          { $$ = $1; ListAdd($1, MkSpecifierName($2.string)); FreeIdentifier($2)}
    | identifier '<' template_arguments_list '>'
       {
-         // if($1._class && !$1._class.name)
-         if($1._class)
-         {
-            char name[1024];
-            strcpy(name,  $1._class.name ? $1._class.name : "");
-            strcat(name, "::");
-            strcat(name, $1.string);
-            _DeclClass(0, name);
-         }
-         else
-            _DeclClass(0, $1.string);
+         _DeclClass($1._class, $1.string);
 
          $$ = MkList();
          ListAdd($$, MkSpecifierNameArgs($1.string, $3));
@@ -2684,15 +2614,7 @@ new_specifiers:
       }
    | new_specifiers identifier '<' template_arguments_list '>'
       {
-         if($2._class && !$2._class.name)
-         {
-            char name[1024];
-            strcpy(name, "::");
-            strcat(name, $2.string);
-            _DeclClass(0, name);
-         }
-         else
-            _DeclClass(0, $2.string);
+         _DeclClass($2._class, $2.string);
          ListAdd($1, MkSpecifierNameArgs($2.string, $4));
          FreeIdentifier($2);
       }
@@ -3101,6 +3023,7 @@ initializer:
        | '{' initializer_list '}'       { $$ = MkInitializerList($2); $$.loc = @$; }
        | '{' initializer_list ',' '}'
       {
+         Compiler_Warning($"extra comma\n");
          $$ = MkInitializerList($2);
          $$.loc = @$;
 
@@ -3117,7 +3040,7 @@ initializer:
 initializer_error:
      assignment_expression_error    { $$ = MkInitializerAssignment($1); $$.loc = @$; }
        | '{' initializer_list '}' error      { $$ = MkInitializerList($2); $$.loc = @$; }
-   | '{' initializer_list                 { $$ = MkInitializerList($2); $$.loc = @$; }
+   | '{' initializer_list                 { yyerror(); $$ = MkInitializerList($2); $$.loc = @$; }
        | '{' initializer_list ',' '}' error
       {
          $$ = MkInitializerList($2);
@@ -3133,6 +3056,7 @@ initializer_error:
       }
        | '{' initializer_list ','
       {
+         yyerror();
          $$ = MkInitializerList($2);
          $$.loc = @$;
 
@@ -3164,7 +3088,7 @@ initializer_list:
    | initializer_list ',' initializer_error  { $$ = $1; ListAdd($1, $3); }
 
    // Errors
-       | initializer_list initializer  { $$ = $1; ListAdd($1, $2); }
+       | initializer_list initializer  { yyerror(); $$ = $1; ListAdd($1, $2); }
    | initializer_list initializer_error  { $$ = $1; ListAdd($1, $2); }
        ;
 
@@ -3187,6 +3111,7 @@ init_declarator_list:
        | 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); }
+   | INT128 ',' init_declarator                 { $$ = MkList(); ListAdd($$, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__int128")), null)); ListAdd($$, $3); }
        | base_strict_type ',' init_declarator
    {
       char * colon = RSearchString($1.name, "::", strlen($1.name), true, false);
@@ -3320,8 +3245,9 @@ statement_error:
    ;
 
 asm_field:
-     string_literal { $$ = MkAsmField($1, null); $$.loc = @1; }
-   | string_literal '(' assignment_expression ')' { $$ = MkAsmField($1, $3); $$.loc = @$; }
+     string_literal { $$ = MkAsmField($1, null, null); $$.loc = @1; }
+   | string_literal '(' assignment_expression ')' { $$ = MkAsmField($1, $3, null); $$.loc = @$; }
+   | '[' identifier ']' string_literal '(' assignment_expression ')' { $$ = MkAsmField($4, $6, $2); $$.loc = @$; }
    ;
 
 asm_field_list:
@@ -3351,27 +3277,39 @@ asm_statement:
    ;
 
 labeled_statement:
-         identifier ':' statement                { $$ = MkLabeledStmt($1, $3); $$.loc = @$; }
-   | CASE constant_expression ':' statement  { $$ = MkCaseStmt($2, $4); $$.loc = @$; $2.loc.start = @1.end; }
-   | CASE constant_expression_error ':' statement  { $$ = MkCaseStmt($2, $4); $$.loc = @$; $2.loc.start = @1.end; }
-   | CASE ':' statement  { $$ = MkCaseStmt(MkExpDummy(), $3); $$.caseStmt.exp.loc = @2; $$.loc = @$; $$.caseStmt.exp.loc.start = @1.end; }
-       | DEFAULT ':' statement                   { $$ = MkCaseStmt(null, $3); $$.loc = @$; }
-       ;
-
-labeled_statement_error
-       : identifier ':' statement_error                { $$ = MkLabeledStmt($1, $3); $$.loc = @$; }
-   | CASE constant_expression ':' statement_error  { $$ = MkCaseStmt($2, $4); $$.loc = @$; $2.loc.start = @1.end; }
-   | CASE constant_expression_error ':' statement_error  { $$ = MkCaseStmt($2, $4); $$.loc = @$; $2.loc.start = @1.end; }
-   | CASE ':' statement_error  { $$ = MkCaseStmt(MkExpDummy(), $3); $$.caseStmt.exp.loc = @2; $$.loc = @$; $$.caseStmt.exp.loc.start = @1.end; }
+     identifier ':' statement                      { $$ = MkLabeledStmt($1, $3); $$.loc = @$; }
+   | CASE constant_expression ':' statement        { /*if($4.type == labeledStmt) Compiler_Warning(CASE_LABELED_STMT_WARNING);*/ $$ = MkCaseStmt($2, $4); $$.loc = @$; $2.loc.start = @1.end; }
+   | CASE constant_expression_error ':' statement  { /*if($4.type == labeledStmt) Compiler_Warning(CASE_LABELED_STMT_WARNING);*/ $$ = MkCaseStmt($2, $4); $$.loc = @$; $2.loc.start = @1.end; }
+   | CASE ':' statement                            { /*if($3.type == labeledStmt) Compiler_Warning(CASE_LABELED_STMT_WARNING);*/ $$ = MkCaseStmt(MkExpDummy(), $3); $$.caseStmt.exp.loc = @2; $$.loc = @$; $$.caseStmt.exp.loc.start = @1.end; }
+   | DEFAULT ':' statement                         { /*if($3.type == labeledStmt) Compiler_Warning(CASE_LABELED_STMT_WARNING);*/ $$ = MkCaseStmt(null, $3); $$.loc = @$; }
+
+   | identifier ':' declaration                      { Statement stmt = MkBadDeclStmt($3); stmt.loc = @3; Compiler_Warning(C89_DECL_WARNING); $$ = MkLabeledStmt($1, stmt); $$.loc = @$; }
+   | CASE constant_expression ':' declaration        { Statement stmt = MkBadDeclStmt($4); stmt.loc = @4; Compiler_Warning(C89_DECL_WARNING); $$ = MkCaseStmt($2, stmt); $$.loc = @$; $2.loc.start = @1.end; }
+   | CASE constant_expression_error ':' declaration  { Statement stmt = MkBadDeclStmt($4); stmt.loc = @4; Compiler_Warning(C89_DECL_WARNING); $$ = MkCaseStmt($2, stmt); $$.loc = @$; $2.loc.start = @1.end; }
+   | CASE ':' declaration                            { Statement stmt = MkBadDeclStmt($3); stmt.loc = @3; Compiler_Warning(C89_DECL_WARNING); $$ = MkCaseStmt(MkExpDummy(), stmt); $$.caseStmt.exp.loc = @2; $$.loc = @$; $$.caseStmt.exp.loc.start = @1.end; }
+   | DEFAULT ':' declaration                         { Statement stmt = MkBadDeclStmt($3); stmt.loc = @3; Compiler_Warning(C89_DECL_WARNING); $$ = MkCaseStmt(null, stmt); $$.loc = @$; }
+   ;
+
+labeled_statement_error:
+         identifier ':' statement_error                { $$ = MkLabeledStmt($1, $3); $$.loc = @$; }
+   | CASE constant_expression ':' statement_error  { /*if($4.type == labeledStmt) Compiler_Warning(CASE_LABELED_STMT_WARNING);*/ $$ = MkCaseStmt($2, $4); $$.loc = @$; $2.loc.start = @1.end; }
+   | CASE constant_expression_error ':' statement_error  { /*if($4.type == labeledStmt) Compiler_Warning(CASE_LABELED_STMT_WARNING);*/ $$ = MkCaseStmt($2, $4); $$.loc = @$; $2.loc.start = @1.end; }
+   | CASE ':' statement_error  { /*if($3.type == labeledStmt) Compiler_Warning(CASE_LABELED_STMT_WARNING);*/ $$ = MkCaseStmt(MkExpDummy(), $3); $$.caseStmt.exp.loc = @2; $$.loc = @$; $$.caseStmt.exp.loc.start = @1.end; }
    | CASE ':' { $$ = MkCaseStmt(MkExpDummy(), null); $$.caseStmt.exp.loc = @2; $$.loc = @$; $$.caseStmt.exp.loc.start = @1.end; }
-       | DEFAULT ':' statement_error                   { $$ = MkCaseStmt(null, $3); $$.loc = @$; }
+       | DEFAULT ':' statement_error                   { /*if($3.type == labeledStmt) Compiler_Warning(CASE_LABELED_STMT_WARNING);*/ $$ = MkCaseStmt(null, $3); $$.loc = @$; }
    | DEFAULT ':'  { $$ = MkCaseStmt(null, null); $$.loc = @$; }
+
+   | identifier ':' declaration_error                      { Statement stmt = MkBadDeclStmt($3); stmt.loc = @3; Compiler_Warning(C89_DECL_WARNING); $$ = MkLabeledStmt($1, stmt); $$.loc = @$; }
+   | CASE constant_expression ':' declaration_error        { Statement stmt = MkBadDeclStmt($4); stmt.loc = @4; Compiler_Warning(C89_DECL_WARNING); $$ = MkCaseStmt($2, stmt); $$.loc = @$; $2.loc.start = @1.end; }
+   | CASE constant_expression_error ':' declaration_error  { Statement stmt = MkBadDeclStmt($4); stmt.loc = @4; Compiler_Warning(C89_DECL_WARNING); $$ = MkCaseStmt($2, stmt); $$.loc = @$; $2.loc.start = @1.end; }
+   | CASE ':' declaration_error                            { Statement stmt = MkBadDeclStmt($3); stmt.loc = @3; Compiler_Warning(C89_DECL_WARNING); $$ = MkCaseStmt(MkExpDummy(), stmt); $$.caseStmt.exp.loc = @2; $$.loc = @$; $$.caseStmt.exp.loc.start = @1.end; }
+   | DEFAULT ':' declaration_error                         { Statement stmt = MkBadDeclStmt($3); stmt.loc = @3; Compiler_Warning(C89_DECL_WARNING); $$ = MkCaseStmt(null, stmt); $$.loc = @$; }
        ;
 
 declaration_mode:
-     PUBLIC    { $$ = declMode = publicAccess; }
-   | PRIVATE   { $$ = declMode = privateAccess; }
-   | DEFAULT   { $$ = declMode = defaultAccess; }
+     PUBLIC    { $$ = structDeclMode = declMode = publicAccess; }
+   | PRIVATE   { $$ = structDeclMode = declMode = privateAccess; }
+   | DEFAULT   { $$ = structDeclMode = declMode = defaultAccess; }
    ;
 
 member_access:
@@ -3380,10 +3318,10 @@ member_access:
    ;
 
 declaration:
-         declaration_specifiers ';'                       { $$ = MkDeclaration($1, null); $$.loc = @$; }
-       | declaration_specifiers init_declarator_list ';'  { $$ = MkDeclaration($1, $2); $$.loc = @$; }
-   | instantiation_named ';'                          { $$ = MkDeclarationInst($1); $$.loc = @$; }
-   | declaration_error ';'                            { $$ = $1; }
+         declaration_specifiers ';'                       { $$ = MkDeclaration($1, null); $$.loc = @$; structDeclMode = defaultDeclMode; }
+       | declaration_specifiers init_declarator_list ';'  { $$ = MkDeclaration($1, $2); $$.loc = @$; structDeclMode = defaultDeclMode; }
+   | instantiation_named ';'                          { $$ = MkDeclarationInst($1); $$.loc = @$; structDeclMode = defaultDeclMode; }
+   | declaration_error ';'                            { $$ = $1; structDeclMode = defaultDeclMode; }
        ;
 
 external_guess_declaration:
@@ -3393,7 +3331,7 @@ external_guess_declaration:
 
    | external_guess_instantiation_named ';'                          { $$ = MkDeclarationInst($1); $$.loc = @$; }
    | DEFINE identifier '=' conditional_expression ';' { $$ = MkDeclarationDefine($2, $4); $$.loc = @$; }
-   | STATIC DEFINE identifier '=' conditional_expression ';' { declMode = staticAccess; $$ = MkDeclarationDefine($3, $5); $$.loc = @$; }
+   | STATIC DEFINE identifier '=' conditional_expression ';' { structDeclMode = declMode = staticAccess; $$ = MkDeclarationDefine($3, $5); $$.loc = @$; }
        ;
 
 external_guess_declaration_error:
@@ -3401,12 +3339,12 @@ external_guess_declaration_error:
        ;
 
 declaration_error:
-     declaration_specifiers error                       { $$ = MkDeclaration($1, null); $$.loc = @$; }
-   | declaration_error error {}
+     declaration_specifiers error                       { $$ = MkDeclaration($1, null); $$.loc = @$; structDeclMode = defaultDeclMode; }
+   | declaration_error error                            { structDeclMode = defaultDeclMode;  }
 
-   | instantiation_named_error error                   { $$ = MkDeclarationInst($1); $$.loc = @$; }
-   | instantiation_named error                         { $$ = MkDeclarationInst($1); $$.loc = @$; }
-   | declaration_specifiers init_declarator_list_error  { $$ = MkDeclaration($1, $2); $$.loc = @$; }
+   | instantiation_named_error error                   { $$ = MkDeclarationInst($1); $$.loc = @$; structDeclMode = defaultDeclMode; }
+   | instantiation_named error                         { $$ = MkDeclarationInst($1); $$.loc = @$; structDeclMode = defaultDeclMode; }
+   | declaration_specifiers init_declarator_list_error  { $$ = MkDeclaration($1, $2); $$.loc = @$; structDeclMode = defaultDeclMode; }
    ;
 
 declaration_list:
@@ -3493,16 +3431,16 @@ selection_statement_error:
 iteration_statement:
          WHILE '(' expression ')' statement           { $$ = MkWhileStmt($3, $5); $$.loc = @$; }
    | WHILE '(' expression_error statement     { $$ = MkWhileStmt($3, $4); $$.loc = @$; }
-   | WHILE '(' ')' statement     { $$ = MkWhileStmt(null, $4); $$.loc = @$; }
+   | WHILE '(' ')' statement     { yyerror(); $$ = MkWhileStmt(null, $4); $$.loc = @$; }
 
        | DO statement WHILE '(' expression ')' ';'     { $$ = MkDoWhileStmt($2, $5); $$.loc = @$; }
    | DO statement WHILE '(' expression_error ';'     { $$ = MkDoWhileStmt($2, $5); $$.loc = @$; }
 
        | FOR '(' expression_statement expression_statement ')' statement                   { $$ = MkForStmt($3, $4, null, $6); $$.loc = @$; }
-   | FOR '(' expression_statement ')' statement                   { $$ = MkForStmt($3, null, null, $5); $$.loc = @$; }
+   | FOR '(' expression_statement ')' statement                   { yyerror(); $$ = MkForStmt($3, null, null, $5); $$.loc = @$; }
        | FOR '(' expression_statement expression_statement expression ')' statement        { $$ = MkForStmt($3, $4, $5, $7); $$.loc = @$; }
    | FOR '(' expression_statement expression_statement expression_error statement  { $$ = MkForStmt($3, $4, $5, $6 ); $$.loc = @$; }
-   | FOR '(' ')' statement  { $$ = MkForStmt(null, null, null, $4); $$.loc = @$; }
+   | FOR '(' ')' statement  { yyerror(); $$ = MkForStmt(null, null, null, $4); $$.loc = @$; }
 
    | FOR '(' identifier ':' expression ')' statement                   { $$ = MkForEachStmt($3, $5, null, $7); $$.loc = @$; }
    | FOR '(' identifier ':' expression ';' expression ')' statement    { $$ = MkForEachStmt($3, $5, $7, $9); $$.loc = @$; }
@@ -3521,13 +3459,13 @@ iteration_statement_error:
        FOR '(' expression_statement expression_statement expression ')' statement_error  { $$ = MkForStmt($3, $4, $5, $7); $$.loc = @$; } |
    FOR '(' expression_statement expression_statement expression_error statement_error  { $$ = MkForStmt($3, $4, $5, $6 ); $$.loc = @$; } |
 
-       DO statement WHILE '(' expression ')'     { $$ = MkDoWhileStmt($2, $5); $$.loc = @$; } |
-       DO statement WHILE '(' expression      { $$ = MkDoWhileStmt($2, $5); $$.loc = @$; } |
+       DO statement WHILE '(' expression ')'     { yyerror(); $$ = MkDoWhileStmt($2, $5); $$.loc = @$; } |
+       DO statement WHILE '(' expression      { yyerror(); $$ = MkDoWhileStmt($2, $5); $$.loc = @$; } |
    DO statement WHILE '(' expression_error      { $$ = MkDoWhileStmt($2, $5); $$.loc = @$; } |
        DO statement WHILE '(' { $$ = MkDoWhileStmt($2, null); $$.loc = @$; } |
-   DO statement WHILE { $$ = MkDoWhileStmt($2, null); $$.loc = @$; } |
-       DO statement { $$ = MkDoWhileStmt($2, null); $$.loc = @$; } |
-   DO { $$ = MkDoWhileStmt(null, null); $$.loc = @$; } |
+   DO statement WHILE { yyerror(); $$ = MkDoWhileStmt($2, null); $$.loc = @$; } |
+       DO statement { yyerror(); $$ = MkDoWhileStmt($2, null); $$.loc = @$; } |
+   DO { yyerror(); $$ = MkDoWhileStmt(null, null); $$.loc = @$; } |
 
 
    WHILE error           { $$ = MkWhileStmt(null, null); $$.loc = @$; } |
@@ -3597,15 +3535,15 @@ string_literal:
    ;
 
 external_declaration:
-         function_definition { $$ = MkExternalFunction($1); $$.loc = @$; $1.declMode = declMode; declMode = defaultDeclMode; }
+         function_definition { $$ = MkExternalFunction($1); $$.loc = @$; $1.declMode = declMode; structDeclMode = declMode = defaultDeclMode; }
    | class
-      { $$ = MkExternalClass($1);  $$.loc = @$; $1.declMode = (declMode != defaultAccess) ? declMode : privateAccess; declMode = defaultDeclMode; }
+      { $$ = MkExternalClass($1);  $$.loc = @$; $1.declMode = (declMode != defaultAccess) ? declMode : privateAccess; structDeclMode = declMode = defaultDeclMode; }
 
    | external_guess_declaration_specifiers class
-      { $$ = MkExternalClass($2);  $$.loc = @$; $2.declMode = (declMode != defaultAccess) ? declMode : privateAccess; declMode = defaultDeclMode; FreeList($1, FreeSpecifier); }
+      { $$ = MkExternalClass($2);  $$.loc = @$; $2.declMode = (declMode != defaultAccess) ? declMode : privateAccess; structDeclMode = declMode = defaultDeclMode; FreeList($1, FreeSpecifier); }
 
        | external_guess_declaration
-      { $$ = MkExternalDeclaration($1);  $$.loc = @$; $1.declMode = declMode; declMode = defaultDeclMode; }
+      { $$ = MkExternalDeclaration($1);  $$.loc = @$; $1.declMode = declMode; structDeclMode = 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
@@ -3620,19 +3558,19 @@ external_declaration:
 
    | ';' { $$ = null; }
 
-       | declaration_mode function_definition { $$ = MkExternalFunction($2); $$.loc = @$; $2.declMode = $1; declMode = defaultDeclMode; }
+       | declaration_mode function_definition { $$ = MkExternalFunction($2); $$.loc = @$; $2.declMode = $1; structDeclMode = declMode = defaultDeclMode; }
    | declaration_mode class
-      { $$ = MkExternalClass($2);  $$.loc = @$; $2.declMode = ($1 != defaultAccess) ? $1 : privateAccess; declMode = defaultDeclMode; }
-       | 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; }
+      { $$ = MkExternalClass($2);  $$.loc = @$; $2.declMode = ($1 != defaultAccess) ? $1 : privateAccess; structDeclMode = declMode = defaultDeclMode; }
+       | declaration_mode external_guess_declaration         { $$ = MkExternalDeclaration($2); $$.loc = @$; $2.declMode = $1; structDeclMode = declMode = defaultDeclMode; }
+   | declaration_mode IMPORT string_literal { $$ = MkExternalImport($3, normalImport, ($1 != defaultAccess) ? $1 : privateAccess);  $$.loc = @$; structDeclMode = declMode = defaultDeclMode; }
+   | declaration_mode IMPORT STATIC string_literal { $$ = MkExternalImport($4, staticImport, ($1 != defaultAccess) ? $1 : privateAccess);  $$.loc = @$; structDeclMode = 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;
+      structDeclMode = declMode = defaultDeclMode;
       if(!isRemote)
          yyerror();
    }
@@ -3640,28 +3578,29 @@ external_declaration:
    | STATIC ':' { defaultDeclMode = staticAccess; $$ = null; }
    | NAMESPACE identifier { $$ = MkExternalNameSpace($2); $$.loc = @$; }
    | NAMESPACE strict_type { $$ = MkExternalNameSpace(MkIdentifier($2.name)); FreeSpecifier($2); $$.loc = @$; }
-   | dbtable_definition { $$ = MkExternalDBTable($1); $$.loc = @$;  $1.declMode = (declMode != defaultAccess) ? declMode : privateAccess; declMode = defaultDeclMode; }
-   | declaration_mode  dbtable_definition { $$ = MkExternalDBTable($2); $$.loc = @$;  $2.declMode = ($1 != defaultAccess) ? declMode : privateAccess; declMode = defaultDeclMode; }
+   | dbtable_definition { $$ = MkExternalDBTable($1); $$.loc = @$;  $1.declMode = (declMode != defaultAccess) ? declMode : privateAccess; structDeclMode = declMode = defaultDeclMode; }
+   | declaration_mode  dbtable_definition { $$ = MkExternalDBTable($2); $$.loc = @$;  $2.declMode = ($1 != defaultAccess) ? declMode : privateAccess; structDeclMode = declMode = defaultDeclMode; }
    ;
 
 external_declaration_error:
-     class_error               { $$ = MkExternalClass($1);  $$.loc = $1.loc; $1.declMode = (declMode != defaultAccess) ? declMode : privateAccess; declMode = defaultDeclMode; }
+     class_error               { yyerror(); $$ = MkExternalClass($1);  $$.loc = $1.loc; $1.declMode = (declMode != defaultAccess) ? declMode : privateAccess; structDeclMode = declMode = defaultDeclMode; }
    | external_guess_declaration_specifiers class_error
    {
+      yyerror();
       FreeList($1, FreeSpecifier);
       $$ = MkExternalClass($2);
       $$.loc = $2.loc;
       $2.declMode = (declMode != defaultAccess) ? declMode : privateAccess;
-      declMode = defaultDeclMode;
+      structDeclMode = declMode = defaultDeclMode;
    }
-   | function_definition_error { $$ = MkExternalFunction($1); $$.loc = $1.loc;  $1.declMode = declMode; declMode = defaultDeclMode; }
+   | function_definition_error { yyerror(); $$ = MkExternalFunction($1); $$.loc = $1.loc;  $1.declMode = declMode; structDeclMode = declMode = defaultDeclMode; }
 
-   | declaration_mode class_error               { $$ = MkExternalClass($2);  $$.loc = $2.loc; $2.declMode = ($1 != defaultAccess) ? $1 : privateAccess; declMode = defaultDeclMode; }
-   | declaration_mode function_definition_error { $$ = MkExternalFunction($2); $$.loc = $2.loc; $2.declMode = $1; declMode = defaultDeclMode; }
+   | declaration_mode class_error               { yyerror(); $$ = MkExternalClass($2);  $$.loc = $2.loc; $2.declMode = ($1 != defaultAccess) ? $1 : privateAccess; structDeclMode = declMode = defaultDeclMode; }
+   | declaration_mode function_definition_error { yyerror(); $$ = MkExternalFunction($2); $$.loc = $2.loc; $2.declMode = $1; structDeclMode = declMode = defaultDeclMode; }
 
        | external_guess_declaration_error
-      { $$ = MkExternalDeclaration($1);  $$.loc = @$; $1.declMode = declMode; declMode = defaultDeclMode; }
-   | declaration_mode external_guess_declaration_error         { $$ = MkExternalDeclaration($2); $$.loc = @$; $2.declMode = $1; declMode = defaultDeclMode; }
+      { yyerror(); $$ = MkExternalDeclaration($1);  $$.loc = @$; $1.declMode = declMode; structDeclMode = declMode = defaultDeclMode; }
+   | declaration_mode external_guess_declaration_error         { yyerror(); $$ = MkExternalDeclaration($2); $$.loc = @$; $2.declMode = $1; structDeclMode = declMode = defaultDeclMode; }
    ;
 
 translation_unit_error:
@@ -3676,9 +3615,9 @@ translation_unit:
          external_declaration                    { $$ = MkList(); ListAdd($$, $1); ast = $$; }
        | translation_unit external_declaration   { $$ = $1; ListAdd($1, $2); }
    | translation_unit_error class
-      { External _class = MkExternalClass($2); $$ = $1; 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; structDeclMode = declMode = defaultDeclMode; }
    | translation_unit_error declaration_mode class
-      { External _class = MkExternalClass($3); $$ = $1; 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; structDeclMode = declMode = defaultDeclMode; }
        ;
 
 thefile:
@@ -3688,8 +3627,8 @@ thefile:
    ;
 
 dbtable_definition:
-     DBTABLE string_literal identifier   '{' dbfield_definition_list '}' { Symbol symbol = DeclClassAddNameSpace(globalContext.nextID++, $3.string); FreeIdentifier($3); $$ = MkDBTableDef($2, symbol, $5); }
-   | DBTABLE string_literal strict_type  '{' dbfield_definition_list '}' { Symbol symbol = DeclClass(globalContext.nextID++, $3.name); FreeSpecifier($3); $$ = MkDBTableDef($2, symbol, $5); }
+     DBTABLE string_literal identifier   '{' dbfield_definition_list '}' { Symbol symbol = DeclClassAddNameSpace($3._class, $3.string); FreeIdentifier($3); $$ = MkDBTableDef($2, symbol, $5); }
+   | DBTABLE string_literal strict_type  '{' dbfield_definition_list '}' { Symbol symbol = DeclClass($3.nsSpec, $3.name); FreeSpecifier($3); $$ = MkDBTableDef($2, symbol, $5); }
    | DBTABLE string_literal '{' dbfield_definition_list '}' { $$ = MkDBTableDef($2, null, $4); }
    ;