final public VariationPart VariationPart() throws ParseException {
    Token variation_t;
    Identifier identifier;
    SyntaxPart syntax;
    NodeOptional syntax_option = new NodeOptional();
    WriteSyntaxPart write_syntax;
    NodeOptional write_syntax_option = new NodeOptional();
    AccessPart access;
    NodeOptional access_option = new NodeOptional();
    Token creation_t;
    NodeList list;
    NodeOptional creation_option = new NodeOptional();
    DefValPart defval;
    DescriptionPart description;
    Recovery next = new Recovery();
    next.push(DESCRIPTION_T);
    next.push(DEFVAL_T);
    next.push(CREATION_REQUIRES_T);
    next.push(ACCESS_T);
    next.push(WRITE_SYNTAX_T);
    next.push(SYNTAX_T);
    variation_t = jj_consume_token(VARIATION_T);
    try {
      identifier = ValueIdentifier();
    } catch (ParseException e) {
        handleError(e, next, "<value identifier>");
        identifier = Identifier.Value(makeNodeToken(VALUE_IDENTIFIER_T));
    } finally {
        next.pop(); /* SYNTAX_T */

    }
    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
    case SYNTAX_T:
      syntax = SyntaxPart(next);
          syntax_option.addNode(syntax);
      break;
    default:
      jj_la1[34] = jj_gen;
      ;
    }
        next.pop(); /* WRITE_SYNTAX_T */

    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
    case WRITE_SYNTAX_T:
      write_syntax = WriteSyntaxPart(next);
          write_syntax_option.addNode(write_syntax);
      break;
    default:
      jj_la1[35] = jj_gen;
      ;
    }
        next.pop(); /* ACCESS_T */

    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
    case ACCESS_T:
    case MAX_ACCESS_T:
    case MIN_ACCESS_T:
      access = AccessPart(ACCESS_T, next);
          access_option.addNode(access);
      break;
    default:
      jj_la1[36] = jj_gen;
      ;
    }
        next.pop(); /* CREATION_REQUIRES_T */

    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
    case CREATION_REQUIRES_T:
      creation_t = jj_consume_token(CREATION_REQUIRES_T);
      list = BracedValueList(next);
          creation_option.addNode(list);
      break;
    default:
      jj_la1[37] = jj_gen;
      ;
    }
        next.pop(); /* DEFVAL_T */

    defval = DefValPart(next);
        next.pop(); /* DESCRIPTION_T */

    description = DescriptionPart(next);
      {if (true) return new VariationPart(identifier,
                            syntax_option,
                            write_syntax_option,
                            access_option,
                            creation_option,
                            defval,
                            description);}
    throw new Error("Missing return statement in function");
  }