Add support for parsing interface blocks to the shader translator.

TRAC #22930

Signed-off-by: Nicolas Capens
Signed-off-by: Geoff Lang
Author: Jamie Madill

git-svn-id: https://angleproject.googlecode.com/svn/branches/es3proto@2341 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/compiler/BaseTypes.h b/src/compiler/BaseTypes.h
index 0a8553b..f7910e7 100644
--- a/src/compiler/BaseTypes.h
+++ b/src/compiler/BaseTypes.h
@@ -46,6 +46,7 @@
     EbtSampler2DRect,       // Only valid if GL_ARB_texture_rectangle exists.
     EbtGuardSamplerEnd,    // non type:  see implementation of IsSampler()
     EbtStruct,
+    EbtInterfaceBlock,
     EbtAddress,            // should be deprecated??
     EbtInvariant          // used as a type when qualifying a previously declared variable as being invariant
 };
@@ -63,6 +64,7 @@
     case EbtSamplerExternalOES: return "samplerExternalOES"; break;
     case EbtSampler2DRect:     return "sampler2DRect";     break;
     case EbtStruct:            return "structure";         break;
+    case EbtInterfaceBlock:    return "interface block";   break;
     default:                   return "unknown type";
     }
 }
diff --git a/src/compiler/ParseHelper.cpp b/src/compiler/ParseHelper.cpp
index e002cdf..6ae90c4 100644
--- a/src/compiler/ParseHelper.cpp
+++ b/src/compiler/ParseHelper.cpp
@@ -656,7 +656,7 @@
     if (IsSampler(type.getBasicType()))
         return true;
 
-    if (type.getBasicType() == EbtStruct) {
+    if (type.getBasicType() == EbtStruct || type.getBasicType() == EbtInterfaceBlock) {
         TTypeList& structure = *type.getStruct();
         for (unsigned int i = 0; i < structure.size(); ++i) {
             if (containsSampler(*structure[i].type))
@@ -1451,6 +1451,102 @@
     return typedNode;
 }
 
+//
+// Interface/uniform blocks
+//
+TIntermAggregate* TParseContext::addInterfaceBlock(const TPublicType& typeQualifier, TSourceLoc nameLine, const TString& blockName, TTypeList* typeList, 
+                                                   const TString& instanceName, TSourceLoc instanceLine, TIntermTyped* arrayIndex, TSourceLoc arrayIndexLine)
+{
+    if (reservedErrorCheck(nameLine, blockName))
+        recover();
+
+    if (typeQualifier.qualifier != EvqUniform)
+    {
+        error(typeQualifier.line, "invalid qualifier:", getQualifierString(typeQualifier.qualifier), "interface blocks must be uniform");
+        recover();
+    }
+
+    TSymbol* blockNameSymbol = new TInterfaceBlockName(&blockName);
+    if (!symbolTable.declare(*blockNameSymbol)) {
+        error(nameLine, "redefinition", blockName.c_str(), "interface block name");
+        recover();
+    }
+
+    // check for sampler types
+    for (size_t memberIndex = 0; memberIndex < typeList->size(); ++memberIndex) {
+        const TTypeLine& memberTypeLine = (*typeList)[memberIndex];
+        TType* memberType = memberTypeLine.type;
+        if (IsSampler(memberType->getBasicType())) {
+            error(memberTypeLine.line, "unsupported type", memberType->getBasicString(), "sampler types are not allowed in interface blocks");
+            recover();
+        }
+
+        const TQualifier qualifier = memberTypeLine.type->getQualifier();
+        switch (qualifier)
+        {
+          case EvqGlobal:
+          case EvqUniform:
+            break;
+          default:
+            error(memberTypeLine.line, "invalid qualifier on interface block member", getQualifierString(qualifier));
+            recover();
+            break;
+        }
+    }
+
+    TType* interfaceBlock = new TType(typeList, blockName);
+    interfaceBlock->setBasicType(EbtInterfaceBlock);
+    interfaceBlock->setQualifier(typeQualifier.qualifier);
+
+    TString symbolName = "";
+    int symbolId = 0;
+
+    if (instanceName == "")
+    {
+        // define symbols for the members of the interface block
+        for (size_t memberIndex = 0; memberIndex < typeList->size(); ++memberIndex) {
+            const TTypeLine& memberTypeLine = (*typeList)[memberIndex];
+            TType* memberType = memberTypeLine.type;
+            memberType->setInterfaceBlockType(interfaceBlock);
+            TVariable* memberVariable = new TVariable(&memberType->getFieldName(), *memberType);
+            memberVariable->setQualifier(typeQualifier.qualifier);
+            if (!symbolTable.declare(*memberVariable)) {
+                error(memberTypeLine.line, "redefinition", memberType->getFieldName().c_str(), "interface block member name");
+                recover();
+            }
+        }
+    }
+    else
+    {
+        interfaceBlock->setInstanceName(instanceName);
+
+        // add array index
+        if (arrayIndex != NULL)
+        {
+            int size;
+            if (arraySizeErrorCheck(arrayIndexLine, arrayIndex, size))
+                recover();
+            interfaceBlock->setArraySize(size);
+        }
+
+        // add a symbol for this interface block
+        TVariable* instanceTypeDef = new TVariable(&instanceName, *interfaceBlock, false);
+        instanceTypeDef->setQualifier(typeQualifier.qualifier);
+        if (!symbolTable.declare(*instanceTypeDef)) {
+            error(instanceLine, "redefinition", instanceName.c_str(), "interface block instance name");
+            recover();
+        }
+
+        symbolId = instanceTypeDef->getUniqueId();
+        symbolName = instanceTypeDef->getName();
+    }
+
+    exitStructDeclaration();
+    TIntermAggregate *aggregate = intermediate.makeAggregate(intermediate.addSymbol(symbolId, symbolName, *interfaceBlock, typeQualifier.line), nameLine);
+    aggregate->setOp(EOpDeclaration);
+    return aggregate;
+}
+
 bool TParseContext::enterStructDeclaration(int line, const TString& identifier)
 {
     ++structNestingLevel;
@@ -1768,9 +1864,53 @@
             }
         }
     }
+    else if (baseExpression->getBasicType() == EbtInterfaceBlock)
+    {
+        bool fieldFound = false;
+        const TTypeList* fields = baseExpression->getType().getStruct();
+        if (fields == 0)
+        {
+            error(dotLocation, "interface block has no fields", "Internal Error");
+            recover();
+            indexedExpression = baseExpression;
+        }
+        else
+        {
+            unsigned int i;
+            for (i = 0; i < fields->size(); ++i)
+            {
+                if ((*fields)[i].type->getFieldName() == fieldString)
+                {
+                    fieldFound = true;
+                    break;
+                }
+            }
+            if (fieldFound)
+            {
+                ConstantUnion *unionArray = new ConstantUnion[1];
+                unionArray->setIConst(i);
+                TIntermTyped* index = intermediate.addConstantUnion(unionArray, *(*fields)[i].type, fieldLocation);
+                indexedExpression = intermediate.addIndex(EOpIndexDirectInterfaceBlock, baseExpression, index, dotLocation);
+                indexedExpression->setType(*(*fields)[i].type);
+            }
+            else
+            {
+                error(dotLocation, " no such field in interface block", fieldString.c_str());
+                recover();
+                indexedExpression = baseExpression;
+            }
+        }
+    }
     else
     {
-        error(dotLocation, " field selection requires structure, vector, or matrix on left hand side", fieldString.c_str());
+        if (shaderVersion < 300)
+        {
+            error(dotLocation, " field selection requires structure, vector, or matrix on left hand side", fieldString.c_str());
+        }
+        else
+        {
+            error(dotLocation, " field selection requires structure, vector, matrix, or interface block on left hand side", fieldString.c_str());
+        }
         recover();
         indexedExpression = baseExpression;
     }
diff --git a/src/compiler/ParseHelper.h b/src/compiler/ParseHelper.h
index de34275..db748d4 100644
--- a/src/compiler/ParseHelper.h
+++ b/src/compiler/ParseHelper.h
@@ -134,6 +134,9 @@
     TTypeList *addStructDeclaratorList(const TPublicType& typeSpecifier, TTypeList *typeList);
     TPublicType addStructure(TSourceLoc structLine, TSourceLoc nameLine, const TString &structName, TTypeList* typeList);
 
+    TIntermAggregate* addInterfaceBlock(const TPublicType& typeQualifier, TSourceLoc nameLine, const TString& blockName, TTypeList* typeList, 
+                                        const TString& instanceName, TSourceLoc instanceLine, TIntermTyped* arrayIndex, TSourceLoc arrayIndexLine);
+
     // Performs an error check for embedded struct declarations.
     // Returns true if an error was raised due to the declaration of
     // this struct.
diff --git a/src/compiler/SymbolTable.cpp b/src/compiler/SymbolTable.cpp
index ebe2113..ae1d7f2 100644
--- a/src/compiler/SymbolTable.cpp
+++ b/src/compiler/SymbolTable.cpp
@@ -22,7 +22,7 @@
 
 TType::TType(const TPublicType &p) :
             type(p.type), precision(p.precision), qualifier(p.qualifier), size(p.size), matrix(p.matrix), array(p.array), arraySize(p.arraySize),
-            maxArraySize(0), arrayInformationType(0), structure(0), structureSize(0), deepestStructNesting(0), fieldName(0), mangled(0), typeName(0)
+            maxArraySize(0), arrayInformationType(0), interfaceBlockType(0), structure(0), structureSize(0), deepestStructNesting(0), fieldName(0), mangled(0), typeName(0)
 {
     if (p.userDef) {
         structure = p.userDef->getStruct();
@@ -57,6 +57,21 @@
                 (*structure)[i].type->buildMangledName(mangledName);
             }
         }
+        break;
+    case EbtInterfaceBlock:
+        {
+            mangledName += "interface-block-";
+            if (typeName)
+            {
+                mangledName += *typeName;
+            }
+            for (unsigned int i = 0; i < structure->size(); ++i)
+            {
+                mangledName += '-';
+                (*structure)[i].type->buildMangledName(mangledName);
+            }
+        }
+        break;
     default:
         break;
     }
@@ -136,6 +151,11 @@
     infoSink.debug << getName().c_str() << ": " <<  returnType.getBasicString() << " " << getMangledName().c_str() << "\n";
 }
 
+void TInterfaceBlockName::dump(TInfoSink &infoSink) const
+{
+    infoSink.debug << "interface block " << getName().c_str() << "\n";
+}
+
 void TSymbolTableLevel::dump(TInfoSink &infoSink) const
 {
     tLevel::const_iterator it;
@@ -255,6 +275,11 @@
     return function;
 }
 
+TInterfaceBlockName* TInterfaceBlockName::clone(TStructureMap& remapper)
+{
+    return new TInterfaceBlockName(this->name);
+}
+
 TSymbolTableLevel* TSymbolTableLevel::clone(TStructureMap& remapper)
 {
     TSymbolTableLevel *symTableLevel = new TSymbolTableLevel();
diff --git a/src/compiler/SymbolTable.h b/src/compiler/SymbolTable.h
index 2f91053..1d526cf 100644
--- a/src/compiler/SymbolTable.h
+++ b/src/compiler/SymbolTable.h
@@ -186,6 +186,21 @@
     bool defined;
 };
 
+//
+// Interface block name sub-symbol
+//
+class TInterfaceBlockName : public TSymbol
+{
+public:
+    TInterfaceBlockName(const TString *name)
+        : TSymbol(name)
+    {}
+
+    virtual ~TInterfaceBlockName() {}
+
+    virtual void dump(TInfoSink &infoSink) const;
+    virtual TInterfaceBlockName* clone(TStructureMap& remapper);
+};
 
 class TSymbolTableLevel {
 public:
diff --git a/src/compiler/Types.h b/src/compiler/Types.h
index 5bf211c..7124cd6 100644
--- a/src/compiler/Types.h
+++ b/src/compiler/Types.h
@@ -42,13 +42,13 @@
     TType() {}
     TType(TBasicType t, TPrecision p, TQualifier q = EvqTemporary, int s = 1, bool m = false, bool a = false) :
             type(t), precision(p), qualifier(q), size(s), matrix(m), array(a), arraySize(0),
-            maxArraySize(0), arrayInformationType(0), structure(0), structureSize(0), deepestStructNesting(0), fieldName(0), mangled(0), typeName(0)
+            maxArraySize(0), arrayInformationType(0), interfaceBlockType(0), structure(0), structureSize(0), deepestStructNesting(0), fieldName(0), mangled(0), typeName(0), instanceName(0)
     {
     }
     explicit TType(const TPublicType &p);
     TType(TTypeList* userDef, const TString& n, TPrecision p = EbpUndefined) :
             type(EbtStruct), precision(p), qualifier(EvqTemporary), size(1), matrix(false), array(false), arraySize(0),
-            maxArraySize(0), arrayInformationType(0), structure(userDef), structureSize(0), deepestStructNesting(0), fieldName(0), mangled(0)
+            maxArraySize(0), arrayInformationType(0), interfaceBlockType(0), structure(userDef), structureSize(0), deepestStructNesting(0), fieldName(0), mangled(0), instanceName(0)
     {
         typeName = NewPoolTString(n.c_str());
     }
@@ -91,11 +91,16 @@
         if (copyOf.mangled)
             mangled = NewPoolTString(copyOf.mangled->c_str());
 
+        instanceName = 0;
+        if (copyOf.instanceName)
+            instanceName = NewPoolTString(copyOf.instanceName->c_str());
+
         structureSize = copyOf.structureSize;
         maxArraySize = copyOf.maxArraySize;
         deepestStructNesting = copyOf.deepestStructNesting;
         assert(copyOf.arrayInformationType == 0);
         arrayInformationType = 0; // arrayInformationType should not be set for builtIn symbol table level
+        interfaceBlockType = 0;
     }
 
     TType* clone(TStructureMap& remapper)
@@ -184,6 +189,9 @@
     void clearArrayness() { array = false; arraySize = 0; maxArraySize = 0; }
     void setArrayInformationType(TType* t) { arrayInformationType = t; }
     TType* getArrayInformationType() const { return arrayInformationType; }
+    void setInterfaceBlockType(TType* t) { interfaceBlockType = t; }
+    TType* getInterfaceBlockType() const { return interfaceBlockType; }
+    bool isInterfaceBlockMember() const { return interfaceBlockType != NULL; }
 
     bool isVector() const { return size > 1 && !matrix; }
     bool isScalar() const { return size == 1 && !matrix && !structure; }
@@ -222,6 +230,25 @@
         return *mangled;
     }
 
+    void setInstanceName(const TString& n)
+    {
+        assert(type == EbtInterfaceBlock);
+        instanceName = NewPoolTString(n.c_str());
+    }
+
+    bool hasInstanceName() const
+    {
+        assert(type == EbtInterfaceBlock);
+        return instanceName != NULL;
+    }
+
+    const TString& getInstanceName() const
+    {
+        assert(type == EbtInterfaceBlock);
+        assert(instanceName);
+        return *instanceName;
+    }
+
     bool sameElementType(const TType& right) const {
         return      type == right.type   &&
                     size == right.size   &&
@@ -285,6 +312,7 @@
     int arraySize;
     int maxArraySize;
     TType* arrayInformationType;
+    TType* interfaceBlockType;
 
     TTypeList* structure;      // 0 unless this is a struct
     mutable int structureSize;
@@ -293,6 +321,7 @@
     TString *fieldName;         // for structure field names
     TString *mangled;
     TString *typeName;          // for structure field type name
+    TString *instanceName;      // for interface block instance names
 };
 
 //
diff --git a/src/compiler/glslang.y b/src/compiler/glslang.y
index ca3a214..7c9352c 100644
--- a/src/compiler/glslang.y
+++ b/src/compiler/glslang.y
@@ -42,8 +42,8 @@
 #define YYLTYPE_IS_TRIVIAL 1
 
 #define YYLEX_PARAM context->scanner
-%}
 
+%}
 %expect 1 /* One shift reduce conflict because of if | else */
 %pure-parser
 %parse-param {TParseContext* context}
@@ -113,9 +113,9 @@
     }  \
 }
 
