private Result pEnumerationTypeSpecifier(final int yyStart) 
    throws IOException {

    Result     yyResult;
    int        yyBase;
    int        yyOption1;
    Object     yyOpValue1;
    Node       yyValue;
    ParseError yyError = ParseError.DUMMY;

    // Alternative 1.

    yyResult = pKeyword(yyStart);
    if (yyResult.hasValue("enum")) {

      yyOption1  = yyResult.index;
      yyOpValue1 = null;

      yyResult = pAttributeSpecifierList(yyOption1);
      yyError  = yyResult.select(yyError, yyOption1);
      if (yyResult.hasValue()) {
        final Node v$el$1 = yyResult.semanticValue();

        yyOption1  = yyResult.index;
        yyOpValue1 = v$el$1;
      }
      { // Start scope for v$g$1.
        final Node v$g$1 = cast(yyOpValue1);

        final int yyChoice1 = yyOption1;

        // Nested alternative 1.

        yyOption1  = yyChoice1;
        yyOpValue1 = null;

        yyResult = pIdentifier(yyOption1);
        yyError  = yyResult.select(yyError, yyOption1);
        if (yyResult.hasValue()) {
          final String v$el$2 = yyResult.semanticValue();

          yyOption1  = yyResult.index;
          yyOpValue1 = v$el$2;
        }
        { // Start scope for v$g$2.
          final String v$g$2 = cast(yyOpValue1);

          yyBase   = yyOption1;
          yyResult = pSymbol(yyBase);
          if (yyResult.hasValue("{")) {

            yyResult = pEnumeratorList(yyResult.index);
            yyError  = yyResult.select(yyError);
            if (yyResult.hasValue()) {
              final Node v$g$3 = yyResult.semanticValue();

              yyOption1  = yyResult.index;

              yyBase   = yyOption1;
              yyResult = pSymbol(yyBase);
              if (yyResult.hasValue(",")) {

                yyOption1  = yyResult.index;
              } else {
                yyError = yyError.select("',' expected", yyBase);
              }

              yyBase   = yyOption1;
              yyResult = pSymbol(yyBase);
              if (yyResult.hasValue("}")) {

                yyOption1  = yyResult.index;
                yyOpValue1 = null;

                yyResult = pAttributeSpecifierList(yyOption1);
                yyError  = yyResult.select(yyError, yyOption1);
                if (yyResult.hasValue()) {
                  final Node v$el$3 = yyResult.semanticValue();

                  yyOption1  = yyResult.index;
                  yyOpValue1 = v$el$3;
                }
                { // Start scope for v$g$4.
                  final Node v$g$4 = cast(yyOpValue1);

                  yyValue = GNode.create("EnumerationTypeDefinition", v$g$1, v$g$2, v$g$3, v$g$4);
                  yyValue.setLocation(location(yyStart));

                  return new SemanticValue(yyValue, yyOption1, yyError);
                } // End scope for v$g$4.
              } else {
                yyError = yyError.select("'}' expected", yyBase);
              }
            }
          } else {
            yyError = yyError.select("'{' expected", yyBase);
          }
        } // End scope for v$g$2.

        // Nested alternative 2.

        yyResult = pIdentifier(yyChoice1);
        yyError  = yyResult.select(yyError);
        if (yyResult.hasValue()) {
          final String v$g$2 = yyResult.semanticValue();

          yyValue = GNode.create("EnumerationTypeReference", v$g$1, v$g$2);
          yyValue.setLocation(location(yyStart));

          return yyResult.createValue(yyValue, yyError);
        }
      } // End scope for v$g$1.
    }

    // Done.
    yyError = yyError.select("enumeration type specifier expected", yyStart);
    return yyError;
  }