-#define ES3_ONLY(S, L) {  \
+#define ES3_ONLY(TOKEN, LINE, REASON) {  \
     if (context->shaderVersion != 300) {  \
-        context->error(L, " supported in GLSL ES 3.00 only ", S);  \
+        context->error(LINE, REASON " supported in GLSL ES 3.00 only ", TOKEN);  \
         context->recover();  \
     }  \
 }
@@ -177,6 +177,8 @@
 %type <interm> function_call_header_with_parameters function_call_header_no_parameters function_call_generic function_prototype
 %type <interm> function_call_or_method
 
+%type <lex> enter_struct
+
 %start translation_unit
 %%
 
@@ -799,6 +801,14 @@
     }
     ;
 
+enter_struct
+    : IDENTIFIER LEFT_BRACE {
+        if (context->enterStructDeclaration($1.line, *$1.string))
+            context->recover();
+        $$ = $1;
+    }
+    ;
+
 declaration
     : function_prototype SEMICOLON   {
         TFunction &function = *($1.function);
@@ -843,6 +853,18 @@
         }
         $$ = 0;
     }
+    | type_qualifier enter_struct struct_declaration_list RIGHT_BRACE SEMICOLON {
+        ES3_ONLY(getQualifierString($1.qualifier), $1.line, "interface blocks");
+        $$ = context->addInterfaceBlock($1, $2.line, *$2.string, $3, "", 0, NULL, 0);
+    }
+    | type_qualifier enter_struct struct_declaration_list RIGHT_BRACE IDENTIFIER SEMICOLON {
+        ES3_ONLY(getQualifierString($1.qualifier), $1.line, "interface blocks");
+        $$ = context->addInterfaceBlock($1, $2.line, *$2.string, $3, *$5.string, $5.line, NULL, 0);
+    }
+    | type_qualifier enter_struct struct_declaration_list RIGHT_BRACE IDENTIFIER LEFT_BRACKET constant_expression RIGHT_BRACKET SEMICOLON {
+        ES3_ONLY(getQualifierString($1.qualifier), $1.line, "interface blocks");
+        $$ = context->addInterfaceBlock($1, $2.line, *$2.string, $3, *$5.string, $5.line, $7, $6.line);
+    }
     ;
 
 function_prototype
@@ -1425,22 +1447,22 @@
         $$.line = $1.line;
     }
     | IN_QUAL {
-        ES3_ONLY("in", $1.line);
+        ES3_ONLY("in", $1.line, "storage qualifier");
         $$.qualifier = (context->shaderType == SH_FRAGMENT_SHADER) ? EvqSmoothIn : EvqAttribute;
         $$.line = $1.line;
     }
     | OUT_QUAL {
-        ES3_ONLY("out", $1.line);
+        ES3_ONLY("out", $1.line, "storage qualifier");
         $$.qualifier = (context->shaderType == SH_FRAGMENT_SHADER) ? EvqFragColor : EvqSmoothOut;
         $$.line = $1.line;
     }
     | CENTROID IN_QUAL {
-        ES3_ONLY("centroid in", $1.line);
+        ES3_ONLY("centroid in", $1.line, "storage qualifier");
         $$.qualifier = (context->shaderType == SH_FRAGMENT_SHADER) ? EvqCentroidIn : EvqAttribute;
         $$.line = $1.line;
     }
     | CENTROID OUT_QUAL {
-        ES3_ONLY("centroid out", $1.line);
+        ES3_ONLY("centroid out", $1.line, "storage qualifier");
         $$.qualifier = (context->shaderType == SH_FRAGMENT_SHADER) ? EvqFragColor : EvqCentroidOut;
         $$.line = $1.line;
     }
@@ -1660,6 +1682,11 @@
     : type_specifier struct_declarator_list SEMICOLON {
         $$ = context->addStructDeclaratorList($1, $2);
     }
+    | type_qualifier type_specifier struct_declarator_list SEMICOLON {
+        // ES3 Only, but errors should be handled elsewhere
+        $2.qualifier = $1.qualifier;
+        $$ = context->addStructDeclaratorList($2, $3);
+    }
     ;
 
 struct_declarator_list
diff --git a/src/compiler/glslang_tab.cpp b/src/compiler/glslang_tab.cpp
index 4fff0b3..b97405f 100644
--- a/src/compiler/glslang_tab.cpp
+++ b/src/compiler/glslang_tab.cpp
@@ -95,6 +95,7 @@
 
 
 
+
 # ifndef YY_NULL
 #  if defined __cplusplus && 201103L <= __cplusplus
 #   define YY_NULL nullptr
@@ -330,9 +331,9 @@
     }  \
 }
 
-#define ES3_ONLY(S, L) {  \
+#define ES3_ONLY(TOKEN, LINE, REASON) {  \
     if (context->shaderVersion != 300) {  \
-        context->error(L, " supported in GLSL ES 3.00 only ", S);  \
+        context->error(LINE, REASON " supported in GLSL ES 3.00 only ", TOKEN);  \
         context->recover();  \
     }  \
 }
@@ -555,18 +556,18 @@
 #endif /* !YYCOPY_NEEDED */
 
 /* YYFINAL -- State number of the termination state.  */
-#define YYFINAL  81
+#define YYFINAL  83
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   1551
+#define YYLAST   1721
 
 /* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  105
 /* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  86
+#define YYNNTS  87
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  211
+#define YYNRULES  216
 /* YYNRULES -- Number of states.  */
-#define YYNSTATES  315
+#define YYNSTATES  332
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
@@ -628,33 +629,33 @@
      106,   110,   112,   114,   118,   122,   126,   130,   132,   136,
      140,   142,   144,   146,   148,   152,   154,   158,   160,   164,
      166,   172,   174,   178,   180,   182,   184,   186,   188,   190,
-     194,   196,   199,   202,   207,   210,   212,   214,   217,   221,
-     225,   228,   234,   238,   241,   245,   248,   249,   251,   253,
-     255,   257,   259,   263,   269,   276,   282,   284,   287,   292,
-     298,   303,   306,   308,   311,   313,   315,   317,   319,   321,
-     324,   326,   329,   331,   333,   335,   337,   340,   343,   345,
-     347,   350,   352,   354,   356,   358,   363,   365,   367,   369,
-     371,   373,   375,   377,   379,   381,   383,   385,   387,   389,
-     391,   393,   395,   397,   399,   401,   403,   405,   407,   408,
-     415,   416,   422,   424,   427,   431,   433,   437,   439,   444,
-     446,   448,   450,   452,   454,   456,   458,   460,   462,   465,
-     466,   467,   473,   475,   477,   478,   481,   482,   485,   488,
-     492,   494,   497,   499,   502,   508,   512,   514,   516,   521,
-     522,   529,   530,   539,   540,   548,   550,   552,   554,   555,
-     558,   562,   565,   568,   571,   575,   578,   580,   583,   585,
-     587,   588
+     194,   196,   199,   202,   205,   210,   216,   223,   233,   236,
+     238,   240,   243,   247,   251,   254,   260,   264,   267,   271,
+     274,   275,   277,   279,   281,   283,   285,   289,   295,   302,
+     308,   310,   313,   318,   324,   329,   332,   334,   337,   339,
+     341,   343,   345,   347,   350,   352,   355,   357,   359,   361,
+     363,   366,   369,   371,   373,   376,   378,   380,   382,   384,
+     389,   391,   393,   395,   397,   399,   401,   403,   405,   407,
+     409,   411,   413,   415,   417,   419,   421,   423,   425,   427,
+     429,   431,   433,   434,   441,   442,   448,   450,   453,   457,
+     462,   464,   468,   470,   475,   477,   479,   481,   483,   485,
+     487,   489,   491,   493,   496,   497,   498,   504,   506,   508,
+     509,   512,   513,   516,   519,   523,   525,   528,   530,   533,
+     539,   543,   545,   547,   552,   553,   560,   561,   570,   571,
+     579,   581,   583,   585,   586,   589,   593,   596,   599,   602,
+     606,   609,   611,   614,   616,   618,   619
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
 static const yytype_int16 yyrhs[] =
 {
-     187,     0,    -1,    54,    -1,   106,    -1,    57,    -1,    56,
+     188,     0,    -1,    54,    -1,   106,    -1,    57,    -1,    56,
       -1,    58,    -1,    81,   133,    82,    -1,   107,    -1,   108,
       83,   109,    84,    -1,   110,    -1,   108,    87,    59,    -1,
      108,    62,    -1,   108,    63,    -1,   133,    -1,   111,    -1,
      112,    -1,   108,    87,   112,    -1,   114,    82,    -1,   113,
       82,    -1,   115,    45,    -1,   115,    -1,   115,   131,    -1,
-     114,    88,   131,    -1,   116,    81,    -1,   154,    -1,    54,
+     114,    88,   131,    -1,   116,    81,    -1,   155,    -1,    54,
       -1,    59,    -1,   108,    -1,    62,   117,    -1,    63,   117,
       -1,   118,   117,    -1,    95,    -1,    93,    -1,    92,    -1,
      117,    -1,   119,    96,   117,    -1,   119,    97,   117,    -1,
@@ -667,74 +668,77 @@
      129,    69,   128,    -1,   129,    -1,   129,   104,   133,    89,
      131,    -1,   130,    -1,   117,   132,   131,    -1,    90,    -1,
       71,    -1,    72,    -1,    73,    -1,    80,    -1,   131,    -1,
-     133,    88,   131,    -1,   130,    -1,   136,    91,    -1,   144,
-      91,    -1,     7,   152,   153,    91,    -1,   137,    82,    -1,
-     139,    -1,   138,    -1,   139,   141,    -1,   138,    88,   141,
-      -1,   146,    54,    81,    -1,   151,    54,    -1,   151,    54,
-      83,   134,    84,    -1,   148,   142,   140,    -1,   142,   140,
-      -1,   148,   142,   143,    -1,   142,   143,    -1,    -1,    36,
-      -1,    37,    -1,    38,    -1,   151,    -1,   145,    -1,   144,
-      88,    54,    -1,   144,    88,    54,    83,    84,    -1,   144,
-      88,    54,    83,   134,    84,    -1,   144,    88,    54,    90,
-     162,    -1,   146,    -1,   146,    54,    -1,   146,    54,    83,
-      84,    -1,   146,    54,    83,   134,    84,    -1,   146,    54,
-      90,   162,    -1,     3,    54,    -1,   151,    -1,   149,   151,
-      -1,    43,    -1,    42,    -1,     9,    -1,     8,    -1,    40,
-      -1,     3,    40,    -1,   150,    -1,   147,   150,    -1,   147,
-      -1,     9,    -1,    36,    -1,    37,    -1,    41,    36,    -1,
-      41,    37,    -1,    39,    -1,   153,    -1,   152,   153,    -1,
-       4,    -1,     5,    -1,     6,    -1,   154,    -1,   154,    83,
-     134,    84,    -1,    45,    -1,    11,    -1,    12,    -1,    10,
-      -1,    30,    -1,    31,    -1,    32,    -1,    24,    -1,    25,
-      -1,    26,    -1,    27,    -1,    28,    -1,    29,    -1,    33,
-      -1,    34,    -1,    35,    -1,    47,    -1,    48,    -1,    49,
-      -1,    50,    -1,   155,    -1,    55,    -1,    -1,    44,    54,
-      85,   156,   158,    86,    -1,    -1,    44,    85,   157,   158,
-      86,    -1,   159,    -1,   158,   159,    -1,   151,   160,    91,
-      -1,   161,    -1,   160,    88,   161,    -1,    54,    -1,    54,
-      83,   134,    84,    -1,   131,    -1,   135,    -1,   166,    -1,
-     165,    -1,   163,    -1,   175,    -1,   176,    -1,   179,    -1,
-     186,    -1,    85,    86,    -1,    -1,    -1,    85,   167,   174,
-     168,    86,    -1,   173,    -1,   165,    -1,    -1,   171,   173,
-      -1,    -1,   172,   165,    -1,    85,    86,    -1,    85,   174,
-      86,    -1,   164,    -1,   174,   164,    -1,    91,    -1,   133,
-      91,    -1,    18,    81,   133,    82,   177,    -1,   170,    16,
-     170,    -1,   170,    -1,   133,    -1,   146,    54,    90,   162,
-      -1,    -1,    46,    81,   180,   178,    82,   169,    -1,    -1,
-      15,   181,   170,    46,    81,   133,    82,    91,    -1,    -1,
-      17,    81,   182,   183,   185,    82,   169,    -1,   175,    -1,
-     163,    -1,   178,    -1,    -1,   184,    91,    -1,   184,    91,
-     133,    -1,    14,    91,    -1,    13,    91,    -1,    20,    91,
-      -1,    20,   133,    91,    -1,    19,    91,    -1,   188,    -1,
-     187,   188,    -1,   189,    -1,   135,    -1,    -1,   136,   190,
-     173,    -1
+     133,    88,   131,    -1,   130,    -1,    54,    85,    -1,   137,
+      91,    -1,   145,    91,    -1,     7,   153,   154,    91,    -1,
+     150,   135,   159,    86,    91,    -1,   150,   135,   159,    86,
+      54,    91,    -1,   150,   135,   159,    86,    54,    83,   134,
+      84,    91,    -1,   138,    82,    -1,   140,    -1,   139,    -1,
+     140,   142,    -1,   139,    88,   142,    -1,   147,    54,    81,
+      -1,   152,    54,    -1,   152,    54,    83,   134,    84,    -1,
+     149,   143,   141,    -1,   143,   141,    -1,   149,   143,   144,
+      -1,   143,   144,    -1,    -1,    36,    -1,    37,    -1,    38,
+      -1,   152,    -1,   146,    -1,   145,    88,    54,    -1,   145,
+      88,    54,    83,    84,    -1,   145,    88,    54,    83,   134,
+      84,    -1,   145,    88,    54,    90,   163,    -1,   147,    -1,
+     147,    54,    -1,   147,    54,    83,    84,    -1,   147,    54,
+      83,   134,    84,    -1,   147,    54,    90,   163,    -1,     3,
+      54,    -1,   152,    -1,   150,   152,    -1,    43,    -1,    42,
+      -1,     9,    -1,     8,    -1,    40,    -1,     3,    40,    -1,
+     151,    -1,   148,   151,    -1,   148,    -1,     9,    -1,    36,
+      -1,    37,    -1,    41,    36,    -1,    41,    37,    -1,    39,
+      -1,   154,    -1,   153,   154,    -1,     4,    -1,     5,    -1,
+       6,    -1,   155,    -1,   155,    83,   134,    84,    -1,    45,
+      -1,    11,    -1,    12,    -1,    10,    -1,    30,    -1,    31,
+      -1,    32,    -1,    24,    -1,    25,    -1,    26,    -1,    27,
+      -1,    28,    -1,    29,    -1,    33,    -1,    34,    -1,    35,
+      -1,    47,    -1,    48,    -1,    49,    -1,    50,    -1,   156,
+      -1,    55,    -1,    -1,    44,    54,    85,   157,   159,    86,
+      -1,    -1,    44,    85,   158,   159,    86,    -1,   160,    -1,
+     159,   160,    -1,   152,   161,    91,    -1,   150,   152,   161,
+      91,    -1,   162,    -1,   161,    88,   162,    -1,    54,    -1,
+      54,    83,   134,    84,    -1,   131,    -1,   136,    -1,   167,
+      -1,   166,    -1,   164,    -1,   176,    -1,   177,    -1,   180,
+      -1,   187,    -1,    85,    86,    -1,    -1,    -1,    85,   168,
+     175,   169,    86,    -1,   174,    -1,   166,    -1,    -1,   172,
+     174,    -1,    -1,   173,   166,    -1,    85,    86,    -1,    85,
+     175,    86,    -1,   165,    -1,   175,   165,    -1,    91,    -1,
+     133,    91,    -1,    18,    81,   133,    82,   178,    -1,   171,
+      16,   171,    -1,   171,    -1,   133,    -1,   147,    54,    90,
+     163,    -1,    -1,    46,    81,   181,   179,    82,   170,    -1,
+      -1,    15,   182,   171,    46,    81,   133,    82,    91,    -1,
+      -1,    17,    81,   183,   184,   186,    82,   170,    -1,   176,
+      -1,   164,    -1,   179,    -1,    -1,   185,    91,    -1,   185,
+      91,   133,    -1,    14,    91,    -1,    13,    91,    -1,    20,
+      91,    -1,    20,   133,    91,    -1,    19,    91,    -1,   189,
+      -1,   188,   189,    -1,   190,    -1,   136,    -1,    -1,   137,
+     191,   174,    -1
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
-       0,   184,   184,   219,   222,   235,   240,   245,   251,   254,
-     257,   260,   263,   273,   286,   294,   394,   397,   405,   409,
-     416,   420,   427,   433,   442,   450,   505,   512,   522,   525,
-     535,   545,   566,   567,   568,   573,   574,   583,   595,   596,
-     604,   615,   619,   620,   630,   640,   650,   663,   664,   674,
-     687,   691,   695,   699,   700,   713,   714,   727,   728,   741,
-     742,   759,   760,   773,   774,   775,   776,   777,   781,   784,
-     795,   803,   830,   835,   849,   887,   890,   897,   905,   926,
-     947,   958,   987,   992,  1002,  1007,  1017,  1020,  1023,  1026,
-    1032,  1039,  1042,  1064,  1082,  1106,  1129,  1133,  1151,  1159,
-    1191,  1211,  1300,  1309,  1332,  1336,  1343,  1349,  1356,  1365,
-    1374,  1377,  1413,  1423,  1427,  1432,  1437,  1442,  1447,  1456,
-    1466,  1473,  1476,  1479,  1485,  1488,  1503,  1507,  1511,  1515,
-    1524,  1529,  1534,  1539,  1544,  1549,  1554,  1559,  1564,  1569,
-    1575,  1581,  1587,  1592,  1597,  1606,  1615,  1620,  1633,  1633,
-    1636,  1636,  1642,  1645,  1660,  1666,  1670,  1676,  1684,  1700,
-    1704,  1708,  1709,  1715,  1716,  1717,  1718,  1719,  1723,  1724,
-    1724,  1724,  1734,  1735,  1739,  1739,  1740,  1740,  1745,  1748,
-    1758,  1761,  1767,  1768,  1772,  1780,  1784,  1794,  1799,  1816,
-    1816,  1821,  1821,  1828,  1828,  1836,  1839,  1845,  1848,  1854,
-    1858,  1865,  1872,  1879,  1886,  1897,  1906,  1910,  1917,  1920,
-    1926,  1926
+       0,   186,   186,   221,   224,   237,   242,   247,   253,   256,
+     259,   262,   265,   275,   288,   296,   396,   399,   407,   411,
+     418,   422,   429,   435,   444,   452,   507,   514,   524,   527,
+     537,   547,   568,   569,   570,   575,   576,   585,   597,   598,
+     606,   617,   621,   622,   632,   642,   652,   665,   666,   676,
+     689,   693,   697,   701,   702,   715,   716,   729,   730,   743,
+     744,   761,   762,   775,   776,   777,   778,   779,   783,   786,
+     797,   805,   813,   840,   845,   856,   860,   864,   871,   909,
+     912,   919,   927,   948,   969,   980,  1009,  1014,  1024,  1029,
+    1039,  1042,  1045,  1048,  1054,  1061,  1064,  1086,  1104,  1128,
+    1151,  1155,  1173,  1181,  1213,  1233,  1322,  1331,  1354,  1358,
+    1365,  1371,  1378,  1387,  1396,  1399,  1435,  1445,  1449,  1454,
+    1459,  1464,  1469,  1478,  1488,  1495,  1498,  1501,  1507,  1510,
+    1525,  1529,  1533,  1537,  1546,  1551,  1556,  1561,  1566,  1571,
+    1576,  1581,  1586,  1591,  1597,  1603,  1609,  1614,  1619,  1628,
+    1637,  1642,  1655,  1655,  1658,  1658,  1664,  1667,  1682,  1685,
+    1693,  1697,  1703,  1711,  1727,  1731,  1735,  1736,  1742,  1743,
+    1744,  1745,  1746,  1750,  1751,  1751,  1751,  1761,  1762,  1766,
+    1766,  1767,  1767,  1772,  1775,  1785,  1788,  1794,  1795,  1799,
+    1807,  1811,  1821,  1826,  1843,  1843,  1848,  1848,  1855,  1855,
+    1863,  1866,  1872,  1875,  1881,  1885,  1892,  1899,  1906,  1913,
+    1924,  1933,  1937,  1944,  1947,  1953,  1953
 };
 #endif
 
@@ -773,15 +777,16 @@
   "logical_and_expression", "logical_xor_expression",
   "logical_or_expression", "conditional_expression",
   "assignment_expression", "assignment_operator", "expression",
-  "constant_expression", "declaration", "function_prototype",
-  "function_declarator", "function_header_with_parameters",
-  "function_header", "parameter_declarator", "parameter_declaration",
-  "parameter_qualifier", "parameter_type_specifier",
-  "init_declarator_list", "single_declaration", "fully_specified_type",
-  "interpolation_qualifier", "parameter_type_qualifier", "type_qualifier",
-  "storage_qualifier", "type_specifier", "precision_qualifier",
-  "type_specifier_no_prec", "type_specifier_nonarray", "struct_specifier",
-  "$@1", "$@2", "struct_declaration_list", "struct_declaration",
+  "constant_expression", "enter_struct", "declaration",
+  "function_prototype", "function_declarator",
+  "function_header_with_parameters", "function_header",
+  "parameter_declarator", "parameter_declaration", "parameter_qualifier",
+  "parameter_type_specifier", "init_declarator_list", "single_declaration",
+  "fully_specified_type", "interpolation_qualifier",
+  "parameter_type_qualifier", "type_qualifier", "storage_qualifier",
+  "type_specifier", "precision_qualifier", "type_specifier_no_prec",
+  "type_specifier_nonarray", "struct_specifier", "$@1", "$@2",
+  "struct_declaration_list", "struct_declaration",
   "struct_declarator_list", "struct_declarator", "initializer",
   "declaration_statement", "statement", "simple_statement",
   "compound_statement", "$@3", "$@4", "statement_no_new_scope",
@@ -823,21 +828,21 @@
      120,   121,   122,   122,   122,   122,   122,   123,   123,   123,
      124,   125,   126,   127,   127,   128,   128,   129,   129,   130,
      130,   131,   131,   132,   132,   132,   132,   132,   133,   133,
-     134,   135,   135,   135,   136,   137,   137,   138,   138,   139,
-     140,   140,   141,   141,   141,   141,   142,   142,   142,   142,
-     143,   144,   144,   144,   144,   144,   145,   145,   145,   145,
-     145,   145,   146,   146,   147,   147,   148,   149,   149,   149,
-     149,   149,   149,   150,   150,   150,   150,   150,   150,   151,
-     151,   152,   152,   152,   153,   153,   154,   154,   154,   154,
-     154,   154,   154,   154,   154,   154,   154,   154,   154,   154,
-     154,   154,   154,   154,   154,   154,   154,   154,   156,   155,
-     157,   155,   158,   158,   159,   160,   160,   161,   161,   162,
-     163,   164,   164,   165,   165,   165,   165,   165,   166,   167,
-     168,   166,   169,   169,   171,   170,   172,   170,   173,   173,
-     174,   174,   175,   175,   176,   177,   177,   178,   178,   180,
-     179,   181,   179,   182,   179,   183,   183,   184,   184,   185,
-     185,   186,   186,   186,   186,   186,   187,   187,   188,   188,
-     190,   189
+     134,   135,   136,   136,   136,   136,   136,   136,   137,   138,
+     138,   139,   139,   140,   141,   141,   142,   142,   142,   142,
+     143,   143,   143,   143,   144,   145,   145,   145,   145,   145,
+     146,   146,   146,   146,   146,   146,   147,   147,   148,   148,
+     149,   150,   150,   150,   150,   150,   150,   151,   151,   151,
+     151,   151,   151,   152,   152,   153,   153,   153,   154,   154,
+     155,   155,   155,   155,   155,   155,   155,   155,   155,   155,
+     155,   155,   155,   155,   155,   155,   155,   155,   155,   155,
+     155,   155,   157,   156,   158,   156,   159,   159,   160,   160,
+     161,   161,   162,   162,   163,   164,   165,   165,   166,   166,
+     166,   166,   166,   167,   168,   169,   167,   170,   170,   172,
+     171,   173,   171,   174,   174,   175,   175,   176,   176,   177,
+     178,   178,   179,   179,   181,   180,   182,   180,   183,   180,
+     184,   184,   185,   185,   186,   186,   187,   187,   187,   187,
+     187,   188,   188,   189,   189,   191,   190
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
@@ -850,21 +855,21 @@
        3,     1,     1,     3,     3,     3,     3,     1,     3,     3,
        1,     1,     1,     1,     3,     1,     3,     1,     3,     1,
        5,     1,     3,     1,     1,     1,     1,     1,     1,     3,
-       1,     2,     2,     4,     2,     1,     1,     2,     3,     3,
-       2,     5,     3,     2,     3,     2,     0,     1,     1,     1,
-       1,     1,     3,     5,     6,     5,     1,     2,     4,     5,
-       4,     2,     1,     2,     1,     1,     1,     1,     1,     2,
-       1,     2,     1,     1,     1,     1,     2,     2,     1,     1,
-       2,     1,     1,     1,     1,     4,     1,     1,     1,     1,
+       1,     2,     2,     2,     4,     5,     6,     9,     2,     1,
+       1,     2,     3,     3,     2,     5,     3,     2,     3,     2,
+       0,     1,     1,     1,     1,     1,     3,     5,     6,     5,
+       1,     2,     4,     5,     4,     2,     1,     2,     1,     1,
+       1,     1,     1,     2,     1,     2,     1,     1,     1,     1,
+       2,     2,     1,     1,     2,     1,     1,     1,     1,     4,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     1,     1,     1,     0,     6,
-       0,     5,     1,     2,     3,     1,     3,     1,     4,     1,
-       1,     1,     1,     1,     1,     1,     1,     1,     2,     0,
-       0,     5,     1,     1,     0,     2,     0,     2,     2,     3,
-       1,     2,     1,     2,     5,     3,     1,     1,     4,     0,
-       6,     0,     8,     0,     7,     1,     1,     1,     0,     2,
-       3,     2,     2,     2,     3,     2,     1,     2,     1,     1,
-       0,     3
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     0,     6,     0,     5,     1,     2,     3,     4,
+       1,     3,     1,     4,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     2,     0,     0,     5,     1,     1,     0,
+       2,     0,     2,     2,     3,     1,     2,     1,     2,     5,
+       3,     1,     1,     4,     0,     6,     0,     8,     0,     7,
+       1,     1,     1,     0,     2,     3,     2,     2,     2,     3,
+       2,     1,     2,     1,     1,     0,     3
 };
 
 /* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM.
@@ -872,251 +877,272 @@
    means the default is an error.  */
 static const yytype_uint8 yydefact[] =
 {
-       0,     0,   121,   122,   123,     0,   107,   113,   129,   127,
-     128,   133,   134,   135,   136,   137,   138,   130,   131,   132,
-     139,   140,   141,   114,   115,   118,   108,     0,   105,   104,
-       0,   126,   142,   143,   144,   145,   147,   209,   210,     0,
-      76,    86,     0,    91,    96,   112,     0,   110,   102,     0,
-     119,   124,   146,     0,   206,   208,   109,   101,     0,   116,
-     117,     0,   150,    71,     0,    74,    86,   106,    87,    88,
-      89,    77,     0,    86,     0,    72,    97,   111,   103,   120,
-       0,     1,   207,     0,   148,     0,     0,   211,    78,    83,
-      85,    90,     0,    92,    79,     0,     0,     2,     5,     4,
-       6,    27,     0,     0,     0,    34,    33,    32,     3,     8,
-      28,    10,    15,    16,     0,     0,    21,     0,    35,     0,
-      38,    41,    42,    47,    50,    51,    52,    53,    55,    57,
-      59,    70,     0,    25,    73,     0,     0,     0,   152,     0,
-       0,   191,     0,     0,     0,     0,     0,   169,   178,   182,
-      35,    61,    68,     0,   160,     0,   124,   163,   180,   162,
-     161,     0,   164,   165,   166,   167,    80,    82,    84,     0,
-       0,    98,     0,   159,   100,    29,    30,     0,    12,    13,
-       0,     0,    19,    18,     0,    20,    22,    24,    31,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   125,     0,   157,     0,   155,   151,   153,
-     202,   201,   176,   193,     0,   205,   203,     0,   189,   168,
-       0,    64,    65,    66,    67,    63,     0,     0,   183,   179,
-     181,     0,    93,     0,    95,    99,     7,     0,    14,    26,
-      11,    17,    23,    36,    37,    40,    39,    45,    46,    43,
-      44,    48,    49,    54,    56,    58,     0,   149,     0,     0,
-     154,     0,     0,     0,     0,     0,   204,     0,   170,    62,
-      69,     0,    94,     9,     0,     0,   156,     0,   175,   177,
-     196,   195,   198,   176,     0,   187,     0,     0,     0,    81,
-      60,   158,     0,   197,     0,     0,   186,   184,     0,     0,
-     171,     0,   199,     0,   176,     0,   173,   190,   172,     0,
-     200,   194,   185,   188,   192
+       0,     0,   125,   126,   127,     0,   111,   117,   133,   131,
+     132,   137,   138,   139,   140,   141,   142,   134,   135,   136,
+     143,   144,   145,   118,   119,   122,   112,     0,   109,   108,
+       0,   130,   146,   147,   148,   149,   151,   214,   215,     0,
+      80,    90,     0,    95,   100,   116,     0,   114,   106,     0,
+     123,   128,   150,     0,   211,   213,   113,   105,     0,   120,
+     121,     0,   154,    72,     0,    78,    90,   110,    91,    92,
+      93,    81,     0,    90,     0,    73,   101,   115,     0,     0,
+     107,   124,     0,     1,   212,     0,   152,     0,     0,   216,
+      82,    87,    89,    94,     0,    96,    83,     0,     0,    71,
+       0,     0,     0,     0,   156,     2,     5,     4,     6,    27,
+       0,     0,     0,    34,    33,    32,     3,     8,    28,    10,
+      15,    16,     0,     0,    21,     0,    35,     0,    38,    41,
+      42,    47,    50,    51,    52,    53,    55,    57,    59,    70,
+       0,    25,    74,     0,     0,     0,     0,   196,     0,     0,
+       0,     0,     0,   174,   183,   187,    35,    61,    68,     0,
+     165,     0,   128,   168,   185,   167,   166,     0,   169,   170,
+     171,   172,    84,    86,    88,     0,     0,   102,     0,   164,
+     104,     0,   162,     0,   160,     0,   157,    29,    30,     0,
+      12,    13,     0,     0,    19,    18,     0,    20,    22,    24,
+      31,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   129,     0,   155,   207,   206,
+     181,   198,     0,   210,   208,     0,   194,   173,     0,    64,
+      65,    66,    67,    63,     0,     0,   188,   184,   186,     0,
+      97,     0,    99,   103,     0,     0,     0,   158,     0,    75,
+       7,     0,    14,    26,    11,    17,    23,    36,    37,    40,
+      39,    45,    46,    43,    44,    48,    49,    54,    56,    58,
+       0,   153,     0,     0,     0,     0,     0,   209,     0,   175,
+      62,    69,     0,    98,   159,     0,   161,     0,    76,     9,
+       0,     0,   180,   182,   201,   200,   203,   181,   192,     0,
+       0,     0,     0,    85,   163,     0,    60,     0,   202,     0,
+       0,   191,   189,     0,     0,   176,     0,     0,   204,     0,
+     181,     0,   178,   195,   177,    77,     0,   205,   199,   190,
+     193,   197
 };
 
 /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-      -1,   108,   109,   110,   237,   111,   112,   113,   114,   115,
-     116,   117,   150,   119,   120,   121,   122,   123,   124,   125,
-     126,   127,   128,   129,   130,   151,   152,   226,   153,   132,
-     154,   155,    39,    40,    41,    89,    71,    72,    90,    42,
-      43,    44,    45,    73,    46,    47,    48,    49,    50,   133,
-      52,   135,    85,   137,   138,   206,   207,   174,   157,   158,
-     159,   160,   220,   288,   307,   261,   262,   263,   308,   161,
-     162,   163,   297,   287,   164,   267,   212,   264,   282,   294,
-     295,   165,    53,    54,    55,    64
+      -1,   116,   117,   118,   251,   119,   120,   121,   122,   123,
+     124,   125,   156,   127,   128,   129,   130,   131,   132,   133,
+     134,   135,   136,   137,   138,   157,   158,   234,   159,   140,
+      79,   160,   161,    39,    40,    41,    91,    71,    72,    92,
+      42,    43,    44,    45,    73,    46,    47,    48,    49,    50,
+     141,    52,   143,    87,   103,   104,   183,   184,   180,   163,
+     164,   165,   166,   228,   302,   323,   272,   273,   274,   324,
+     167,   168,   169,   312,   301,   170,   278,   220,   275,   296,
+     309,   310,   171,    53,    54,    55,    64
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -270
+#define YYPACT_NINF -277
 static const yytype_int16 yypact[] =
 {
-    1367,   -24,  -270,  -270,  -270,   141,  -270,  -270,  -270,  -270,
-    -270,  -270,  -270,  -270,  -270,  -270,  -270,  -270,  -270,  -270,
-    -270,  -270,  -270,  -270,  -270,  -270,  -270,    30,  -270,  -270,
-     -28,  -270,  -270,  -270,  -270,  -270,  -270,  -270,   -62,   -32,
-     -26,     1,    -9,  -270,    34,    32,  1414,  -270,  -270,  1496,
-    -270,    15,  -270,  1314,  -270,  -270,  -270,  -270,  1496,  -270,
-    -270,     6,  -270,  -270,    17,  -270,    67,  -270,  -270,  -270,
-    -270,  -270,  1414,   113,    57,  -270,   -20,  -270,  -270,  -270,
-    1060,  -270,  -270,    37,  -270,  1414,   301,  -270,  -270,  -270,
-    -270,    80,  1414,    -6,  -270,   838,  1060,    62,  -270,  -270,
-    -270,  -270,  1060,  1060,  1060,  -270,  -270,  -270,  -270,  -270,
-     -31,  -270,  -270,  -270,    56,   -65,  1132,    72,  -270,  1060,
-      63,   -53,  -270,   -40,    96,  -270,  -270,  -270,    89,    94,
-     -56,  -270,    90,  -270,  -270,  1414,   121,  1204,  -270,    85,
-      86,  -270,    97,   100,    93,   913,   104,   101,  -270,  -270,
-      68,  -270,  -270,    22,  -270,   -62,    71,  -270,  -270,  -270,
-    -270,   394,  -270,  -270,  -270,  -270,   103,  -270,  -270,   985,
-    1060,  -270,   105,  -270,  -270,  -270,  -270,    -1,  -270,  -270,
-    1060,  1455,  -270,  -270,  1060,   107,  -270,  -270,  -270,  1060,
-    1060,  1060,  1060,  1060,  1060,  1060,  1060,  1060,  1060,  1060,
-    1060,  1060,  1060,  -270,  1251,   108,    39,  -270,  -270,  -270,
-    -270,  -270,   109,  -270,  1060,  -270,  -270,    45,  -270,  -270,
-     487,  -270,  -270,  -270,  -270,  -270,  1060,  1060,  -270,  -270,
-    -270,  1060,  -270,   111,  -270,  -270,  -270,   112,   110,  -270,
-     116,  -270,  -270,  -270,  -270,    63,    63,  -270,  -270,  -270,
-    -270,   -40,   -40,  -270,    89,    94,    79,  -270,  1060,   121,
-    -270,   146,    17,   673,   766,     8,  -270,   203,   487,  -270,
-    -270,   115,  -270,  -270,  1060,   118,  -270,   122,  -270,  -270,
-    -270,  -270,   203,   109,   153,   110,   151,   134,   131,  -270,
-    -270,  -270,  1060,  -270,   127,   137,   205,  -270,   132,   580,
-    -270,    13,  1060,   580,   109,  1060,  -270,  -270,  -270,   133,
-     110,  -270,  -270,  -270,  -270
+    1489,   -22,  -277,  -277,  -277,   129,  -277,  -277,  -277,  -277,
+    -277,  -277,  -277,  -277,  -277,  -277,  -277,  -277,  -277,  -277,
+    -277,  -277,  -277,  -277,  -277,  -277,  -277,    60,  -277,  -277,
+     -25,  -277,  -277,  -277,  -277,  -277,  -277,  -277,   -64,   -31,
+     -52,     2,   -15,  -277,    10,    71,   236,  -277,  -277,  1666,
+    -277,     7,  -277,  1436,  -277,  -277,  -277,  -277,  1666,  -277,
+    -277,    28,  -277,  -277,    51,  -277,    80,  -277,  -277,  -277,
+    -277,  -277,  1584,   133,    88,  -277,   -59,  -277,    73,  1537,
+    -277,  -277,  1131,  -277,  -277,    70,  -277,  1537,   298,  -277,
+    -277,  -277,  -277,   112,  1584,    -9,  -277,   909,  1131,  -277,
+     136,  1584,   141,  1277,  -277,   106,  -277,  -277,  -277,  -277,
+    1131,  1131,  1131,  -277,  -277,  -277,  -277,  -277,   101,  -277,
+    -277,  -277,   116,    -5,  1203,   118,  -277,  1131,    81,    31,
+    -277,     5,   114,  -277,  -277,  -277,   134,   131,   -57,  -277,
+     119,  -277,  -277,  1537,  1325,   113,   115,  -277,   124,   128,
+     120,   984,   132,   135,  -277,  -277,   102,  -277,  -277,   -13,
+    -277,   -64,    56,  -277,  -277,  -277,  -277,   391,  -277,  -277,
+    -277,  -277,   137,  -277,  -277,  1056,  1131,  -277,   130,  -277,
+    -277,   141,   139,    18,  -277,   -35,  -277,  -277,  -277,     3,
+    -277,  -277,  1131,  1625,  -277,  -277,  1131,   142,  -277,  -277,
+    -277,  1131,  1131,  1131,  1131,  1131,  1131,  1131,  1131,  1131,
+    1131,  1131,  1131,  1131,  1131,  -277,  1373,  -277,  -277,  -277,
+     140,  -277,  1131,  -277,  -277,    23,  -277,  -277,   484,  -277,
+    -277,  -277,  -277,  -277,  1131,  1131,  -277,  -277,  -277,  1131,
+    -277,   145,  -277,  -277,    37,  1131,   141,  -277,   -46,  -277,
+    -277,   146,   127,  -277,   143,  -277,  -277,  -277,  -277,    81,
+      81,  -277,  -277,  -277,  -277,     5,     5,  -277,   134,   131,
+      97,  -277,   171,    51,   670,   763,     4,  -277,   837,   484,
+    -277,  -277,   148,  -277,  -277,   149,  -277,  1131,  -277,  -277,
+    1131,   153,  -277,  -277,  -277,  -277,   837,   140,   127,   172,
+    1584,   154,   151,  -277,  -277,   155,  -277,  1131,  -277,   144,
+     156,   227,  -277,   159,   577,  -277,   160,    39,  1131,   577,
+     140,  1131,  -277,  -277,  -277,  -277,   161,   127,  -277,  -277,
+    -277,  -277
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -270,  -270,  -270,  -270,  -270,  -270,  -270,    42,  -270,  -270,
-    -270,  -270,   -75,  -270,   -21,  -270,   -87,   -25,  -270,  -270,
-    -270,    26,    41,    25,  -270,   -76,   -95,  -270,  -102,   -89,
-      11,    12,  -270,  -270,  -270,   157,   188,   182,   164,  -270,
-    -270,  -249,  -270,  -270,  -270,   224,   -38,   265,   -13,     0,
-    -270,  -270,  -270,   136,  -130,  -270,    14,  -161,    10,  -139,
-    -248,  -270,  -270,  -270,   -27,  -269,  -270,  -270,   -61,    52,
-      16,  -270,  -270,    -7,  -270,  -270,  -270,  -270,  -270,  -270,
-    -270,  -270,  -270,   225,  -270,  -270
+    -277,  -277,  -277,  -277,  -277,  -277,  -277,    52,  -277,  -277,
+    -277,  -277,   -56,  -277,   -10,  -277,   -76,   -19,  -277,  -277,
+    -277,    33,    38,    40,  -277,   -77,   -94,  -277,   -99,   -80,
+    -277,     8,    14,  -277,  -277,  -277,   163,   188,   182,   164,
+    -277,  -277,  -262,  -277,  -277,   -78,   214,   -44,   267,   -16,
+       0,  -277,  -277,  -277,   -81,   -96,    92,    30,  -161,    12,
+    -157,  -251,  -277,  -277,  -277,   -42,  -276,  -277,  -277,   -61,
+      54,    13,  -277,  -277,    -7,  -277,  -277,  -277,  -277,  -277,
+    -277,  -277,  -277,  -277,   239,  -277,  -277
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
    positive, shift that token.  If negative, reduce the rule which
    number is the opposite.  If YYTABLE_NINF, syntax error.  */
-#define YYTABLE_NINF -175
+#define YYTABLE_NINF -180
 static const yytype_int16 yytable[] =
 {
-      51,   173,   177,    87,   131,   118,   172,   209,    78,   234,
-      67,    37,    38,   201,   296,   279,    56,   183,   286,   131,
-     118,   186,   230,   184,   193,   194,    61,   175,   176,    63,
-      57,   178,   179,   286,    91,   312,    79,    68,    69,    70,
-     191,     7,   192,   217,   188,    83,    51,   136,   202,    51,
-      65,   306,   180,    51,    91,   306,   181,    62,    51,   195,
-     196,    94,    66,    95,    37,    38,    59,    60,    23,    24,
-      96,    25,    51,    27,   209,   173,    67,   169,   238,    74,
-     233,   236,    75,   -75,   170,    51,   156,   227,    76,   242,
-     283,    84,    51,   131,   118,   309,   227,   136,    80,   136,
-     256,   227,    86,    68,    69,    70,   247,   248,   249,   250,
-     227,    93,   265,   228,   243,   244,   118,   118,   118,   118,
-     118,   118,   118,   118,   118,   118,   118,   259,   134,   230,
-     260,   269,   270,   227,   166,    51,   266,    51,   182,   221,
-     222,   223,   271,   -26,   313,     2,     3,     4,   224,    68,
-      69,    70,   -25,   187,    80,   131,   118,   199,   225,   189,
-     190,   156,   197,   198,   200,   285,   136,   227,   274,   275,
-     245,   246,   251,   252,   203,   205,   210,   211,   213,   290,
-     285,   214,   131,   118,   215,   218,   231,   219,  -126,   235,
-     301,   258,   277,    56,  -174,   272,   273,   -27,   227,   289,
-     310,   278,   291,   292,    51,   298,   284,     2,     3,     4,
-     173,     6,     7,     8,     9,    10,   299,   300,   302,   303,
-     156,   304,   305,   241,   314,   253,   255,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,   254,    25,    26,    27,    28,    29,    30,    31,   167,
-      32,    33,    34,    35,    88,    92,   168,    97,    36,    98,
-      99,   100,   101,   156,   156,   102,   103,   156,   156,    77,
-      58,   204,   268,   276,   280,   293,   311,     0,    82,     0,
-     281,     0,   156,     0,   104,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   105,   106,     0,   107,   156,
-       0,     0,     0,   156,     1,     2,     3,     4,     5,     6,
-       7,     8,     9,    10,   139,   140,   141,     0,   142,   143,
-     144,   145,     0,     0,     0,    11,    12,    13,    14,    15,
+      51,   101,    80,    89,   179,   139,   144,   186,    37,   101,
+     238,    67,   213,   189,    38,   242,   299,   178,    56,   248,
+     139,   311,    96,   293,    97,   101,   126,    63,    93,    61,
+     198,    98,    57,    81,   299,   102,    66,   287,    68,    69,
+      70,   126,    85,   102,   329,   288,    51,   214,   186,    51,
+      93,    65,   225,    51,   187,   188,   249,   181,    51,   102,
+      62,    37,   216,   322,    76,   101,   101,    38,   322,   205,
+     206,   200,    51,    74,   175,   235,    75,   195,   236,    51,
+       7,   176,   179,   196,   -79,   250,   297,    51,   162,    67,
+      82,   235,   235,   252,    51,   241,    59,    60,   139,   102,
+     102,    51,   256,    51,   207,   208,   246,    23,    24,   247,
+      25,   235,    27,    86,   277,   270,    68,    69,    70,   126,
+     186,   326,   238,   276,   203,   246,   204,   235,   284,   261,
+     262,   263,   264,     2,     3,     4,    88,   -25,   101,    82,
+     280,   281,    95,    51,    51,   257,   258,   126,   126,   126,
+     126,   126,   126,   126,   126,   126,   126,   126,    99,   282,
+     330,   142,   139,   190,   191,   285,   172,   162,   139,    68,
+      69,    70,   102,   229,   230,   231,    56,   201,   202,   298,
+     209,   210,   232,   126,   192,   235,   290,   -26,   193,   126,
+     265,   266,   233,   259,   260,   182,   306,   298,   194,   199,
+     300,   212,   211,   215,   218,   221,   219,   305,   317,   222,
+     139,   223,   292,   226,   243,   235,    51,   291,   300,   327,
+     239,   227,   245,  -130,   -27,  -179,   313,   179,   162,   283,
+     289,   126,   303,   304,   307,   318,   314,   315,   319,   316,
+       2,     3,     4,   320,   267,   255,     8,     9,    10,   321,
+     268,   325,   331,   269,    90,    94,    80,   173,   174,    77,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    58,   244,   162,   162,   286,   328,   162,   162,
+      30,    31,   279,    32,    33,    34,    35,   294,   295,   308,
+      78,    36,    84,     0,     0,     0,   162,     0,     0,     0,
+      51,     1,     2,     3,     4,     5,     6,     7,     8,     9,
+      10,   145,   146,   147,   162,   148,   149,   150,   151,   162,
+       0,     0,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,     0,    25,    26,    27,
+      28,    29,    30,    31,   152,    32,    33,    34,    35,     0,
+       0,     0,   105,    36,   106,   107,   108,   109,     0,     0,
+     110,   111,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   112,
+       0,     0,     0,   153,   154,     0,     0,     0,     0,   155,
+     113,   114,     0,   115,     1,     2,     3,     4,     5,     6,
+       7,     8,     9,    10,   145,   146,   147,     0,   148,   149,
+     150,   151,     0,     0,     0,    11,    12,    13,    14,    15,
       16,    17,    18,    19,    20,    21,    22,    23,    24,     0,
-      25,    26,    27,    28,    29,    30,    31,   146,    32,    33,
-      34,    35,     0,     0,     0,    97,    36,    98,    99,   100,
-     101,     0,     0,   102,   103,     0,     0,     0,     0,     0,
+      25,    26,    27,    28,    29,    30,    31,   152,    32,    33,
+      34,    35,     0,     0,     0,   105,    36,   106,   107,   108,
+     109,     0,     0,   110,   111,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   104,     0,     0,     0,   147,   148,     0,     0,
-       0,     0,   149,   105,   106,     0,   107,     1,     2,     3,
-       4,     5,     6,     7,     8,     9,    10,   139,   140,   141,
-       0,   142,   143,   144,   145,     0,     0,     0,    11,    12,
+       0,     0,   112,     0,     0,     0,   153,   237,     0,     0,
+       0,     0,   155,   113,   114,     0,   115,     1,     2,     3,
+       4,     5,     6,     7,     8,     9,    10,   145,   146,   147,
+       0,   148,   149,   150,   151,     0,     0,     0,    11,    12,
       13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
       23,    24,     0,    25,    26,    27,    28,    29,    30,    31,
-     146,    32,    33,    34,    35,     0,     0,     0,    97,    36,
-      98,    99,   100,   101,     0,     0,   102,   103,     0,     0,
+     152,    32,    33,    34,    35,     0,     0,     0,   105,    36,
+     106,   107,   108,   109,     0,     0,   110,   111,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   104,     0,     0,     0,   147,
-     229,     0,     0,     0,     0,   149,   105,   106,     0,   107,
+       0,     0,     0,     0,     0,   112,     0,     0,     0,   153,
+       0,     0,     0,     0,     0,   155,   113,   114,     0,   115,
        1,     2,     3,     4,     5,     6,     7,     8,     9,    10,
-     139,   140,   141,     0,   142,   143,   144,   145,     0,     0,
+     145,   146,   147,     0,   148,   149,   150,   151,     0,     0,
        0,    11,    12,    13,    14,    15,    16,    17,    18,    19,
       20,    21,    22,    23,    24,     0,    25,    26,    27,    28,
-      29,    30,    31,   146,    32,    33,    34,    35,     0,     0,
-       0,    97,    36,    98,    99,   100,   101,     0,     0,   102,
-     103,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   104,     0,
-       0,     0,   147,     0,     0,     0,     0,     0,   149,   105,
-     106,     0,   107,     1,     2,     3,     4,     5,     6,     7,
-       8,     9,    10,   139,   140,   141,     0,   142,   143,   144,
-     145,     0,     0,     0,    11,    12,    13,    14,    15,    16,
+      29,    30,    31,   152,    32,    33,    34,    35,     0,     0,
+       0,   105,    36,   106,   107,   108,   109,     0,     0,   110,
+     111,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   112,     0,
+       0,     0,    88,     0,     0,     0,     0,     0,   155,   113,
+     114,     0,   115,     1,     2,     3,     4,     5,     6,     7,
+       8,     9,    10,   145,   146,   147,     0,   148,   149,   150,
+     151,     0,     0,     0,    11,    12,    13,    14,    15,    16,
       17,    18,    19,    20,    21,    22,    23,    24,     0,    25,
-      26,    27,    28,    29,    30,    31,   146,    32,    33,    34,
-      35,     0,     0,     0,    97,    36,    98,    99,   100,   101,
-       0,     0,   102,   103,     0,     0,     0,     0,     0,     0,
+      26,    27,    28,    29,    30,    31,   152,    32,    33,    34,
+      35,     0,     0,     0,   105,    36,   106,   107,   108,   109,
+       0,     0,   110,   111,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   104,     0,     0,     0,    86,     0,     0,     0,     0,
-       0,   149,   105,   106,     0,   107,     1,     2,     3,     4,
-       5,     6,     7,     8,     9,    10,   139,   140,   141,     0,
-     142,   143,   144,   145,     0,     0,     0,    11,    12,    13,
+       0,   112,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   155,   113,   114,     0,   115,     1,     2,     3,     4,
+       5,     6,     7,     8,     9,    10,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,    11,    12,    13,
       14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,     0,    25,    26,    27,    28,    29,    30,    31,   146,
-      32,    33,    34,    35,     0,     0,     0,    97,    36,    98,
-      99,   100,   101,     0,     0,   102,   103,     0,     0,     0,
+      24,     0,    25,    26,    27,    28,    29,    30,    31,     0,
+      32,    33,    34,    35,     0,     0,     0,   105,    36,   106,
+     107,   108,   109,     0,     0,   110,   111,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   104,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   149,   105,   106,     0,   107,     1,
+     100,     2,     3,     4,   112,     6,     7,     8,     9,    10,
+       0,     0,     0,     0,   155,   113,   114,     0,   115,     0,
+       0,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,     0,    25,    26,    27,    28,
+      29,    30,    31,     0,    32,    33,    34,    35,     0,     0,
+       0,   105,    36,   106,   107,   108,   109,     0,     0,   110,
+     111,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   112,     8,
+       9,    10,     0,     0,     0,     0,     0,     0,     0,   113,
+     114,     0,   115,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,     0,     0,     0,     0,     0,
+       0,     0,     0,    30,    31,     0,    32,    33,    34,    35,
+       0,     0,     0,   105,    36,   106,   107,   108,   109,     0,
+       0,   110,   111,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     112,     0,     0,   177,     8,     9,    10,     0,     0,     0,
+       0,   113,   114,     0,   115,     0,     0,     0,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+       0,     0,     0,     0,     0,     0,     0,     0,    30,    31,
+       0,    32,    33,    34,    35,     0,     0,     0,   105,    36,
+     106,   107,   108,   109,     0,     0,   110,   111,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   112,     8,     9,    10,     0,
+       0,     0,     0,     0,     0,   224,   113,   114,     0,   115,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,     0,     0,     0,     0,     0,     0,     0,     0,
+      30,    31,     0,    32,    33,    34,    35,     0,     0,     0,
+     105,    36,   106,   107,   108,   109,     0,     0,   110,   111,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   112,     0,     0,
+     240,     8,     9,    10,     0,     0,     0,     0,   113,   114,
+       0,   115,     0,     0,     0,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,     0,     0,     0,
+       0,     0,     0,     0,     0,    30,    31,     0,    32,    33,
+      34,    35,     0,     0,     0,   105,    36,   106,   107,   108,
+     109,     0,     0,   110,   111,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   112,     8,     9,    10,     0,     0,     0,     0,
+       0,     0,     0,   113,   114,     0,   115,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,     0,
+       0,     0,     0,     0,     0,     0,     0,    30,   197,     0,
+      32,    33,    34,    35,     0,     0,     0,   105,    36,   106,
+     107,   108,   109,     0,     0,   110,   111,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     100,     2,     3,     4,   112,     6,     7,     8,     9,    10,
+       0,     0,     0,     0,     0,   113,   114,     0,   115,     0,
+       0,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,     0,    25,    26,    27,    28,
+      29,    30,    31,     0,    32,    33,    34,    35,   100,     2,
+       3,     4,    36,     6,     7,     8,     9,    10,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,   185,    25,    26,    27,    28,    29,    30,
+      31,     0,    32,    33,    34,    35,   100,     2,     3,     4,
+      36,     6,     7,     8,     9,    10,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,   217,    25,    26,    27,    28,    29,    30,    31,     0,
+      32,    33,    34,    35,     0,     0,     0,     0,    36,     0,
+       0,     0,     0,     0,     0,     0,    83,     0,     0,     1,
        2,     3,     4,     5,     6,     7,     8,     9,    10,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   271,
       11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
       21,    22,    23,    24,     0,    25,    26,    27,    28,    29,
       30,    31,     0,    32,    33,    34,    35,     0,     0,     0,
-      97,    36,    98,    99,   100,   101,     0,     0,   102,   103,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   104,     8,     9,
-      10,     0,     0,     0,     0,     0,     0,   149,   105,   106,
-       0,   107,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,     0,     0,     0,     0,     0,     0,
-       0,     0,    30,    31,     0,    32,    33,    34,    35,     0,
-       0,     0,    97,    36,    98,    99,   100,   101,     0,     0,
-     102,   103,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   104,
-       0,     0,   171,     8,     9,    10,     0,     0,     0,     0,
-     105,   106,     0,   107,     0,     0,     0,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,     0,
-       0,     0,     0,     0,     0,     0,     0,    30,    31,     0,
-      32,    33,    34,    35,     0,     0,     0,    97,    36,    98,
-      99,   100,   101,     0,     0,   102,   103,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   104,     8,     9,    10,     0,     0,
-       0,     0,     0,     0,   216,   105,   106,     0,   107,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,     0,     0,     0,     0,     0,     0,     0,     0,    30,
-      31,     0,    32,    33,    34,    35,     0,     0,     0,    97,
-      36,    98,    99,   100,   101,     0,     0,   102,   103,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   104,     0,     0,   232,
-       8,     9,    10,     0,     0,     0,     0,   105,   106,     0,
-     107,     0,     0,     0,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,     0,     0,     0,     0,
-       0,     0,     0,     0,    30,    31,     0,    32,    33,    34,
-      35,     0,     0,     0,    97,    36,    98,    99,   100,   101,
-       0,     0,   102,   103,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   104,     8,     9,    10,     0,     0,     0,     0,     0,
-       0,     0,   105,   106,     0,   107,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,     0,     0,
-       0,     0,     0,     0,     0,     0,    30,   185,     0,    32,
-      33,    34,    35,     0,     0,     0,    97,    36,    98,    99,
-     100,   101,     0,     0,   102,   103,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     2,     3,
-       4,     0,     0,   104,     8,     9,    10,     0,     0,     0,
-       0,     0,     0,     0,   105,   106,     0,   107,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-       0,     0,     0,     0,     0,     0,     0,     0,    30,    31,
-       0,    32,    33,    34,    35,     2,     3,     4,     0,    36,
-       0,     8,     9,    10,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,     0,     0,     0,
-     208,     0,     0,     0,     0,    30,    31,     0,    32,    33,
-      34,    35,     0,     0,     0,     0,    36,     0,     0,     0,
-       0,     0,     0,     0,    81,     0,     0,     1,     2,     3,
-       4,     5,     6,     7,     8,     9,    10,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   257,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,     0,    25,    26,    27,    28,    29,    30,    31,
-       0,    32,    33,    34,    35,     0,     0,     0,     0,    36,
-       1,     2,     3,     4,     5,     6,     7,     8,     9,    10,
+       0,    36,     1,     2,     3,     4,     5,     6,     7,     8,
+       9,    10,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,     0,    25,    26,
+      27,    28,    29,    30,    31,     0,    32,    33,    34,    35,
+     100,     2,     3,     4,    36,     6,     7,     8,     9,    10,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,    11,    12,    13,    14,    15,    16,    17,    18,    19,
       20,    21,    22,    23,    24,     0,    25,    26,    27,    28,
@@ -1129,8 +1155,8 @@
        0,     0,     0,     0,     0,     0,     0,     0,     0,    11,
       12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
       22,     0,     0,     0,     0,     0,     0,     0,     0,    30,
-      31,     0,    32,    33,    34,    35,     8,     9,    10,   239,
-      36,     0,     0,     0,   240,     0,     0,     0,     0,     0,
+      31,     0,    32,    33,    34,    35,     8,     9,    10,   253,
+      36,     0,     0,     0,   254,     0,     0,     0,     0,     0,
       11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
       21,    22,     0,     0,     0,     0,     0,     0,     0,     0,
       30,    31,     0,    32,    33,    34,    35,     0,     0,     0,
@@ -1138,44 +1164,53 @@
 };
 
 #define yypact_value_is_default(Yystate) \
-  (!!((Yystate) == (-270)))
+  (!!((Yystate) == (-277)))
 
 #define yytable_value_is_error(Yytable_value) \
   YYID (0)
 
 static const yytype_int16 yycheck[] =
 {
-       0,    96,   104,    64,    80,    80,    95,   137,    46,   170,
-       9,     0,     0,    69,   283,   263,    40,    82,   267,    95,
-      95,   116,   161,    88,    64,    65,    54,   102,   103,    91,
-      54,    62,    63,   282,    72,   304,    49,    36,    37,    38,
-      93,     9,    95,   145,   119,    58,    46,    85,   104,    49,
-      82,   299,    83,    53,    92,   303,    87,    85,    58,    99,
-     100,    81,    88,    83,    53,    53,    36,    37,    36,    37,
-      90,    39,    72,    41,   204,   170,     9,    83,   180,    88,
-     169,    82,    91,    82,    90,    85,    86,    88,    54,   184,
-      82,    85,    92,   169,   169,    82,    88,   135,    83,   137,
-     202,    88,    85,    36,    37,    38,   193,   194,   195,   196,
-      88,    54,   214,    91,   189,   190,   191,   192,   193,   194,
-     195,   196,   197,   198,   199,   200,   201,    88,    91,   268,
-      91,   226,   227,    88,    54,   135,    91,   137,    82,    71,
-      72,    73,   231,    81,   305,     4,     5,     6,    80,    36,
-      37,    38,    81,    81,    83,   231,   231,    68,    90,    96,
-      97,   161,    66,    67,    70,   267,   204,    88,    89,   258,
-     191,   192,   197,   198,    84,    54,    91,    91,    81,   274,
-     282,    81,   258,   258,    91,    81,    83,    86,    81,    84,
-     292,    83,    46,    40,    85,    84,    84,    81,    88,    84,
-     302,   262,    84,    81,   204,    54,     3,     4,     5,     6,
-     305,     8,     9,    10,    11,    12,    82,    86,    91,    82,
-     220,    16,    90,   181,    91,   199,   201,    24,    25,    26,
-      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
-      37,   200,    39,    40,    41,    42,    43,    44,    45,    92,
-      47,    48,    49,    50,    66,    73,    92,    54,    55,    56,
-      57,    58,    59,   263,   264,    62,    63,   267,   268,    45,
-       5,   135,   220,   259,   264,   282,   303,    -1,    53,    -1,
-     264,    -1,   282,    -1,    81,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    92,    93,    -1,    95,   299,
-      -1,    -1,    -1,   303,     3,     4,     5,     6,     7,     8,
+       0,    79,    46,    64,    98,    82,    87,   103,     0,    87,
+     167,     9,    69,   112,     0,   176,   278,    97,    40,    54,
+      97,   297,    81,   274,    83,   103,    82,    91,    72,    54,
+     124,    90,    54,    49,   296,    79,    88,    83,    36,    37,
+      38,    97,    58,    87,   320,    91,    46,   104,   144,    49,
+      94,    82,   151,    53,   110,   111,    91,   101,    58,   103,
+      85,    53,   143,   314,    54,   143,   144,    53,   319,    64,
+      65,   127,    72,    88,    83,    88,    91,    82,    91,    79,
+       9,    90,   176,    88,    82,    82,    82,    87,    88,     9,
+      83,    88,    88,   192,    94,   175,    36,    37,   175,   143,
+     144,   101,   196,   103,    99,   100,    88,    36,    37,    91,
+      39,    88,    41,    85,    91,   214,    36,    37,    38,   175,
+     216,    82,   279,   222,    93,    88,    95,    88,    91,   205,
+     206,   207,   208,     4,     5,     6,    85,    81,   216,    83,
+     234,   235,    54,   143,   144,   201,   202,   203,   204,   205,
+     206,   207,   208,   209,   210,   211,   212,   213,    85,   239,
+     321,    91,   239,    62,    63,   245,    54,   167,   245,    36,
+      37,    38,   216,    71,    72,    73,    40,    96,    97,   278,
+      66,    67,    80,   239,    83,    88,    89,    81,    87,   245,
+     209,   210,    90,   203,   204,    54,   290,   296,    82,    81,
+     278,    70,    68,    84,    91,    81,    91,   287,   307,    81,
+     287,    91,   273,    81,    84,    88,   216,    46,   296,   318,
+      83,    86,    83,    81,    81,    85,    54,   321,   228,    84,
+      84,   287,    84,    84,    81,    91,    82,    86,    82,    84,
+       4,     5,     6,    16,   211,   193,    10,    11,    12,    90,
+     212,    91,    91,   213,    66,    73,   300,    94,    94,    45,
+      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
+      34,    35,     5,   181,   274,   275,   246,   319,   278,   279,
+      44,    45,   228,    47,    48,    49,    50,   275,   275,   296,
+      54,    55,    53,    -1,    -1,    -1,   296,    -1,    -1,    -1,
+     300,     3,     4,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,    14,    15,   314,    17,    18,    19,    20,   319,
+      -1,    -1,    24,    25,    26,    27,    28,    29,    30,    31,
+      32,    33,    34,    35,    36,    37,    -1,    39,    40,    41,
+      42,    43,    44,    45,    46,    47,    48,    49,    50,    -1,
+      -1,    -1,    54,    55,    56,    57,    58,    59,    -1,    -1,
+      62,    63,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    81,
+      -1,    -1,    -1,    85,    86,    -1,    -1,    -1,    -1,    91,
+      92,    93,    -1,    95,     3,     4,     5,     6,     7,     8,
        9,    10,    11,    12,    13,    14,    15,    -1,    17,    18,
       19,    20,    -1,    -1,    -1,    24,    25,    26,    27,    28,
       29,    30,    31,    32,    33,    34,    35,    36,    37,    -1,
@@ -1193,7 +1228,7 @@
       56,    57,    58,    59,    -1,    -1,    62,    63,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    81,    -1,    -1,    -1,    85,
-      86,    -1,    -1,    -1,    -1,    91,    92,    93,    -1,    95,
+      -1,    -1,    -1,    -1,    -1,    91,    92,    93,    -1,    95,
        3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
       13,    14,    15,    -1,    17,    18,    19,    20,    -1,    -1,
       -1,    24,    25,    26,    27,    28,    29,    30,    31,    32,
@@ -1211,78 +1246,86 @@
       50,    -1,    -1,    -1,    54,    55,    56,    57,    58,    59,
       -1,    -1,    62,    63,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    81,    -1,    -1,    -1,    85,    -1,    -1,    -1,    -1,
+      -1,    81,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    91,    92,    93,    -1,    95,     3,     4,     5,     6,
-       7,     8,     9,    10,    11,    12,    13,    14,    15,    -1,
-      17,    18,    19,    20,    -1,    -1,    -1,    24,    25,    26,
+       7,     8,     9,    10,    11,    12,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    24,    25,    26,
       27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
-      37,    -1,    39,    40,    41,    42,    43,    44,    45,    46,
+      37,    -1,    39,    40,    41,    42,    43,    44,    45,    -1,
       47,    48,    49,    50,    -1,    -1,    -1,    54,    55,    56,
       57,    58,    59,    -1,    -1,    62,    63,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    81,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    91,    92,    93,    -1,    95,     3,
-       4,     5,     6,     7,     8,     9,    10,    11,    12,    -1,
+       3,     4,     5,     6,    81,     8,     9,    10,    11,    12,
+      -1,    -1,    -1,    -1,    91,    92,    93,    -1,    95,    -1,
+      -1,    24,    25,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    -1,    39,    40,    41,    42,
+      43,    44,    45,    -1,    47,    48,    49,    50,    -1,    -1,
+      -1,    54,    55,    56,    57,    58,    59,    -1,    -1,    62,
+      63,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    81,    10,
+      11,    12,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    92,
+      93,    -1,    95,    24,    25,    26,    27,    28,    29,    30,
+      31,    32,    33,    34,    35,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    44,    45,    -1,    47,    48,    49,    50,
+      -1,    -1,    -1,    54,    55,    56,    57,    58,    59,    -1,
+      -1,    62,    63,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      81,    -1,    -1,    84,    10,    11,    12,    -1,    -1,    -1,
+      -1,    92,    93,    -1,    95,    -1,    -1,    -1,    24,    25,
+      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    44,    45,
+      -1,    47,    48,    49,    50,    -1,    -1,    -1,    54,    55,
+      56,    57,    58,    59,    -1,    -1,    62,    63,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    81,    10,    11,    12,    -1,
+      -1,    -1,    -1,    -1,    -1,    91,    92,    93,    -1,    95,
       24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    -1,    39,    40,    41,    42,    43,
+      34,    35,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       44,    45,    -1,    47,    48,    49,    50,    -1,    -1,    -1,
       54,    55,    56,    57,    58,    59,    -1,    -1,    62,    63,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    81,    10,    11,
-      12,    -1,    -1,    -1,    -1,    -1,    -1,    91,    92,    93,
-      -1,    95,    24,    25,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    35,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    44,    45,    -1,    47,    48,    49,    50,    -1,
-      -1,    -1,    54,    55,    56,    57,    58,    59,    -1,    -1,
-      62,    63,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    81,
-      -1,    -1,    84,    10,    11,    12,    -1,    -1,    -1,    -1,
-      92,    93,    -1,    95,    -1,    -1,    -1,    24,    25,    26,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    81,    -1,    -1,
+      84,    10,    11,    12,    -1,    -1,    -1,    -1,    92,    93,
+      -1,    95,    -1,    -1,    -1,    24,    25,    26,    27,    28,
+      29,    30,    31,    32,    33,    34,    35,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    44,    45,    -1,    47,    48,
+      49,    50,    -1,    -1,    -1,    54,    55,    56,    57,    58,
+      59,    -1,    -1,    62,    63,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    81,    10,    11,    12,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    92,    93,    -1,    95,    24,    25,    26,
       27,    28,    29,    30,    31,    32,    33,    34,    35,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    44,    45,    -1,
       47,    48,    49,    50,    -1,    -1,    -1,    54,    55,    56,
       57,    58,    59,    -1,    -1,    62,    63,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    81,    10,    11,    12,    -1,    -1,
-      -1,    -1,    -1,    -1,    91,    92,    93,    -1,    95,    24,
+       3,     4,     5,     6,    81,     8,     9,    10,    11,    12,
+      -1,    -1,    -1,    -1,    -1,    92,    93,    -1,    95,    -1,
+      -1,    24,    25,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    -1,    39,    40,    41,    42,
+      43,    44,    45,    -1,    47,    48,    49,    50,     3,     4,
+       5,     6,    55,     8,     9,    10,    11,    12,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    24,
       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
-      35,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    44,
-      45,    -1,    47,    48,    49,    50,    -1,    -1,    -1,    54,
-      55,    56,    57,    58,    59,    -1,    -1,    62,    63,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    81,    -1,    -1,    84,
-      10,    11,    12,    -1,    -1,    -1,    -1,    92,    93,    -1,
-      95,    -1,    -1,    -1,    24,    25,    26,    27,    28,    29,
-      30,    31,    32,    33,    34,    35,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    44,    45,    -1,    47,    48,    49,
-      50,    -1,    -1,    -1,    54,    55,    56,    57,    58,    59,
-      -1,    -1,    62,    63,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    81,    10,    11,    12,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    92,    93,    -1,    95,    24,    25,    26,    27,
-      28,    29,    30,    31,    32,    33,    34,    35,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    44,    45,    -1,    47,
-      48,    49,    50,    -1,    -1,    -1,    54,    55,    56,    57,
-      58,    59,    -1,    -1,    62,    63,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     4,     5,
-       6,    -1,    -1,    81,    10,    11,    12,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    92,    93,    -1,    95,    24,    25,
-      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    44,    45,
-      -1,    47,    48,    49,    50,     4,     5,     6,    -1,    55,
-      -1,    10,    11,    12,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    24,    25,    26,    27,    28,
-      29,    30,    31,    32,    33,    34,    35,    -1,    -1,    -1,
-      86,    -1,    -1,    -1,    -1,    44,    45,    -1,    47,    48,
-      49,    50,    -1,    -1,    -1,    -1,    55,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,     0,    -1,    -1,     3,     4,     5,
-       6,     7,     8,     9,    10,    11,    12,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    86,    24,    25,
-      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
-      36,    37,    -1,    39,    40,    41,    42,    43,    44,    45,
-      -1,    47,    48,    49,    50,    -1,    -1,    -1,    -1,    55,
-       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      35,    36,    37,    86,    39,    40,    41,    42,    43,    44,
+      45,    -1,    47,    48,    49,    50,     3,     4,     5,     6,
+      55,     8,     9,    10,    11,    12,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    24,    25,    26,
+      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+      37,    86,    39,    40,    41,    42,    43,    44,    45,    -1,
+      47,    48,    49,    50,    -1,    -1,    -1,    -1,    55,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,     0,    -1,    -1,     3,
+       4,     5,     6,     7,     8,     9,    10,    11,    12,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    86,
+      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
+      34,    35,    36,    37,    -1,    39,    40,    41,    42,    43,
+      44,    45,    -1,    47,    48,    49,    50,    -1,    -1,    -1,
+      -1,    55,     3,     4,     5,     6,     7,     8,     9,    10,
+      11,    12,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    24,    25,    26,    27,    28,    29,    30,
+      31,    32,    33,    34,    35,    36,    37,    -1,    39,    40,
+      41,    42,    43,    44,    45,    -1,    47,    48,    49,    50,
+       3,     4,     5,     6,    55,     8,     9,    10,    11,    12,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    24,    25,    26,    27,    28,    29,    30,    31,    32,
       33,    34,    35,    36,    37,    -1,    39,    40,    41,    42,
@@ -1310,35 +1353,37 @@
        0,     3,     4,     5,     6,     7,     8,     9,    10,    11,
       12,    24,    25,    26,    27,    28,    29,    30,    31,    32,
       33,    34,    35,    36,    37,    39,    40,    41,    42,    43,
-      44,    45,    47,    48,    49,    50,    55,   135,   136,   137,
-     138,   139,   144,   145,   146,   147,   149,   150,   151,   152,
-     153,   154,   155,   187,   188,   189,    40,    54,   152,    36,
-      37,    54,    85,    91,   190,    82,    88,     9,    36,    37,
-      38,   141,   142,   148,    88,    91,    54,   150,   151,   153,
-      83,     0,   188,   153,    85,   157,    85,   173,   141,   140,
-     143,   151,   142,    54,    81,    83,    90,    54,    56,    57,
-      58,    59,    62,    63,    81,    92,    93,    95,   106,   107,
-     108,   110,   111,   112,   113,   114,   115,   116,   117,   118,
-     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
-     129,   130,   134,   154,    91,   156,   151,   158,   159,    13,
-      14,    15,    17,    18,    19,    20,    46,    85,    86,    91,
-     117,   130,   131,   133,   135,   136,   154,   163,   164,   165,
-     166,   174,   175,   176,   179,   186,    54,   140,   143,    83,
-      90,    84,   134,   131,   162,   117,   117,   133,    62,    63,
-      83,    87,    82,    82,    88,    45,   131,    81,   117,    96,
-      97,    93,    95,    64,    65,    99,   100,    66,    67,    68,
-      70,    69,   104,    84,   158,    54,   160,   161,    86,   159,
-      91,    91,   181,    81,    81,    91,    91,   133,    81,    86,
-     167,    71,    72,    73,    80,    90,   132,    88,    91,    86,
-     164,    83,    84,   134,   162,    84,    82,   109,   133,    54,
-      59,   112,   131,   117,   117,   119,   119,   121,   121,   121,
-     121,   122,   122,   126,   127,   128,   133,    86,    83,    88,
-      91,   170,   171,   172,   182,   133,    91,   180,   174,   131,
-     131,   134,    84,    84,    89,   134,   161,    46,   173,   165,
-     163,   175,   183,    82,     3,   133,   146,   178,   168,    84,
-     131,    84,    81,   178,   184,   185,   170,   177,    54,    82,
-      86,   133,    91,    82,    16,    90,   165,   169,   173,    82,
-     133,   169,   170,   162,    91
+      44,    45,    47,    48,    49,    50,    55,   136,   137,   138,
+     139,   140,   145,   146,   147,   148,   150,   151,   152,   153,
+     154,   155,   156,   188,   189,   190,    40,    54,   153,    36,
+      37,    54,    85,    91,   191,    82,    88,     9,    36,    37,
+      38,   142,   143,   149,    88,    91,    54,   151,    54,   135,
+     152,   154,    83,     0,   189,   154,    85,   158,    85,   174,
+     142,   141,   144,   152,   143,    54,    81,    83,    90,    85,
+       3,   150,   152,   159,   160,    54,    56,    57,    58,    59,
+      62,    63,    81,    92,    93,    95,   106,   107,   108,   110,
+     111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
+     121,   122,   123,   124,   125,   126,   127,   128,   129,   130,
+     134,   155,    91,   157,   159,    13,    14,    15,    17,    18,
+      19,    20,    46,    85,    86,    91,   117,   130,   131,   133,
+     136,   137,   155,   164,   165,   166,   167,   175,   176,   177,
+     180,   187,    54,   141,   144,    83,    90,    84,   134,   131,
+     163,   152,    54,   161,   162,    86,   160,   117,   117,   133,
+      62,    63,    83,    87,    82,    82,    88,    45,   131,    81,
+     117,    96,    97,    93,    95,    64,    65,    99,   100,    66,
+      67,    68,    70,    69,   104,    84,   159,    86,    91,    91,
+     182,    81,    81,    91,    91,   133,    81,    86,   168,    71,
+      72,    73,    80,    90,   132,    88,    91,    86,   165,    83,
+      84,   134,   163,    84,   161,    83,    88,    91,    54,    91,
+      82,   109,   133,    54,    59,   112,   131,   117,   117,   119,
+     119,   121,   121,   121,   121,   122,   122,   126,   127,   128,
+     133,    86,   171,   172,   173,   183,   133,    91,   181,   175,
+     131,   131,   134,    84,    91,   134,   162,    83,    91,    84,
+      89,    46,   174,   166,   164,   176,   184,    82,   133,   147,
+     150,   179,   169,    84,    84,   134,   131,    81,   179,   185,
+     186,   171,   178,    54,    82,    86,    84,   133,    91,    82,
+      16,    90,   166,   170,   174,    91,    82,   133,   170,   171,
+     163,    91
 };
 
 #define yyerrok		(yyerrstatus = 0)
@@ -2964,6 +3009,15 @@
   case 71:
 
     {
+        if (context->enterStructDeclaration((yyvsp[(1) - (2)].lex).line, *(yyvsp[(1) - (2)].lex).string))
+            context->recover();
+        (yyval.lex) = (yyvsp[(1) - (2)].lex);
+    }
+    break;
+
+  case 72:
+
+    {
         TFunction &function = *((yyvsp[(1) - (2)].interm).function);
         
         TIntermAggregate *prototype = new TIntermAggregate;
@@ -2992,7 +3046,7 @@
     }
     break;
 
-  case 72:
+  case 73:
 
     {
         if ((yyvsp[(1) - (2)].interm).intermAggregate)
@@ -3001,7 +3055,7 @@
     }
     break;
 
-  case 73:
+  case 74:
 
     {
         if (((yyvsp[(2) - (4)].interm.precision) == EbpHigh) && (context->shaderType == SH_FRAGMENT_SHADER) && !context->fragmentPrecisionHigh) {
@@ -3016,7 +3070,31 @@
     }
     break;
 
-  case 74:
+  case 75:
+
+    {
+        ES3_ONLY(getQualifierString((yyvsp[(1) - (5)].interm.type).qualifier), (yyvsp[(1) - (5)].interm.type).line, "interface blocks");
+        (yyval.interm.intermNode) = context->addInterfaceBlock((yyvsp[(1) - (5)].interm.type), (yyvsp[(2) - (5)].lex).line, *(yyvsp[(2) - (5)].lex).string, (yyvsp[(3) - (5)].interm.typeList), "", 0, NULL, 0);
+    }
+    break;
+
+  case 76:
+
+    {
+        ES3_ONLY(getQualifierString((yyvsp[(1) - (6)].interm.type).qualifier), (yyvsp[(1) - (6)].interm.type).line, "interface blocks");
+        (yyval.interm.intermNode) = context->addInterfaceBlock((yyvsp[(1) - (6)].interm.type), (yyvsp[(2) - (6)].lex).line, *(yyvsp[(2) - (6)].lex).string, (yyvsp[(3) - (6)].interm.typeList), *(yyvsp[(5) - (6)].lex).string, (yyvsp[(5) - (6)].lex).line, NULL, 0);
+    }
+    break;
+
+  case 77:
+
+    {
+        ES3_ONLY(getQualifierString((yyvsp[(1) - (9)].interm.type).qualifier), (yyvsp[(1) - (9)].interm.type).line, "interface blocks");
+        (yyval.interm.intermNode) = context->addInterfaceBlock((yyvsp[(1) - (9)].interm.type), (yyvsp[(2) - (9)].lex).line, *(yyvsp[(2) - (9)].lex).string, (yyvsp[(3) - (9)].interm.typeList), *(yyvsp[(5) - (9)].lex).string, (yyvsp[(5) - (9)].lex).line, (yyvsp[(7) - (9)].interm.intermTypedNode), (yyvsp[(6) - (9)].lex).line);
+    }
+    break;
+
+  case 78:
 
     {
         //
@@ -3055,21 +3133,21 @@
     }
     break;
 
-  case 75:
+  case 79:
 
     {
         (yyval.interm.function) = (yyvsp[(1) - (1)].interm.function);
     }
     break;
 
-  case 76:
+  case 80:
 
     {
         (yyval.interm.function) = (yyvsp[(1) - (1)].interm.function);
     }
     break;
 
-  case 77:
+  case 81:
 
     {
         // Add the parameter
@@ -3081,7 +3159,7 @@
     }
     break;
 
-  case 78:
+  case 82:
 
     {
         //
@@ -3103,7 +3181,7 @@
     }
     break;
 
-  case 79:
+  case 83:
 
     {
         if ((yyvsp[(1) - (3)].interm.type).qualifier != EvqGlobal && (yyvsp[(1) - (3)].interm.type).qualifier != EvqTemporary) {
@@ -3124,7 +3202,7 @@
     }
     break;
 
-  case 80:
+  case 84:
 
     {
         if ((yyvsp[(1) - (2)].interm.type).type == EbtVoid) {
@@ -3139,7 +3217,7 @@
     }
     break;
 
-  case 81:
+  case 85:
 
     {
         // Check that we can make an array out of this type
@@ -3161,90 +3239,90 @@
     }
     break;
 
-  case 82:
-
-    {
-        (yyval.interm) = (yyvsp[(3) - (3)].interm);
-        if (context->paramErrorCheck((yyvsp[(3) - (3)].interm).line, (yyvsp[(1) - (3)].interm.qualifier), (yyvsp[(2) - (3)].interm.qualifier), (yyval.interm).param.type))
-            context->recover();
-    }
-    break;
-
-  case 83:
-
-    {
-        (yyval.interm) = (yyvsp[(2) - (2)].interm);
-        if (context->parameterSamplerErrorCheck((yyvsp[(2) - (2)].interm).line, (yyvsp[(1) - (2)].interm.qualifier), *(yyvsp[(2) - (2)].interm).param.type))
-            context->recover();
-        if (context->paramErrorCheck((yyvsp[(2) - (2)].interm).line, EvqTemporary, (yyvsp[(1) - (2)].interm.qualifier), (yyval.interm).param.type))
-            context->recover();
-    }
-    break;
-
-  case 84:
-
-    {
-        (yyval.interm) = (yyvsp[(3) - (3)].interm);
-        if (context->paramErrorCheck((yyvsp[(3) - (3)].interm).line, (yyvsp[(1) - (3)].interm.qualifier), (yyvsp[(2) - (3)].interm.qualifier), (yyval.interm).param.type))
-            context->recover();
-    }
-    break;
-
-  case 85:
-
-    {
-        (yyval.interm) = (yyvsp[(2) - (2)].interm);
-        if (context->parameterSamplerErrorCheck((yyvsp[(2) - (2)].interm).line, (yyvsp[(1) - (2)].interm.qualifier), *(yyvsp[(2) - (2)].interm).param.type))
-            context->recover();
-        if (context->paramErrorCheck((yyvsp[(2) - (2)].interm).line, EvqTemporary, (yyvsp[(1) - (2)].interm.qualifier), (yyval.interm).param.type))
-            context->recover();
-    }
-    break;
-
   case 86:
 
     {
-        (yyval.interm.qualifier) = EvqIn;
+        (yyval.interm) = (yyvsp[(3) - (3)].interm);
+        if (context->paramErrorCheck((yyvsp[(3) - (3)].interm).line, (yyvsp[(1) - (3)].interm.qualifier), (yyvsp[(2) - (3)].interm.qualifier), (yyval.interm).param.type))
+            context->recover();
     }
     break;
 
   case 87:
 
     {
-        (yyval.interm.qualifier) = EvqIn;
+        (yyval.interm) = (yyvsp[(2) - (2)].interm);
+        if (context->parameterSamplerErrorCheck((yyvsp[(2) - (2)].interm).line, (yyvsp[(1) - (2)].interm.qualifier), *(yyvsp[(2) - (2)].interm).param.type))
+            context->recover();
+        if (context->paramErrorCheck((yyvsp[(2) - (2)].interm).line, EvqTemporary, (yyvsp[(1) - (2)].interm.qualifier), (yyval.interm).param.type))
+            context->recover();
     }
     break;
 
   case 88:
 
     {
-        (yyval.interm.qualifier) = EvqOut;
+        (yyval.interm) = (yyvsp[(3) - (3)].interm);
+        if (context->paramErrorCheck((yyvsp[(3) - (3)].interm).line, (yyvsp[(1) - (3)].interm.qualifier), (yyvsp[(2) - (3)].interm.qualifier), (yyval.interm).param.type))
+            context->recover();
     }
     break;
 
   case 89:
 
     {
-        (yyval.interm.qualifier) = EvqInOut;
+        (yyval.interm) = (yyvsp[(2) - (2)].interm);
+        if (context->parameterSamplerErrorCheck((yyvsp[(2) - (2)].interm).line, (yyvsp[(1) - (2)].interm.qualifier), *(yyvsp[(2) - (2)].interm).param.type))
+            context->recover();
+        if (context->paramErrorCheck((yyvsp[(2) - (2)].interm).line, EvqTemporary, (yyvsp[(1) - (2)].interm.qualifier), (yyval.interm).param.type))
+            context->recover();
     }
     break;
 
   case 90:
 
     {
+        (yyval.interm.qualifier) = EvqIn;
+    }
+    break;
+
+  case 91:
+
+    {
+        (yyval.interm.qualifier) = EvqIn;
+    }
+    break;
+
+  case 92:
+
+    {
+        (yyval.interm.qualifier) = EvqOut;
+    }
+    break;
+
+  case 93:
+
+    {
+        (yyval.interm.qualifier) = EvqInOut;
+    }
+    break;
+
+  case 94:
+
+    {
         TParameter param = { 0, new TType((yyvsp[(1) - (1)].interm.type)) };
         (yyval.interm).param = param;
     }
     break;
 
-  case 91:
+  case 95:
 
     {
         (yyval.interm) = (yyvsp[(1) - (1)].interm);
     }
     break;
 
-  case 92:
+  case 96:
 
     {
         if ((yyvsp[(1) - (3)].interm).type.type == EbtInvariant && !(yyvsp[(3) - (3)].lex).symbol)
@@ -3270,7 +3348,7 @@
     }
     break;
 
-  case 93:
+  case 97:
 
     {
         if (context->structQualifierErrorCheck((yyvsp[(3) - (5)].lex).line, (yyvsp[(1) - (5)].interm).type))
@@ -3292,7 +3370,7 @@
     }
     break;
 
-  case 94:
+  case 98:
 
     {
         if (context->structQualifierErrorCheck((yyvsp[(3) - (6)].lex).line, (yyvsp[(1) - (6)].interm).type))
@@ -3320,7 +3398,7 @@
     }
     break;
 
-  case 95:
+  case 99:
 
     {
         if (context->structQualifierErrorCheck((yyvsp[(3) - (5)].lex).line, (yyvsp[(1) - (5)].interm).type))
@@ -3344,7 +3422,7 @@
     }
     break;
 
-  case 96:
+  case 100:
 
     {
         (yyval.interm).type = (yyvsp[(1) - (1)].interm.type);
@@ -3352,7 +3430,7 @@
     }
     break;
 
-  case 97:
+  case 101:
 
     {
         TIntermSymbol* symbol = context->intermediate.addSymbol(0, *(yyvsp[(2) - (2)].lex).string, TType((yyvsp[(1) - (2)].interm.type)), (yyvsp[(2) - (2)].lex).line);
@@ -3374,7 +3452,7 @@
     }
     break;
 
-  case 98:
+  case 102:
 
     {
         context->error((yyvsp[(2) - (4)].lex).line, "unsized array declarations not supported", (yyvsp[(2) - (4)].lex).string->c_str());
@@ -3386,7 +3464,7 @@
     }
     break;
 
-  case 99:
+  case 103:
 
     {
         TType type = TType((yyvsp[(1) - (5)].interm.type));
@@ -3422,7 +3500,7 @@
     }
     break;
 
-  case 100:
+  case 104:
 
     {
         if (context->structQualifierErrorCheck((yyvsp[(2) - (4)].lex).line, (yyvsp[(1) - (4)].interm.type)))
@@ -3446,7 +3524,7 @@
     }
     break;
 
-  case 101:
+  case 105:
 
     {
         VERTEX_ONLY("invariant declaration", (yyvsp[(1) - (2)].lex).line);
@@ -3468,7 +3546,7 @@
     }
     break;
 
-  case 102:
+  case 106:
 
     {
         (yyval.interm.type) = (yyvsp[(1) - (1)].interm.type);
@@ -3481,7 +3559,7 @@
     }
     break;
 
-  case 103:
+  case 107:
 
     {
         if ((yyvsp[(2) - (2)].interm.type).array) {
@@ -3505,7 +3583,7 @@
     }
     break;
 
-  case 104:
+  case 108:
 
     {
         (yyval.interm.type).qualifier = EvqSmooth;
@@ -3513,7 +3591,7 @@
     }
     break;
 
-  case 105:
+  case 109:
 
     {
         (yyval.interm.type).qualifier = EvqFlat;
@@ -3521,14 +3599,14 @@
     }
     break;
 
-  case 106:
+  case 110:
 
     {
         (yyval.interm.qualifier) = EvqConst;
     }
     break;
 
-  case 107:
+  case 111:
 
     {
         VERTEX_ONLY("attribute", (yyvsp[(1) - (1)].lex).line);
@@ -3539,7 +3617,7 @@
     }
     break;
 
-  case 108:
+  case 112:
 
     {
         ES2_ONLY("varying", (yyvsp[(1) - (1)].lex).line);
@@ -3552,7 +3630,7 @@
     }
     break;
 
-  case 109:
+  case 113:
 
     {
         ES2_ONLY("varying", (yyvsp[(1) - (2)].lex).line);
@@ -3565,14 +3643,14 @@
     }
     break;
 
-  case 110:
+  case 114:
 
     {
         (yyval.interm.type).setBasic(EbtVoid, (yyvsp[(1) - (1)].interm.type).qualifier, (yyvsp[(1) - (1)].interm.type).line);
     }
     break;
 
-  case 111:
+  case 115:
 
     {
         if ((yyvsp[(2) - (2)].interm.type).qualifier == EvqSmoothIn) {
@@ -3612,7 +3690,7 @@
     }
     break;
 
-  case 112:
+  case 116:
 
     {
         context->error((yyvsp[(1) - (1)].interm.type).line, "interpolation qualifier requires a fragment 'in' or vertex 'out' storage qualifier", getInterpolationString((yyvsp[(1) - (1)].interm.type).qualifier));
@@ -3623,7 +3701,7 @@
     }
     break;
 
-  case 113:
+  case 117:
 
     {
         (yyval.interm.type).qualifier = EvqConst;
@@ -3631,43 +3709,43 @@
     }
     break;
 
-  case 114:
+  case 118:
 
     {
-        ES3_ONLY("in", (yyvsp[(1) - (1)].lex).line);
+        ES3_ONLY("in", (yyvsp[(1) - (1)].lex).line, "storage qualifier");
         (yyval.interm.type).qualifier = (context->shaderType == SH_FRAGMENT_SHADER) ? EvqSmoothIn : EvqAttribute;
         (yyval.interm.type).line = (yyvsp[(1) - (1)].lex).line;
     }
     break;
 
-  case 115:
+  case 119:
 
     {
-        ES3_ONLY("out", (yyvsp[(1) - (1)].lex).line);
+        ES3_ONLY("out", (yyvsp[(1) - (1)].lex).line, "storage qualifier");
         (yyval.interm.type).qualifier = (context->shaderType == SH_FRAGMENT_SHADER) ? EvqFragColor : EvqSmoothOut;
         (yyval.interm.type).line = (yyvsp[(1) - (1)].lex).line;
     }
     break;
 
-  case 116:
+  case 120:
 
     {
-        ES3_ONLY("centroid in", (yyvsp[(1) - (2)].lex).line);
+        ES3_ONLY("centroid in", (yyvsp[(1) - (2)].lex).line, "storage qualifier");
         (yyval.interm.type).qualifier = (context->shaderType == SH_FRAGMENT_SHADER) ? EvqCentroidIn : EvqAttribute;
         (yyval.interm.type).line = (yyvsp[(1) - (2)].lex).line;
     }
     break;
 
-  case 117:
+  case 121:
 
     {
-        ES3_ONLY("centroid out", (yyvsp[(1) - (2)].lex).line);
+        ES3_ONLY("centroid out", (yyvsp[(1) - (2)].lex).line, "storage qualifier");
         (yyval.interm.type).qualifier = (context->shaderType == SH_FRAGMENT_SHADER) ? EvqFragColor : EvqCentroidOut;
         (yyval.interm.type).line = (yyvsp[(1) - (2)].lex).line;
     }
     break;
 
-  case 118:
+  case 122:
 
     {
         if (context->globalErrorCheck((yyvsp[(1) - (1)].lex).line, context->symbolTable.atGlobalLevel(), "uniform"))
@@ -3677,7 +3755,7 @@
     }
     break;
 
-  case 119:
+  case 123:
 
     {
         (yyval.interm.type) = (yyvsp[(1) - (1)].interm.type);
@@ -3691,7 +3769,7 @@
     }
     break;
 
-  case 120:
+  case 124:
 
     {
         (yyval.interm.type) = (yyvsp[(2) - (2)].interm.type);
@@ -3699,35 +3777,35 @@
     }
     break;
 
-  case 121:
+  case 125:
 
     {
         (yyval.interm.precision) = EbpHigh;
     }
     break;
 
-  case 122:
+  case 126:
 
     {
         (yyval.interm.precision) = EbpMedium;
     }
     break;
 
-  case 123:
+  case 127:
 
     {
         (yyval.interm.precision) = EbpLow;
     }
     break;
 
-  case 124:
+  case 128:
 
     {
         (yyval.interm.type) = (yyvsp[(1) - (1)].interm.type);
     }
     break;
 
-  case 125:
+  case 129:
 
     {
         (yyval.interm.type) = (yyvsp[(1) - (4)].interm.type);
@@ -3743,44 +3821,11 @@
     }
     break;
 
-  case 126:
-
-    {
-        TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtVoid, qual, (yyvsp[(1) - (1)].lex).line);
-    }
-    break;
-
-  case 127:
-
-    {
-        TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtFloat, qual, (yyvsp[(1) - (1)].lex).line);
-    }
-    break;
-
-  case 128:
-
-    {
-        TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtInt, qual, (yyvsp[(1) - (1)].lex).line);
-    }
-    break;
-
-  case 129:
-
-    {
-        TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtBool, qual, (yyvsp[(1) - (1)].lex).line);
-    }
-    break;
-
   case 130:
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtFloat, qual, (yyvsp[(1) - (1)].lex).line);
-        (yyval.interm.type).setAggregate(2);
+        (yyval.interm.type).setBasic(EbtVoid, qual, (yyvsp[(1) - (1)].lex).line);
     }
     break;
 
@@ -3789,7 +3834,6 @@
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
         (yyval.interm.type).setBasic(EbtFloat, qual, (yyvsp[(1) - (1)].lex).line);
-        (yyval.interm.type).setAggregate(3);
     }
     break;
 
@@ -3797,8 +3841,7 @@
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtFloat, qual, (yyvsp[(1) - (1)].lex).line);
-        (yyval.interm.type).setAggregate(4);
+        (yyval.interm.type).setBasic(EbtInt, qual, (yyvsp[(1) - (1)].lex).line);
     }
     break;
 
@@ -3807,7 +3850,6 @@
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
         (yyval.interm.type).setBasic(EbtBool, qual, (yyvsp[(1) - (1)].lex).line);
-        (yyval.interm.type).setAggregate(2);
     }
     break;
 
@@ -3815,12 +3857,48 @@
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
+        (yyval.interm.type).setBasic(EbtFloat, qual, (yyvsp[(1) - (1)].lex).line);
+        (yyval.interm.type).setAggregate(2);
+    }
+    break;
+
+  case 135:
+
+    {
+        TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
+        (yyval.interm.type).setBasic(EbtFloat, qual, (yyvsp[(1) - (1)].lex).line);
+        (yyval.interm.type).setAggregate(3);
+    }
+    break;
+
+  case 136:
+
+    {
+        TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
+        (yyval.interm.type).setBasic(EbtFloat, qual, (yyvsp[(1) - (1)].lex).line);
+        (yyval.interm.type).setAggregate(4);
+    }
+    break;
+
+  case 137:
+
+    {
+        TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
+        (yyval.interm.type).setBasic(EbtBool, qual, (yyvsp[(1) - (1)].lex).line);
+        (yyval.interm.type).setAggregate(2);
+    }
+    break;
+
+  case 138:
+
+    {
+        TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
         (yyval.interm.type).setBasic(EbtBool, qual, (yyvsp[(1) - (1)].lex).line);
         (yyval.interm.type).setAggregate(3);
     }
     break;
 
-  case 135:
+  case 139:
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
@@ -3829,7 +3907,7 @@
     }
     break;
 
-  case 136:
+  case 140:
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
@@ -3838,7 +3916,7 @@
     }
     break;
 
-  case 137:
+  case 141:
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
@@ -3847,7 +3925,7 @@
     }
     break;
 
-  case 138:
+  case 142:
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
@@ -3856,7 +3934,7 @@
     }
     break;
 
-  case 139:
+  case 143:
 
     {
         FRAG_VERT_ONLY("mat2", (yyvsp[(1) - (1)].lex).line);
@@ -3866,7 +3944,7 @@
     }
     break;
 
-  case 140:
+  case 144:
 
     {
         FRAG_VERT_ONLY("mat3", (yyvsp[(1) - (1)].lex).line);
@@ -3876,7 +3954,7 @@
     }
     break;
 
-  case 141:
+  case 145:
 
     {
         FRAG_VERT_ONLY("mat4", (yyvsp[(1) - (1)].lex).line);
@@ -3886,7 +3964,7 @@
     }
     break;
 
-  case 142:
+  case 146:
 
     {
         FRAG_VERT_ONLY("sampler2D", (yyvsp[(1) - (1)].lex).line);
@@ -3895,7 +3973,7 @@
     }
     break;
 
-  case 143:
+  case 147:
 
     {
         FRAG_VERT_ONLY("samplerCube", (yyvsp[(1) - (1)].lex).line);
@@ -3904,7 +3982,7 @@
     }
     break;
 
-  case 144:
+  case 148:
 
     {
         if (!context->supportsExtension("GL_OES_EGL_image_external")) {
@@ -3917,7 +3995,7 @@
     }
     break;
 
-  case 145:
+  case 149:
 
     {
         if (!context->supportsExtension("GL_ARB_texture_rectangle")) {
@@ -3930,7 +4008,7 @@
     }
     break;
 
-  case 146:
+  case 150:
 
     {
         FRAG_VERT_ONLY("struct", (yyvsp[(1) - (1)].interm.type).line);
@@ -3939,7 +4017,7 @@
     }
     break;
 
-  case 147:
+  case 151:
 
     {
         //
@@ -3953,38 +4031,38 @@
     }
     break;
 
-  case 148:
+  case 152:
 
     { if (context->enterStructDeclaration((yyvsp[(2) - (3)].lex).line, *(yyvsp[(2) - (3)].lex).string)) context->recover(); }
     break;
 
-  case 149:
+  case 153:
 
     {
         (yyval.interm.type) = context->addStructure((yyvsp[(1) - (6)].lex).line, (yyvsp[(2) - (6)].lex).line, *(yyvsp[(2) - (6)].lex).string, (yyvsp[(5) - (6)].interm.typeList));
     }
     break;
 
-  case 150:
+  case 154:
 
     { if (context->enterStructDeclaration((yyvsp[(2) - (2)].lex).line, *(yyvsp[(2) - (2)].lex).string)) context->recover(); }
     break;
 
-  case 151:
+  case 155:
 
     {
         (yyval.interm.type) = context->addStructure((yyvsp[(1) - (5)].lex).line, 0, "", (yyvsp[(4) - (5)].interm.typeList));
     }
     break;
 
-  case 152:
+  case 156:
 
     {
         (yyval.interm.typeList) = (yyvsp[(1) - (1)].interm.typeList);
     }
     break;
 
-  case 153:
+  case 157:
 
     {
         (yyval.interm.typeList) = (yyvsp[(1) - (2)].interm.typeList);
@@ -4000,14 +4078,23 @@
     }
     break;
 
-  case 154:
+  case 158:
 
     {
         (yyval.interm.typeList) = context->addStructDeclaratorList((yyvsp[(1) - (3)].interm.type), (yyvsp[(2) - (3)].interm.typeList));
     }
     break;
 
-  case 155:
+  case 159:
+
+    {
+        // ES3 Only, but errors should be handled elsewhere
+        (yyvsp[(2) - (4)].interm.type).qualifier = (yyvsp[(1) - (4)].interm.type).qualifier;
+        (yyval.interm.typeList) = context->addStructDeclaratorList((yyvsp[(2) - (4)].interm.type), (yyvsp[(3) - (4)].interm.typeList));
+    }
+    break;
+
+  case 160:
 
     {
         (yyval.interm.typeList) = NewPoolTTypeList();
@@ -4015,14 +4102,14 @@
     }
     break;
 
-  case 156:
+  case 161:
 
     {
         (yyval.interm.typeList)->push_back((yyvsp[(3) - (3)].interm.typeLine));
     }
     break;
 
-  case 157:
+  case 162:
 
     {
         if (context->reservedErrorCheck((yyvsp[(1) - (1)].lex).line, *(yyvsp[(1) - (1)].lex).string))
@@ -4034,7 +4121,7 @@
     }
     break;
 
-  case 158:
+  case 163:
 
     {
         if (context->reservedErrorCheck((yyvsp[(1) - (4)].lex).line, *(yyvsp[(1) - (4)].lex).string))
@@ -4051,34 +4138,9 @@
     }
     break;
 
-  case 159:
-
-    { (yyval.interm.intermTypedNode) = (yyvsp[(1) - (1)].interm.intermTypedNode); }
-    break;
-
-  case 160:
-
-    { (yyval.interm.intermNode) = (yyvsp[(1) - (1)].interm.intermNode); }
-    break;
-
-  case 161:
-
-    { (yyval.interm.intermNode) = (yyvsp[(1) - (1)].interm.intermAggregate); }
-    break;
-
-  case 162:
-
-    { (yyval.interm.intermNode) = (yyvsp[(1) - (1)].interm.intermNode); }
-    break;
-
-  case 163:
-
-    { (yyval.interm.intermNode) = (yyvsp[(1) - (1)].interm.intermNode); }
-    break;
-
   case 164:
 
-    { (yyval.interm.intermNode) = (yyvsp[(1) - (1)].interm.intermNode); }
+    { (yyval.interm.intermTypedNode) = (yyvsp[(1) - (1)].interm.intermTypedNode); }
     break;
 
   case 165:
@@ -4088,7 +4150,7 @@
 
   case 166:
 
-    { (yyval.interm.intermNode) = (yyvsp[(1) - (1)].interm.intermNode); }
+    { (yyval.interm.intermNode) = (yyvsp[(1) - (1)].interm.intermAggregate); }
     break;
 
   case 167:
@@ -4098,21 +4160,46 @@
 
   case 168:
 
-    { (yyval.interm.intermAggregate) = 0; }
+    { (yyval.interm.intermNode) = (yyvsp[(1) - (1)].interm.intermNode); }
     break;
 
   case 169:
 
-    { context->symbolTable.push(); }
+    { (yyval.interm.intermNode) = (yyvsp[(1) - (1)].interm.intermNode); }
     break;
 
   case 170:
 
-    { context->symbolTable.pop(); }
+    { (yyval.interm.intermNode) = (yyvsp[(1) - (1)].interm.intermNode); }
     break;
 
   case 171:
 
+    { (yyval.interm.intermNode) = (yyvsp[(1) - (1)].interm.intermNode); }
+    break;
+
+  case 172:
+
+    { (yyval.interm.intermNode) = (yyvsp[(1) - (1)].interm.intermNode); }
+    break;
+
+  case 173:
+
+    { (yyval.interm.intermAggregate) = 0; }
+    break;
+
+  case 174:
+
+    { context->symbolTable.push(); }
+    break;
+
+  case 175:
+
+    { context->symbolTable.pop(); }
+    break;
+
+  case 176:
+
     {
         if ((yyvsp[(3) - (5)].interm.intermAggregate) != 0) {
             (yyvsp[(3) - (5)].interm.intermAggregate)->setOp(EOpSequence);
@@ -4122,44 +4209,44 @@
     }
     break;
 
-  case 172:
-
-    { (yyval.interm.intermNode) = (yyvsp[(1) - (1)].interm.intermNode); }
-    break;
-
-  case 173:
-
-    { (yyval.interm.intermNode) = (yyvsp[(1) - (1)].interm.intermNode); }
-    break;
-
-  case 174:
-
-    { context->symbolTable.push(); }
-    break;
-
-  case 175:
-
-    { context->symbolTable.pop(); (yyval.interm.intermNode) = (yyvsp[(2) - (2)].interm.intermNode); }
-    break;
-
-  case 176:
-
-    { context->symbolTable.push(); }
-    break;
-
   case 177:
 
-    { context->symbolTable.pop(); (yyval.interm.intermNode) = (yyvsp[(2) - (2)].interm.intermNode); }
+    { (yyval.interm.intermNode) = (yyvsp[(1) - (1)].interm.intermNode); }
     break;
 
   case 178:
 
+    { (yyval.interm.intermNode) = (yyvsp[(1) - (1)].interm.intermNode); }
+    break;
+
+  case 179:
+
+    { context->symbolTable.push(); }
+    break;
+
+  case 180:
+
+    { context->symbolTable.pop(); (yyval.interm.intermNode) = (yyvsp[(2) - (2)].interm.intermNode); }
+    break;
+
+  case 181:
+
+    { context->symbolTable.push(); }
+    break;
+
+  case 182:
+
+    { context->symbolTable.pop(); (yyval.interm.intermNode) = (yyvsp[(2) - (2)].interm.intermNode); }
+    break;
+
+  case 183:
+
     {
         (yyval.interm.intermNode) = 0;
     }
     break;
 
-  case 179:
+  case 184:
 
     {
         if ((yyvsp[(2) - (3)].interm.intermAggregate)) {
@@ -4170,31 +4257,31 @@
     }
     break;
 
-  case 180:
+  case 185:
 
     {
         (yyval.interm.intermAggregate) = context->intermediate.makeAggregate((yyvsp[(1) - (1)].interm.intermNode), 0);
     }
     break;
 
-  case 181:
+  case 186:
 
     {
         (yyval.interm.intermAggregate) = context->intermediate.growAggregate((yyvsp[(1) - (2)].interm.intermAggregate), (yyvsp[(2) - (2)].interm.intermNode), 0);
     }
     break;
 
-  case 182:
+  case 187:
 
     { (yyval.interm.intermNode) = 0; }
     break;
 
-  case 183:
+  case 188:
 
     { (yyval.interm.intermNode) = static_cast<TIntermNode*>((yyvsp[(1) - (2)].interm.intermTypedNode)); }
     break;
 
-  case 184:
+  case 189:
 
     {
         if (context->boolErrorCheck((yyvsp[(1) - (5)].lex).line, (yyvsp[(3) - (5)].interm.intermTypedNode)))
@@ -4203,7 +4290,7 @@
     }
     break;
 
-  case 185:
+  case 190:
 
     {
         (yyval.interm.nodePair).node1 = (yyvsp[(1) - (3)].interm.intermNode);
@@ -4211,7 +4298,7 @@
     }
     break;
 
-  case 186:
+  case 191:
 
     {
         (yyval.interm.nodePair).node1 = (yyvsp[(1) - (1)].interm.intermNode);
@@ -4219,7 +4306,7 @@
     }
     break;
 
-  case 187:
+  case 192:
 
     {
         (yyval.interm.intermTypedNode) = (yyvsp[(1) - (1)].interm.intermTypedNode);
@@ -4228,7 +4315,7 @@
     }
     break;
 
-  case 188:
+  case 193:
 
     {
         TIntermNode* intermNode;
@@ -4246,12 +4333,12 @@
     }
     break;
 
-  case 189:
+  case 194:
 
     { context->symbolTable.push(); ++context->loopNestingLevel; }
     break;
 
-  case 190:
+  case 195:
 
     {
         context->symbolTable.pop();
@@ -4260,12 +4347,12 @@
     }
     break;
 
-  case 191:
+  case 196:
 
     { ++context->loopNestingLevel; }
     break;
 
-  case 192:
+  case 197:
 
     {
         if (context->boolErrorCheck((yyvsp[(8) - (8)].lex).line, (yyvsp[(6) - (8)].interm.intermTypedNode)))
@@ -4276,12 +4363,12 @@
     }
     break;
 
-  case 193:
+  case 198:
 
     { context->symbolTable.push(); ++context->loopNestingLevel; }
     break;
 
-  case 194:
+  case 199:
 
     {
         context->symbolTable.pop();
@@ -4290,35 +4377,35 @@
     }
     break;
 
-  case 195:
+  case 200:
 
     {
         (yyval.interm.intermNode) = (yyvsp[(1) - (1)].interm.intermNode);
     }
     break;
 
-  case 196:
+  case 201:
 
     {
         (yyval.interm.intermNode) = (yyvsp[(1) - (1)].interm.intermNode);
     }
     break;
 
-  case 197:
+  case 202:
 
     {
         (yyval.interm.intermTypedNode) = (yyvsp[(1) - (1)].interm.intermTypedNode);
     }
     break;
 
-  case 198:
+  case 203:
 
     {
         (yyval.interm.intermTypedNode) = 0;
     }
     break;
 
-  case 199:
+  case 204:
 
     {
         (yyval.interm.nodePair).node1 = (yyvsp[(1) - (2)].interm.intermTypedNode);
@@ -4326,7 +4413,7 @@
     }
     break;
 
-  case 200:
+  case 205:
 
     {
         (yyval.interm.nodePair).node1 = (yyvsp[(1) - (3)].interm.intermTypedNode);
@@ -4334,7 +4421,7 @@
     }
     break;
 
-  case 201:
+  case 206:
 
     {
         if (context->loopNestingLevel <= 0) {
@@ -4345,7 +4432,7 @@
     }
     break;
 
-  case 202:
+  case 207:
 
     {
         if (context->loopNestingLevel <= 0) {
@@ -4356,7 +4443,7 @@
     }
     break;
 
-  case 203:
+  case 208:
 
     {
         (yyval.interm.intermNode) = context->intermediate.addBranch(EOpReturn, (yyvsp[(1) - (2)].lex).line);
@@ -4367,7 +4454,7 @@
     }
     break;
 
-  case 204:
+  case 209:
 
     {
         (yyval.interm.intermNode) = context->intermediate.addBranch(EOpReturn, (yyvsp[(2) - (3)].interm.intermTypedNode), (yyvsp[(1) - (3)].lex).line);
@@ -4382,7 +4469,7 @@
     }
     break;
 
-  case 205:
+  case 210:
 
     {
         FRAG_ONLY("discard", (yyvsp[(1) - (2)].lex).line);
@@ -4390,7 +4477,7 @@
     }
     break;
 
-  case 206:
+  case 211:
 
     {
         (yyval.interm.intermNode) = (yyvsp[(1) - (1)].interm.intermNode);
@@ -4398,7 +4485,7 @@
     }
     break;
 
-  case 207:
+  case 212:
 
     {
         (yyval.interm.intermNode) = context->intermediate.growAggregate((yyvsp[(1) - (2)].interm.intermNode), (yyvsp[(2) - (2)].interm.intermNode), 0);
@@ -4406,21 +4493,21 @@
     }
     break;
 
-  case 208:
+  case 213:
 
     {
         (yyval.interm.intermNode) = (yyvsp[(1) - (1)].interm.intermNode);
     }
     break;
 
-  case 209:
+  case 214:
 
     {
         (yyval.interm.intermNode) = (yyvsp[(1) - (1)].interm.intermNode);
     }
     break;
 
-  case 210:
+  case 215:
 
     {
         TFunction* function = (yyvsp[(1) - (1)].interm).function;
@@ -4509,7 +4596,7 @@
     }
     break;
 
-  case 211:
+  case 216:
 
     {
         //?? Check that all paths return a value if return type != void ?
diff --git a/src/compiler/intermediate.h b/src/compiler/intermediate.h
index 8e76ef9..6834c84 100644
--- a/src/compiler/intermediate.h
+++ b/src/compiler/intermediate.h
@@ -85,6 +85,7 @@
     EOpIndexDirect,
     EOpIndexIndirect,
     EOpIndexDirectStruct,
+    EOpIndexDirectInterfaceBlock,
 
     EOpVectorSwizzle,