moved -DASN_PDU_COLLECTION into compiler


git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1200 59561ff5-6e30-0410-9f3c-9617f08c8826
diff --git a/examples/sample.makefile.regen b/examples/sample.makefile.regen
index f34f0a2..ba03514 100755
--- a/examples/sample.makefile.regen
+++ b/examples/sample.makefile.regen
@@ -23,8 +23,6 @@
 	exit
 fi
 
-ASN1DEFPDU=`echo "$ASN1PDU" | tr - _`
-
 ../../asn1c/asn1c -S ../../skeletons ${ASN1CMDOPTS} ${ASN1MODULES} || exit $?
 
 if test ! -f Makefile.am.sample ; then
@@ -32,20 +30,15 @@
 	exit 1
 fi
 
-CFLAGS=""
-
+ASN1DEFPDU=`echo "$ASN1PDU" | tr - _`
+CFLAGS="-DPDU=${ASN1DEFPDU}"
 if test -f config.h ; then
-	CFLAGS="$CFLAGS -DHAVE_CONFIG_H"
-fi
-
-FIXEDPDU=`echo "[$ASN1CMDOPTS]" | sed -e "s/.*-pdu=auto.*//"`
-if test ! "$FIXEDPDU" ; then
-	CFLAGS="$CFLAGS -DASN_PDU_COLLECTION"
+	CFLAGS="-DHAVE_CONFIG_H $CFLAGS"
 fi
 
 set -x
 cat Makefile.am.sample						\
-	| sed -e "s/^CFLAGS.*/CFLAGS +=$CFLAGS -DPDU=${ASN1DEFPDU} -I./" \
+	| sed -e "s/^CFLAGS += /CFLAGS += ${CFLAGS} /"		\
 	| sed -e "s/^all: /all: ${ASN1PDU}.c /"			\
 	| sed -e "s/progname/${PROGNAME}/"			\
 	> Makefile.$$
diff --git a/examples/sample.source.RRC/Makefile b/examples/sample.source.RRC/Makefile
index db38e98..717e734 100644
--- a/examples/sample.source.RRC/Makefile
+++ b/examples/sample.source.RRC/Makefile
@@ -4740,7 +4740,7 @@
 # This file may be used as an input for make(3)
 # Remove the lines below to convert it into a pure .am file
 TARGET = rrc-dump
-CFLAGS += -DHAVE_CONFIG_H -DASN_PDU_COLLECTION -DPDU=DL_DCCH_Message -I.
+CFLAGS += -DHAVE_CONFIG_H -DPDU=DL_DCCH_Message -DASN_PDU_COLLECTION -I.
 OBJS=${ASN_MODULE_SOURCES:.c=.o} ${ASN_CONVERTER_SOURCES:.c=.o}
 
 all: DL-DCCH-Message.c $(TARGET)
diff --git a/libasn1compiler/asn1c_save.c b/libasn1compiler/asn1c_save.c
index 3e467af..06fc97d 100644
--- a/libasn1compiler/asn1c_save.c
+++ b/libasn1compiler/asn1c_save.c
@@ -135,7 +135,7 @@
 		"# This file may be used as an input for make(3)\n"
 		"# Remove the lines below to convert it into a pure .am file\n"
 		"TARGET = progname\n"
-		"CFLAGS += -I.\n"
+		"CFLAGS +=%s -I.\n"
 		"OBJS=${ASN_MODULE_SOURCES:.c=.o}"
 		  " ${ASN_CONVERTER_SOURCES:.c=.o}\n"
 		"\nall: $(TARGET)\n"
@@ -150,6 +150,7 @@
 		"\n\trm -f $(OBJS)\n"
 		"\nregen: regenerate-from-asn1-source\n"
 		"\nregenerate-from-asn1-source:\n\t"
+		, (arg->flags & A1C_PDU_AUTO) ? " -DASN_PDU_COLLECTION" : ""
 	);
 
 	for(i = 0; i < argc; i++)
diff --git a/libasn1fix/asn1fix_class.c b/libasn1fix/asn1fix_class.c
index bf35719..32ad896 100644
--- a/libasn1fix/asn1fix_class.c
+++ b/libasn1fix/asn1fix_class.c
@@ -65,7 +65,7 @@
 		if(TQ_FIRST(&classfield->members)) {
 			/* Already have something */
 		} else {
-			expr = asn1p_expr_new(classfield->_lineno);
+			expr = asn1p_expr_new(classfield->_lineno, mod);
 			expr->expr_type = ASN_TYPE_ANY;
 			expr->meta_type = AMT_TYPE;
 			asn1p_expr_add(classfield, expr);
diff --git a/libasn1fix/asn1fix_constr.c b/libasn1fix/asn1fix_constr.c
index 353473d..0421a52 100644
--- a/libasn1fix/asn1fix_constr.c
+++ b/libasn1fix/asn1fix_constr.c
@@ -152,7 +152,7 @@
 
 	if(arg->mod->module_flags & MSF_EXTENSIBILITY_IMPLIED
 	&& ext_count == 0) {
-		v = asn1p_expr_new(0);
+		v = asn1p_expr_new(0, arg->mod);
 		if(v) {
 			v->Identifier = strdup("...");
 			v->expr_type = A1TC_EXTENSIBLE;
diff --git a/libasn1fix/asn1fix_constraint_compat.c b/libasn1fix/asn1fix_constraint_compat.c
index 96bd042..954d5f5 100644
--- a/libasn1fix/asn1fix_constraint_compat.c
+++ b/libasn1fix/asn1fix_constraint_compat.c
@@ -87,6 +87,14 @@
 		return 0;
 	case ACT_CT_CTDBY:
 		return 1;
+	case ACT_CT_CTNG:	/* X.682, #11 */
+		switch(expr_type) {
+		case ASN_BASIC_OCTET_STRING:
+		case ASN_BASIC_BIT_STRING:
+			return 1;
+		default:
+			return 0;
+		}
 	case ACT_CA_SET:
 	case ACT_CA_CRC:
 	case ACT_CA_CSV:
diff --git a/libasn1fix/asn1fix_cws.c b/libasn1fix/asn1fix_cws.c
index b545711..8931a92 100644
--- a/libasn1fix/asn1fix_cws.c
+++ b/libasn1fix/asn1fix_cws.c
@@ -192,7 +192,7 @@
 				FATAL("Value %s at line %d is too large for this compiler! Contact the asn1c author.\n", p, arg->expr->_lineno);
 				return -1;
 			}
-			expr = asn1p_expr_new(arg->expr->_lineno);
+			expr = asn1p_expr_new(arg->expr->_lineno, arg->expr->module);
 			expr->Identifier = p;
 			expr->meta_type = AMT_VALUE; 
 			expr->expr_type = ASN_BASIC_INTEGER;
diff --git a/libasn1fix/asn1fix_misc.c b/libasn1fix/asn1fix_misc.c
index 4af0fd8..69d08bd 100644
--- a/libasn1fix/asn1fix_misc.c
+++ b/libasn1fix/asn1fix_misc.c
@@ -81,6 +81,8 @@
 		/* Buffer is guaranteed to be null-terminated */
 		assert(v->value.string.buf[v->value.string.size] == '\0');
 		return (char *)v->value.string.buf;
+	case ATV_TYPE:
+		return "<Type>";
 	case ATV_BITVECTOR:
 		{
 			uint8_t *bitvector;
diff --git a/libasn1parser/asn1p_constr.c b/libasn1parser/asn1p_constr.c
index 7aa464e..ee8d1eb 100644
--- a/libasn1parser/asn1p_constr.c
+++ b/libasn1parser/asn1p_constr.c
@@ -169,6 +169,8 @@
 		return "MultipleTypeConstraints";
 	case ACT_CT_CTDBY:
 		return "UserDefinedConstraint";
+	case ACT_CT_CTNG:
+		return "ContentsConstraint";
 	case ACT_CA_SET:
 		return "SET";
 	case ACT_CA_CRC:
diff --git a/libasn1parser/asn1p_constr.h b/libasn1parser/asn1p_constr.h
index 912fd8f..bb6ba32 100644
--- a/libasn1parser/asn1p_constr.h
+++ b/libasn1parser/asn1p_constr.h
@@ -26,11 +26,12 @@
 		ACT_CT_WCOMP,		/* WITH COMPONENT */
 		ACT_CT_WCOMPS,		/* WITH COMPONENTS */
 		ACT_CT_CTDBY,		/* CONSTRAINED BY */
+		ACT_CT_CTNG,		/* CONTAINING Type */
 		/*
 		 * Arrays of constraints.
 		 */
 		ACT_CA_SET,		/* A set of constraints: (c1)(c2) */
-		ACT_CA_CRC,		/* Comp. relation c-t: ({a})({@b}) */
+		ACT_CA_CRC,		/* Comp. relation c-t: ({a}{@b}) */
 		ACT_CA_CSV,		/* Comma-separated constraints array */
 		ACT_CA_UNI,		/* UNION (|) */
 		ACT_CA_INT,		/* INTERSECTION (^) */
diff --git a/libasn1parser/asn1p_expr.c b/libasn1parser/asn1p_expr.c
index 29919a1..8760066 100644
--- a/libasn1parser/asn1p_expr.c
+++ b/libasn1parser/asn1p_expr.c
@@ -13,13 +13,14 @@
  * Construct a new empty types collection.
  */
 asn1p_expr_t *
-asn1p_expr_new(int _lineno) {
+asn1p_expr_new(int _lineno, asn1p_module_t *mod) {
 	asn1p_expr_t *expr;
 
 	expr = calloc(1, sizeof *expr);
 	if(expr) {
 		TQ_INIT(&(expr->members));
 		expr->spec_index = -1;
+		expr->module = mod;
 		expr->_lineno = _lineno;
 	}
 
@@ -96,7 +97,7 @@
 			return NULL;	/* Hard error */
 		}
 	}
-	if(!clone) clone = asn1p_expr_new(expr->_lineno);
+	if(!clone) clone = asn1p_expr_new(expr->_lineno, expr->module);
 	if(!clone) return NULL;
 
 	/*
@@ -106,7 +107,6 @@
 	CLCOPY(expr_type);
 	CLCOPY(tag);
 	CLCOPY(marker.flags);		/* OPTIONAL/DEFAULT */
-	CLCOPY(module);
 	CLCOPY(_mark);
 
 	clone->data = 0;	/* Do not clone this */
@@ -165,7 +165,7 @@
 	}
 
 	ref = value->value.reference;
-	tmpexpr = asn1p_expr_new(ref->_lineno);
+	tmpexpr = asn1p_expr_new(ref->_lineno, 0);
 	tmpexpr->meta_type = AMT_TYPEREF;
 	tmpexpr->expr_type = A1TC_REFERENCE;
 	tmpexpr->reference = ref;
diff --git a/libasn1parser/asn1p_expr.h b/libasn1parser/asn1p_expr.h
index 32645ef..babe53f 100644
--- a/libasn1parser/asn1p_expr.h
+++ b/libasn1parser/asn1p_expr.h
@@ -271,7 +271,7 @@
 /*
  * Constructor and destructor.
  */
-asn1p_expr_t *asn1p_expr_new(int _lineno);
+asn1p_expr_t *asn1p_expr_new(int _lineno, struct asn1p_module_s *);
 asn1p_expr_t *asn1p_expr_clone(asn1p_expr_t *, int skip_extensions);
 asn1p_expr_t *asn1p_expr_clone_with_resolver(asn1p_expr_t *,
 	asn1p_expr_t *(*resolver)(asn1p_expr_t *to_resolve, void *resolver_arg),
diff --git a/libasn1parser/asn1p_module.c b/libasn1parser/asn1p_module.c
index 8a47df6..d030da7 100644
--- a/libasn1parser/asn1p_module.c
+++ b/libasn1parser/asn1p_module.c
@@ -12,8 +12,8 @@
 
 	mod = calloc(1, sizeof *mod);
 	if(mod) {
-		TQ_INIT(&(mod->imports));
 		TQ_INIT(&(mod->exports));
+		TQ_INIT(&(mod->imports));
 		TQ_INIT(&(mod->members));
 	}
 	return mod;
diff --git a/libasn1parser/asn1p_module.h b/libasn1parser/asn1p_module.h
index ad9eab0..25dcf1e 100644
--- a/libasn1parser/asn1p_module.h
+++ b/libasn1parser/asn1p_module.h
@@ -4,6 +4,18 @@
 #ifndef	ASN1_PARSER_MODULE_H
 #define	ASN1_PARSER_MODULE_H
 
+struct asn1p_module_s;
+
+/*
+ * A simple container for several modules.
+ */
+typedef struct asn1p_s {
+	TQ_HEAD(struct asn1p_module_s)	modules;
+} asn1p_t;
+
+asn1p_t *asn1p_new(void);
+void asn1p_delete(asn1p_t *asn);
+
 /*
  * Flags specific to a module.
  */
@@ -71,6 +83,9 @@
 	TQ_ENTRY(struct asn1p_module_s)
 		mod_next;
 
+	/* All modules */
+	asn1p_t *asn1p;
+
 	/*
 	 * Internally useful properties.
 	 */
@@ -85,15 +100,4 @@
 asn1p_module_t *asn1p_module_new(void);
 void asn1p_module_free(asn1p_module_t *mod);
 
-/*
- * No more than a container for several modules.
- */
-typedef struct asn1p_s {
-	TQ_HEAD(struct asn1p_module_s)	modules;
-} asn1p_t;
-
-asn1p_t *asn1p_new(void);
-void asn1p_delete(asn1p_t *asn);
-
-
 #endif	/* ASN1_PARSER_MODULE_H */
diff --git a/libasn1parser/asn1p_value.c b/libasn1parser/asn1p_value.c
index cafc1f9..63c80c7 100644
--- a/libasn1parser/asn1p_value.c
+++ b/libasn1parser/asn1p_value.c
@@ -133,6 +133,16 @@
 }
 
 asn1p_value_t *
+asn1p_value_fromtype(asn1p_expr_t *expr) {
+	asn1p_value_t *v = calloc(1, sizeof *v);
+	if(v) {
+		v->value.v_type = expr;
+		v->type = ATV_TYPE;
+	}
+	return v;
+}
+
+asn1p_value_t *
 asn1p_value_clone(asn1p_value_t *v) {
 	return asn1p_value_clone_with_resolver(v, 0, 0);
 }
@@ -149,6 +159,8 @@
 			return calloc(1, sizeof(*clone));
 		case ATV_REAL:
 			return asn1p_value_fromdouble(v->value.v_double);
+		case ATV_TYPE:
+			return asn1p_value_fromtype(v->value.v_type);
 		case ATV_INTEGER:
 		case ATV_MIN:
 		case ATV_MAX:
@@ -213,6 +225,9 @@
 		case ATV_NOVALUE:
 		case ATV_NULL:
 			break;
+		case ATV_TYPE:
+			asn1p_expr_free(v->value.v_type);
+			break;
 		case ATV_REAL:
 		case ATV_INTEGER:
 		case ATV_MIN:
diff --git a/libasn1parser/asn1p_value.h b/libasn1parser/asn1p_value.h
index 1b5bbee..c260c27 100644
--- a/libasn1parser/asn1p_value.h
+++ b/libasn1parser/asn1p_value.h
@@ -5,6 +5,7 @@
 #define	ASN1_PARSER_VALUE_H
 
 struct asn1p_constraint_s;	/* Forward declaration */
+struct asn1p_expr_s;
 
 /*
  * A wrapper around various kinds of values.
@@ -15,6 +16,7 @@
 	 */
 	enum {
 		ATV_NOVALUE,
+		ATV_TYPE,	/* A type (as in CONTAINING Type) */
 		ATV_NULL,	/* A "NULL" value of type NULL. */
 		ATV_REAL,	/* A constant floating-point value */
 		ATV_INTEGER,	/* An integer constant */
@@ -34,6 +36,7 @@
 
 	union {
 		struct asn1p_constraint_s *constraint;	/* ValueSet */
+		struct asn1p_expr_s	*v_type;	/* Type */
 		asn1p_ref_t	*reference;
 		asn1c_integer_t	 v_integer;
 		double		 v_double;
@@ -68,6 +71,7 @@
 asn1p_value_t *asn1p_value_frombuf(char *buffer, int size, int do_copy);
 asn1p_value_t *asn1p_value_fromdouble(double);
 asn1p_value_t *asn1p_value_fromint(asn1c_integer_t);
+asn1p_value_t *asn1p_value_fromtype(struct asn1p_expr_s *);
 asn1p_value_t *asn1p_value_clone(asn1p_value_t *);
 asn1p_value_t *asn1p_value_clone_with_resolver(asn1p_value_t *,
 		asn1p_value_t *(*resolver)(asn1p_value_t *, void *rarg),
diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c
index d1105a5..9519596 100644
--- a/libasn1parser/asn1p_y.c
+++ b/libasn1parser/asn1p_y.c
@@ -312,6 +312,9 @@
 static asn1p_value_t *_convert_bitstring2binary(char *str, int base);
 static void _fixup_anonymous_identifier(asn1p_expr_t *expr);
 
+static asn1p_module_t *currentModule;
+#define	NEW_EXPR()	(asn1p_expr_new(yylineno, currentModule))
+
 #define	checkmem(ptr)	do {						\
 		if(!(ptr))						\
 		return yyerror("Memory failure");			\
@@ -365,7 +368,7 @@
 #endif
 
 #ifndef YYSTYPE
-#line 85 "asn1p_y.y"
+#line 88 "asn1p_y.y"
 typedef union {
 	asn1p_t			*a_grammar;
 	asn1p_module_flags_e	 a_module_flags;
@@ -401,7 +404,7 @@
 	} tv_nametag;
 } yystype;
 /* Line 193 of /usr/local/share/bison/yacc.c.  */
-#line 405 "asn1p_y.c"
+#line 408 "asn1p_y.c"
 # define YYSTYPE yystype
 # define YYSTYPE_IS_TRIVIAL 1
 #endif
@@ -422,7 +425,7 @@
 
 
 /* Line 213 of /usr/local/share/bison/yacc.c.  */
-#line 426 "asn1p_y.c"
+#line 429 "asn1p_y.c"
 
 #if ! defined (yyoverflow) || YYERROR_VERBOSE
 
@@ -520,16 +523,16 @@
 
 /* YYFINAL -- State number of the termination state. */
 #define YYFINAL  7
-#define YYLAST   816
+#define YYLAST   834
 
 /* YYNTOKENS -- Number of terminals. */
 #define YYNTOKENS  121
 /* YYNNTS -- Number of nonterminals. */
-#define YYNNTS  112
+#define YYNNTS  117
 /* YYNRULES -- Number of rules. */
-#define YYNRULES  296
+#define YYNRULES  302
 /* YYNRULES -- Number of states. */
-#define YYNSTATES  453
+#define YYNSTATES  462
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
@@ -585,160 +588,163 @@
    YYRHS.  */
 static const unsigned short yyprhs[] =
 {
-       0,     0,     3,     5,     7,    10,    19,    20,    22,    26,
-      29,    31,    34,    36,    41,    43,    44,    46,    48,    51,
-      54,    57,    60,    63,    66,    67,    69,    73,    75,    78,
-      80,    82,    84,    85,    89,    91,    92,    94,    98,   101,
-     103,   106,   107,   109,   114,   116,   120,   122,   126,   128,
-     129,   131,   135,   139,   142,   144,   148,   150,   154,   156,
-     160,   165,   167,   169,   174,   178,   182,   189,   196,   198,
-     202,   204,   208,   212,   216,   220,   222,   226,   228,   230,
-     232,   234,   235,   237,   239,   243,   247,   250,   254,   256,
-     258,   262,   265,   267,   269,   275,   276,   278,   280,   284,
-     287,   292,   296,   300,   304,   308,   312,   313,   315,   316,
-     323,   325,   328,   330,   332,   334,   338,   340,   344,   348,
-     352,   353,   356,   358,   363,   368,   373,   380,   387,   389,
-     394,   398,   400,   404,   408,   412,   414,   418,   420,   424,
-     426,   428,   430,   432,   436,   440,   442,   447,   449,   451,
-     455,   456,   460,   462,   464,   466,   468,   470,   472,   474,
-     476,   480,   482,   484,   486,   488,   491,   493,   495,   497,
-     499,   502,   505,   507,   509,   512,   515,   517,   519,   521,
-     523,   525,   528,   530,   533,   535,   537,   539,   541,   543,
+       0,     0,     3,     5,     7,    10,    11,    21,    22,    24,
+      28,    31,    33,    36,    38,    43,    45,    46,    48,    50,
+      53,    56,    59,    62,    65,    68,    69,    71,    75,    77,
+      80,    82,    84,    86,    87,    91,    93,    94,    96,   100,
+     103,   105,   108,   109,   111,   116,   118,   122,   124,   128,
+     130,   131,   133,   137,   141,   144,   146,   150,   152,   156,
+     158,   162,   167,   169,   171,   176,   180,   184,   191,   198,
+     200,   204,   206,   210,   214,   218,   222,   224,   228,   230,
+     232,   234,   236,   237,   239,   241,   245,   249,   252,   256,
+     258,   260,   264,   267,   269,   271,   277,   278,   280,   282,
+     286,   289,   294,   298,   302,   306,   310,   314,   315,   317,
+     318,   325,   327,   330,   332,   334,   336,   340,   342,   346,
+     350,   354,   355,   358,   360,   365,   370,   375,   382,   389,
+     391,   396,   400,   402,   406,   410,   414,   416,   420,   422,
+     426,   428,   430,   432,   434,   438,   442,   444,   449,   451,
+     453,   457,   458,   462,   464,   466,   468,   470,   472,   474,
+     476,   478,   482,   484,   486,   488,   490,   493,   495,   497,
+     499,   501,   504,   507,   509,   511,   514,   517,   519,   521,
+     523,   525,   527,   530,   532,   535,   537,   539,   541,   543,
      545,   547,   549,   551,   553,   555,   557,   559,   561,   563,
-     565,   567,   569,   571,   572,   574,   576,   581,   585,   590,
-     592,   594,   598,   604,   606,   610,   614,   618,   622,   627,
-     631,   633,   635,   639,   643,   647,   651,   653,   655,   656,
-     662,   664,   667,   670,   674,   676,   678,   680,   682,   684,
-     686,   688,   690,   694,   700,   702,   706,   708,   712,   713,
-     715,   717,   719,   721,   723,   725,   729,   734,   736,   740,
-     743,   747,   749,   753,   754,   756,   758,   761,   764,   768,
-     770,   774,   776,   781,   786,   788,   790,   792,   794,   796,
-     798,   799,   801,   804,   809,   810,   812,   814,   816,   817,
-     819,   821,   823,   825,   827,   828,   830
+     565,   567,   569,   571,   573,   574,   576,   578,   582,   584,
+     589,   593,   598,   600,   602,   606,   612,   614,   618,   622,
+     626,   630,   635,   639,   641,   643,   647,   651,   655,   659,
+     661,   663,   665,   667,   669,   671,   673,   675,   677,   681,
+     687,   689,   693,   695,   699,   700,   702,   704,   706,   708,
+     710,   712,   714,   715,   721,   724,   726,   729,   732,   736,
+     738,   740,   744,   749,   751,   755,   758,   762,   764,   768,
+     769,   771,   773,   776,   779,   783,   785,   789,   791,   796,
+     801,   803,   805,   807,   809,   811,   813,   814,   816,   819,
+     824,   825,   827,   829,   831,   832,   834,   836,   838,   840,
+     842,   843,   845
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS. */
 static const short yyrhs[] =
 {
      122,     0,    -1,   123,    -1,   124,    -1,   123,   124,    -1,
-     229,   125,    39,   129,     3,    26,   132,    44,    -1,    -1,
-     126,    -1,   108,   127,   109,    -1,   108,   109,    -1,   128,
-      -1,   127,   128,    -1,   232,    -1,   232,   110,    10,   111,
-      -1,    10,    -1,    -1,   130,    -1,   131,    -1,   130,   131,
-      -1,    46,    89,    -1,    57,    89,    -1,    25,    89,    -1,
-      48,    58,    -1,    16,    62,    -1,    -1,   133,    -1,   144,
-     137,   134,    -1,   135,    -1,   134,   135,    -1,   151,    -1,
-     181,    -1,   149,    -1,    -1,    43,    16,   136,    -1,   191,
-      -1,    -1,   138,    -1,    59,   139,   112,    -1,    59,    51,
-      -1,   141,    -1,   139,   141,    -1,    -1,   126,    -1,   142,
-      51,   229,   140,    -1,   143,    -1,   142,   113,   143,    -1,
-     229,    -1,   229,   108,   109,    -1,   232,    -1,    -1,   145,
-      -1,    47,   146,   112,    -1,    47,    22,   112,    -1,    47,
-     112,    -1,   147,    -1,   146,   113,   147,    -1,   229,    -1,
-     229,   108,   109,    -1,   232,    -1,   108,   198,   109,    -1,
-     229,   150,     3,   148,    -1,   190,    -1,   175,    -1,   175,
-     108,   154,   109,    -1,   229,     3,   171,    -1,   229,     3,
-     161,    -1,   229,   108,   152,   109,     3,   171,    -1,   229,
-     108,   152,   109,     3,   161,    -1,   153,    -1,   152,   113,
-     153,    -1,   229,    -1,   229,   114,   232,    -1,   229,   114,
-     229,    -1,   188,   114,   232,    -1,   188,   114,   229,    -1,
-     155,    -1,   154,   113,   155,    -1,   171,    -1,   184,    -1,
-     232,    -1,   148,    -1,    -1,   157,    -1,   158,    -1,   157,
-     113,   158,    -1,   232,   171,   217,    -1,   171,   217,    -1,
-      35,    73,   171,    -1,   170,    -1,   160,    -1,   159,   113,
-     160,    -1,   232,   171,    -1,   170,    -1,   171,    -1,    33,
-     108,   163,   109,   165,    -1,    -1,    93,    -1,   164,    -1,
-     163,   113,   164,    -1,    17,   217,    -1,    18,   171,   162,
-     217,    -1,    18,   179,   217,    -1,    18,   180,   217,    -1,
-      17,   179,   217,    -1,    17,   171,   217,    -1,    17,   180,
-     217,    -1,    -1,   166,    -1,    -1,   100,    87,   108,   167,
-     168,   109,    -1,   169,    -1,   168,   169,    -1,     4,    -1,
-      19,    -1,   178,    -1,   115,   168,   116,    -1,   107,    -1,
-     107,   117,   185,    -1,   107,   117,   222,    -1,   224,   173,
-     195,    -1,    -1,   172,   174,    -1,   150,    -1,    32,   108,
-     159,   109,    -1,    83,   108,   156,   109,    -1,    84,   108,
-     156,   109,    -1,    83,   195,    73,   231,   224,   173,    -1,
-      84,   195,    73,   231,   224,   173,    -1,    23,    -1,    23,
-      40,    30,   232,    -1,    61,    73,   175,    -1,    15,    -1,
-      15,   118,   229,    -1,   230,   118,   229,    -1,    15,   118,
-     232,    -1,   230,    -1,   230,   118,   176,    -1,   177,    -1,
-     176,   118,   177,    -1,   178,    -1,    17,    -1,    18,    -1,
-      17,    -1,   179,   118,    17,    -1,   179,   118,    18,    -1,
-      16,    -1,   232,   150,     3,   182,    -1,   184,    -1,   185,
-      -1,   232,   114,   182,    -1,    -1,   108,   183,   187,    -1,
-      68,    -1,    50,    -1,    91,    -1,     6,    -1,     8,    -1,
-     186,    -1,   222,    -1,   232,    -1,   229,   118,   232,    -1,
-       7,    -1,    13,    -1,    14,    -1,     5,    -1,   187,     5,
-      -1,    29,    -1,    68,    -1,    81,    -1,   189,    -1,    72,
-      86,    -1,    70,    56,    -1,    82,    -1,    49,    -1,    41,
-      76,    -1,    31,    86,    -1,    96,    -1,    52,    -1,   191,
-      -1,    63,    -1,    45,    -1,    27,    86,    -1,   188,    -1,
-     189,   219,    -1,    28,    -1,    53,    -1,    54,    -1,    55,
-      -1,    64,    -1,    69,    -1,    79,    -1,    88,    -1,    90,
-      -1,    95,    -1,    97,    -1,    98,    -1,    99,    -1,    71,
-      -1,   104,    -1,   105,    -1,   102,    -1,   103,    -1,   101,
-      -1,    -1,   196,    -1,   197,    -1,    85,   110,   198,   111,
-      -1,   110,   198,   111,    -1,   197,   110,   198,   111,    -1,
-     107,    -1,   199,    -1,   199,   113,   107,    -1,   199,   113,
-     107,   113,   199,    -1,   200,    -1,    22,   101,   200,    -1,
-     199,   192,   200,    -1,   199,   193,   200,    -1,   200,   194,
-     200,    -1,   203,   110,   198,   111,    -1,   110,   198,   111,
-      -1,   204,    -1,   205,    -1,   204,   202,   204,    -1,    66,
-     202,   204,    -1,   204,   202,    65,    -1,    66,   202,    65,
-      -1,   211,    -1,   206,    -1,    -1,    36,    30,   108,   201,
-     187,    -1,   106,    -1,   106,   119,    -1,   119,   106,    -1,
-     119,   106,   119,    -1,    85,    -1,    51,    -1,    50,    -1,
-      91,    -1,   223,    -1,   186,    -1,   232,    -1,   229,    -1,
-     100,    34,   197,    -1,   100,    35,   108,   207,   109,    -1,
-     208,    -1,   207,   113,   208,    -1,   107,    -1,   232,   195,
-     209,    -1,    -1,   210,    -1,    78,    -1,    20,    -1,    74,
-      -1,   212,    -1,   213,    -1,   108,   229,   109,    -1,   212,
-     108,   214,   109,    -1,   215,    -1,   214,   113,   215,    -1,
-     120,   216,    -1,   120,   118,   216,    -1,   232,    -1,   216,
-     118,   232,    -1,    -1,   218,    -1,    74,    -1,    38,   182,
-      -1,   108,   109,    -1,   108,   220,   109,    -1,   221,    -1,
-     220,   113,   221,    -1,   232,    -1,   232,   110,   222,   111,
-      -1,   232,   110,   185,   111,    -1,   222,    -1,   107,    -1,
-      10,    -1,    11,    -1,   222,    -1,    12,    -1,    -1,   225,
-      -1,   226,   228,    -1,   115,   227,    10,   116,    -1,    -1,
-      94,    -1,    24,    -1,    80,    -1,    -1,    57,    -1,    46,
-      -1,    15,    -1,    16,    -1,    16,    -1,    -1,   232,    -1,
-       9,    -1
+      -1,   234,   125,   126,    39,   130,     3,    26,   133,    44,
+      -1,    -1,   127,    -1,   108,   128,   109,    -1,   108,   109,
+      -1,   129,    -1,   128,   129,    -1,   237,    -1,   237,   110,
+      10,   111,    -1,    10,    -1,    -1,   131,    -1,   132,    -1,
+     131,   132,    -1,    46,    89,    -1,    57,    89,    -1,    25,
+      89,    -1,    48,    58,    -1,    16,    62,    -1,    -1,   134,
+      -1,   145,   138,   135,    -1,   136,    -1,   135,   136,    -1,
+     152,    -1,   182,    -1,   150,    -1,    -1,    43,    16,   137,
+      -1,   192,    -1,    -1,   139,    -1,    59,   140,   112,    -1,
+      59,    51,    -1,   142,    -1,   140,   142,    -1,    -1,   127,
+      -1,   143,    51,   234,   141,    -1,   144,    -1,   143,   113,
+     144,    -1,   234,    -1,   234,   108,   109,    -1,   237,    -1,
+      -1,   146,    -1,    47,   147,   112,    -1,    47,    22,   112,
+      -1,    47,   112,    -1,   148,    -1,   147,   113,   148,    -1,
+     234,    -1,   234,   108,   109,    -1,   237,    -1,   108,   200,
+     109,    -1,   234,   151,     3,   149,    -1,   191,    -1,   176,
+      -1,   176,   108,   155,   109,    -1,   234,     3,   172,    -1,
+     234,     3,   162,    -1,   234,   108,   153,   109,     3,   172,
+      -1,   234,   108,   153,   109,     3,   162,    -1,   154,    -1,
+     153,   113,   154,    -1,   234,    -1,   234,   114,   237,    -1,
+     234,   114,   234,    -1,   189,   114,   237,    -1,   189,   114,
+     234,    -1,   156,    -1,   155,   113,   156,    -1,   172,    -1,
+     185,    -1,   237,    -1,   149,    -1,    -1,   158,    -1,   159,
+      -1,   158,   113,   159,    -1,   237,   172,   222,    -1,   172,
+     222,    -1,    35,    73,   172,    -1,   171,    -1,   161,    -1,
+     160,   113,   161,    -1,   237,   172,    -1,   171,    -1,   172,
+      -1,    33,   108,   164,   109,   166,    -1,    -1,    93,    -1,
+     165,    -1,   164,   113,   165,    -1,    17,   222,    -1,    18,
+     172,   163,   222,    -1,    18,   180,   222,    -1,    18,   181,
+     222,    -1,    17,   180,   222,    -1,    17,   172,   222,    -1,
+      17,   181,   222,    -1,    -1,   167,    -1,    -1,   100,    87,
+     108,   168,   169,   109,    -1,   170,    -1,   169,   170,    -1,
+       4,    -1,    19,    -1,   179,    -1,   115,   169,   116,    -1,
+     107,    -1,   107,   117,   186,    -1,   107,   117,   227,    -1,
+     229,   174,   196,    -1,    -1,   173,   175,    -1,   151,    -1,
+      32,   108,   160,   109,    -1,    83,   108,   157,   109,    -1,
+      84,   108,   157,   109,    -1,    83,   196,    73,   236,   229,
+     174,    -1,    84,   196,    73,   236,   229,   174,    -1,    23,
+      -1,    23,    40,    30,   237,    -1,    61,    73,   176,    -1,
+      15,    -1,    15,   118,   234,    -1,   235,   118,   234,    -1,
+      15,   118,   237,    -1,   235,    -1,   235,   118,   177,    -1,
+     178,    -1,   177,   118,   178,    -1,   179,    -1,    17,    -1,
+      18,    -1,    17,    -1,   180,   118,    17,    -1,   180,   118,
+      18,    -1,    16,    -1,   237,   151,     3,   183,    -1,   185,
+      -1,   186,    -1,   237,   114,   183,    -1,    -1,   108,   184,
+     188,    -1,    68,    -1,    50,    -1,    91,    -1,     6,    -1,
+       8,    -1,   187,    -1,   227,    -1,   237,    -1,   234,   118,
+     237,    -1,     7,    -1,    13,    -1,    14,    -1,     5,    -1,
+     188,     5,    -1,    29,    -1,    68,    -1,    81,    -1,   190,
+      -1,    72,    86,    -1,    70,    56,    -1,    82,    -1,    49,
+      -1,    41,    76,    -1,    31,    86,    -1,    96,    -1,    52,
+      -1,   192,    -1,    63,    -1,    45,    -1,    27,    86,    -1,
+     189,    -1,   190,   224,    -1,    28,    -1,    53,    -1,    54,
+      -1,    55,    -1,    64,    -1,    69,    -1,    79,    -1,    88,
+      -1,    90,    -1,    95,    -1,    97,    -1,    98,    -1,    99,
+      -1,    71,    -1,   104,    -1,   105,    -1,   102,    -1,   103,
+      -1,   101,    -1,    -1,   197,    -1,   198,    -1,   110,   211,
+     111,    -1,   199,    -1,    85,   110,   200,   111,    -1,   110,
+     200,   111,    -1,   199,   110,   200,   111,    -1,   107,    -1,
+     201,    -1,   201,   113,   107,    -1,   201,   113,   107,   113,
+     201,    -1,   202,    -1,    22,   101,   202,    -1,   201,   193,
+     202,    -1,   201,   194,   202,    -1,   202,   195,   202,    -1,
+     203,   110,   200,   111,    -1,   110,   200,   111,    -1,   204,
+      -1,   205,    -1,   204,   215,   204,    -1,    66,   215,   204,
+      -1,   204,   215,    65,    -1,    66,   215,    65,    -1,   206,
+      -1,    85,    -1,    51,    -1,    50,    -1,    91,    -1,   228,
+      -1,   187,    -1,   237,    -1,   234,    -1,   100,    34,   199,
+      -1,   100,    35,   108,   207,   109,    -1,   208,    -1,   207,
+     113,   208,    -1,   107,    -1,   237,   196,   209,    -1,    -1,
+     210,    -1,    78,    -1,    20,    -1,    74,    -1,   212,    -1,
+     216,    -1,   214,    -1,    -1,    36,    30,   108,   213,   188,
+      -1,    37,   172,    -1,   106,    -1,   106,   119,    -1,   119,
+     106,    -1,   119,   106,   119,    -1,   217,    -1,   218,    -1,
+     108,   234,   109,    -1,   217,   108,   219,   109,    -1,   220,
+      -1,   219,   113,   220,    -1,   120,   221,    -1,   120,   118,
+     221,    -1,   237,    -1,   221,   118,   237,    -1,    -1,   223,
+      -1,    74,    -1,    38,   183,    -1,   108,   109,    -1,   108,
+     225,   109,    -1,   226,    -1,   225,   113,   226,    -1,   237,
+      -1,   237,   110,   227,   111,    -1,   237,   110,   186,   111,
+      -1,   227,    -1,   107,    -1,    10,    -1,    11,    -1,   227,
+      -1,    12,    -1,    -1,   230,    -1,   231,   233,    -1,   115,
+     232,    10,   116,    -1,    -1,    94,    -1,    24,    -1,    80,
+      -1,    -1,    57,    -1,    46,    -1,    15,    -1,    16,    -1,
+      16,    -1,    -1,   237,    -1,     9,    -1
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const unsigned short yyrline[] =
 {
-       0,   342,   342,   348,   354,   370,   395,   397,   400,   404,
-     409,   416,   424,   429,   433,   442,   444,   452,   456,   464,
-     468,   471,   474,   478,   498,   500,   508,   517,   521,   536,
-     544,   557,   565,   564,   578,   590,   592,   594,   605,   610,
-     616,   622,   624,   627,   638,   644,   650,   657,   663,   672,
-     674,   685,   689,   692,   699,   705,   711,   718,   724,   733,
-     735,   745,   759,   769,   785,   795,   811,   817,   824,   834,
-     844,   849,   856,   863,   871,   881,   887,   893,   897,   905,
-     916,   938,   940,   942,   948,   954,   962,   968,   975,   980,
-     986,   992,   998,  1001,  1007,  1017,  1019,  1022,  1030,  1037,
-    1050,  1061,  1071,  1082,  1092,  1103,  1114,  1116,  1123,  1121,
-    1130,  1135,  1141,  1146,  1149,  1153,  1158,  1167,  1176,  1187,
-    1209,  1216,  1235,  1239,  1245,  1251,  1257,  1267,  1277,  1283,
-    1294,  1308,  1317,  1327,  1337,  1347,  1355,  1376,  1385,  1394,
-    1396,  1403,  1410,  1416,  1420,  1426,  1446,  1456,  1458,  1459,
-    1466,  1466,  1471,  1478,  1484,  1489,  1493,  1497,  1500,  1505,
-    1517,  1534,  1539,  1544,  1577,  1587,  1601,  1603,  1604,  1605,
-    1606,  1607,  1608,  1609,  1610,  1611,  1612,  1613,  1614,  1620,
-    1622,  1623,  1626,  1633,  1645,  1647,  1651,  1655,  1656,  1657,
-    1658,  1659,  1663,  1664,  1665,  1666,  1670,  1671,  1678,  1678,
-    1679,  1679,  1680,  1682,  1684,  1689,  1693,  1702,  1706,  1711,
-    1716,  1719,  1725,  1735,  1739,  1742,  1745,  1748,  1753,  1762,
-    1770,  1776,  1782,  1789,  1797,  1805,  1814,  1817,  1821,  1820,
-    1831,  1833,  1834,  1835,  1838,  1842,  1847,  1853,  1858,  1859,
-    1860,  1873,  1887,  1891,  1896,  1900,  1905,  1912,  1925,  1927,
-    1930,  1934,  1937,  1942,  1946,  1954,  1969,  1975,  1982,  1995,
-    2007,  2022,  2026,  2043,  2048,  2051,  2056,  2078,  2083,  2088,
-    2094,  2100,  2108,  2116,  2124,  2131,  2141,  2146,  2152,  2154,
-    2184,  2186,  2189,  2196,  2202,  2204,  2205,  2206,  2209,  2211,
-    2212,  2215,  2220,  2227,  2234,  2236,  2241
+       0,   349,   349,   355,   361,   378,   377,   406,   408,   411,
+     415,   420,   427,   435,   440,   444,   453,   455,   463,   467,
+     475,   479,   482,   485,   489,   509,   511,   519,   528,   532,
+     547,   555,   568,   576,   575,   589,   601,   603,   605,   616,
+     621,   627,   633,   635,   638,   649,   655,   661,   668,   674,
+     683,   685,   696,   700,   703,   710,   716,   722,   729,   735,
+     744,   746,   756,   770,   780,   796,   806,   822,   828,   835,
+     845,   855,   860,   867,   874,   882,   892,   898,   904,   908,
+     916,   927,   949,   951,   953,   959,   965,   973,   979,   986,
+     991,   997,  1003,  1009,  1012,  1018,  1028,  1030,  1033,  1041,
+    1048,  1061,  1072,  1082,  1093,  1103,  1114,  1125,  1127,  1134,
+    1132,  1141,  1146,  1152,  1157,  1160,  1164,  1169,  1178,  1187,
+    1198,  1220,  1227,  1246,  1250,  1256,  1262,  1268,  1278,  1288,
+    1294,  1305,  1319,  1328,  1338,  1348,  1358,  1366,  1387,  1396,
+    1405,  1407,  1414,  1421,  1427,  1431,  1437,  1457,  1467,  1469,
+    1470,  1477,  1477,  1482,  1489,  1495,  1500,  1504,  1508,  1511,
+    1516,  1528,  1545,  1550,  1555,  1588,  1598,  1612,  1614,  1615,
+    1616,  1617,  1618,  1619,  1620,  1621,  1622,  1623,  1624,  1625,
+    1631,  1633,  1634,  1637,  1644,  1656,  1658,  1662,  1666,  1667,
+    1668,  1669,  1670,  1674,  1675,  1676,  1677,  1681,  1682,  1689,
+    1689,  1690,  1690,  1691,  1693,  1695,  1700,  1702,  1707,  1711,
+    1720,  1724,  1729,  1734,  1737,  1743,  1753,  1757,  1760,  1763,
+    1766,  1771,  1780,  1788,  1794,  1800,  1807,  1815,  1823,  1832,
+    1837,  1841,  1846,  1852,  1857,  1858,  1859,  1872,  1886,  1890,
+    1895,  1899,  1904,  1911,  1924,  1926,  1929,  1933,  1936,  1943,
+    1945,  1946,  1951,  1949,  1961,  1969,  1971,  1972,  1973,  1975,
+    1979,  1987,  2002,  2008,  2015,  2028,  2040,  2055,  2059,  2076,
+    2081,  2084,  2089,  2111,  2116,  2121,  2127,  2133,  2141,  2149,
+    2157,  2164,  2174,  2179,  2185,  2187,  2217,  2219,  2222,  2229,
+    2235,  2237,  2238,  2239,  2242,  2244,  2245,  2248,  2253,  2260,
+    2267,  2269,  2274
 };
 #endif
 
@@ -775,11 +781,11 @@
   "TOK_EXCEPT", "'^'", "TOK_INTERSECTION", "'|'", "TOK_UNION", 
   "TOK_TwoDots", "TOK_ThreeDots", "'{'", "'}'", "'('", "')'", "';'", 
   "','", "':'", "'['", "']'", "'!'", "'.'", "'<'", "'@'", "$accept", 
-  "ParsedGrammar", "ModuleList", "ModuleDefinition", 
+  "ParsedGrammar", "ModuleList", "ModuleDefinition", "@1", 
   "optObjectIdentifier", "ObjectIdentifier", "ObjectIdentifierBody", 
   "ObjectIdentifierElement", "optModuleDefinitionFlags", 
   "ModuleDefinitionFlags", "ModuleDefinitionFlag", "optModuleBody", 
-  "ModuleBody", "AssignmentList", "Assignment", "@1", "optImports", 
+  "ModuleBody", "AssignmentList", "Assignment", "@2", "optImports", 
   "ImportsDefinition", "ImportsBundleSet", "AssignedIdentifier", 
   "ImportsBundle", "ImportsList", "ImportsElement", "optExports", 
   "ExportsDefinition", "ExportsBody", "ExportsElement", "ValueSet", 
@@ -788,20 +794,21 @@
   "ActualParameter", "optComponentTypeLists", "ComponentTypeLists", 
   "ComponentType", "AlternativeTypeLists", "AlternativeType", 
   "ObjectClass", "optUnique", "FieldSpec", "ClassField", "optWithSyntax", 
-  "WithSyntax", "@2", "WithSyntaxList", "WithSyntaxToken", 
+  "WithSyntax", "@3", "WithSyntaxList", "WithSyntaxToken", 
   "ExtensionAndException", "Type", "NSTD_IndirectMarker", 
   "TypeDeclaration", "TypeDeclarationSet", "ComplexTypeReference", 
   "ComplexTypeReferenceAmpList", "ComplexTypeReferenceElement", 
   "PrimitiveFieldReference", "FieldName", "DefinedObjectClass", 
-  "ValueDefinition", "Value", "@3", "SimpleValue", "DefinedValue", 
+  "ValueDefinition", "Value", "@4", "SimpleValue", "DefinedValue", 
   "RestrictedCharacterStringValue", "Opaque", "BasicTypeId", 
   "BasicTypeId_UniverationCompatible", "BasicType", "BasicString", 
-  "Union", "Intersection", "Except", "optConstraints", "Constraints", 
-  "SetOfConstraints", "ElementSetSpecs", "ElementSetSpec", 
-  "ConstraintSubtypeElement", "@4", "ConstraintRangeSpec", 
-  "ConstraintSpec", "SingleValue", "ContainedSubtype", 
-  "InnerTypeConstraint", "WithComponentsList", "WithComponentsElement", 
-  "optPresenceConstraint", "PresenceConstraint", "TableConstraint", 
+  "Union", "Intersection", "Except", "optConstraints", "Constraint", 
+  "SubtypeConstraint", "SetOfConstraints", "ElementSetSpecs", 
+  "ElementSetSpec", "ConstraintSubtypeElement", "ConstraintSpec", 
+  "SingleValue", "ContainedSubtype", "InnerTypeConstraint", 
+  "WithComponentsList", "WithComponentsElement", "optPresenceConstraint", 
+  "PresenceConstraint", "GeneralConstraint", "UserDefinedConstraint", 
+  "@5", "ContentsConstraint", "ConstraintRangeSpec", "TableConstraint", 
   "SimpleTableConstraint", "ComponentRelationConstraint", 
   "AtNotationList", "AtNotationElement", "ComponentIdList", "optMarker", 
   "Marker", "UniverationDefinition", "UniverationList", 
@@ -835,71 +842,73 @@
 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 static const unsigned char yyr1[] =
 {
-       0,   121,   122,   123,   123,   124,   125,   125,   126,   126,
-     127,   127,   128,   128,   128,   129,   129,   130,   130,   131,
-     131,   131,   131,   131,   132,   132,   133,   134,   134,   135,
-     135,   135,   136,   135,   135,   137,   137,   138,   138,   139,
-     139,   140,   140,   141,   142,   142,   143,   143,   143,   144,
-     144,   145,   145,   145,   146,   146,   147,   147,   147,   148,
-     149,   150,   150,   150,   151,   151,   151,   151,   152,   152,
-     153,   153,   153,   153,   153,   154,   154,   155,   155,   155,
-     155,   156,   156,   157,   157,   158,   158,   158,   158,   159,
-     159,   160,   160,   160,   161,   162,   162,   163,   163,   164,
-     164,   164,   164,   164,   164,   164,   165,   165,   167,   166,
-     168,   168,   169,   169,   169,   169,   170,   170,   170,   171,
-     172,   173,   174,   174,   174,   174,   174,   174,   174,   174,
-     174,   175,   175,   175,   175,   175,   175,   176,   176,   177,
-     178,   178,   179,   179,   179,   180,   181,   182,   182,   182,
-     183,   182,   182,   184,   184,   184,   184,   184,   184,   185,
-     185,   186,   186,   186,   187,   187,   188,   188,   188,   188,
-     188,   188,   188,   188,   188,   188,   188,   188,   188,   189,
-     189,   189,   190,   190,   191,   191,   191,   191,   191,   191,
-     191,   191,   191,   191,   191,   191,   191,   191,   192,   192,
-     193,   193,   194,   195,   195,   196,   196,   197,   197,   198,
-     198,   198,   198,   199,   199,   199,   199,   199,   200,   200,
-     200,   200,   200,   200,   200,   200,   200,   200,   201,   200,
-     202,   202,   202,   202,   203,   203,   204,   204,   204,   204,
-     204,   205,   206,   206,   207,   207,   208,   208,   209,   209,
-     210,   210,   210,   211,   211,   212,   213,   214,   214,   215,
-     215,   216,   216,   217,   217,   218,   218,   219,   219,   220,
-     220,   221,   221,   221,   221,   221,   222,   222,   223,   223,
-     224,   224,   225,   226,   227,   227,   227,   227,   228,   228,
-     228,   229,   229,   230,   231,   231,   232
+       0,   121,   122,   123,   123,   125,   124,   126,   126,   127,
+     127,   128,   128,   129,   129,   129,   130,   130,   131,   131,
+     132,   132,   132,   132,   132,   133,   133,   134,   135,   135,
+     136,   136,   136,   137,   136,   136,   138,   138,   139,   139,
+     140,   140,   141,   141,   142,   143,   143,   144,   144,   144,
+     145,   145,   146,   146,   146,   147,   147,   148,   148,   148,
+     149,   150,   151,   151,   151,   152,   152,   152,   152,   153,
+     153,   154,   154,   154,   154,   154,   155,   155,   156,   156,
+     156,   156,   157,   157,   158,   158,   159,   159,   159,   159,
+     160,   160,   161,   161,   161,   162,   163,   163,   164,   164,
+     165,   165,   165,   165,   165,   165,   165,   166,   166,   168,
+     167,   169,   169,   170,   170,   170,   170,   171,   171,   171,
+     172,   173,   174,   175,   175,   175,   175,   175,   175,   175,
+     175,   175,   176,   176,   176,   176,   176,   176,   177,   177,
+     178,   179,   179,   180,   180,   180,   181,   182,   183,   183,
+     183,   184,   183,   183,   185,   185,   185,   185,   185,   185,
+     186,   186,   187,   187,   187,   188,   188,   189,   189,   189,
+     189,   189,   189,   189,   189,   189,   189,   189,   189,   189,
+     190,   190,   190,   191,   191,   192,   192,   192,   192,   192,
+     192,   192,   192,   192,   192,   192,   192,   192,   192,   193,
+     193,   194,   194,   195,   196,   196,   197,   197,   198,   198,
+     199,   199,   200,   200,   200,   200,   201,   201,   201,   201,
+     201,   202,   202,   202,   202,   202,   202,   202,   202,   202,
+     203,   203,   204,   204,   204,   204,   204,   205,   206,   206,
+     207,   207,   208,   208,   209,   209,   210,   210,   210,   211,
+     211,   211,   213,   212,   214,   215,   215,   215,   215,   216,
+     216,   217,   218,   219,   219,   220,   220,   221,   221,   222,
+     222,   223,   223,   224,   224,   225,   225,   226,   226,   226,
+     226,   226,   227,   227,   228,   228,   229,   229,   230,   231,
+     232,   232,   232,   232,   233,   233,   233,   234,   234,   235,
+     236,   236,   237
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
 static const unsigned char yyr2[] =
 {
-       0,     2,     1,     1,     2,     8,     0,     1,     3,     2,
-       1,     2,     1,     4,     1,     0,     1,     1,     2,     2,
-       2,     2,     2,     2,     0,     1,     3,     1,     2,     1,
-       1,     1,     0,     3,     1,     0,     1,     3,     2,     1,
-       2,     0,     1,     4,     1,     3,     1,     3,     1,     0,
-       1,     3,     3,     2,     1,     3,     1,     3,     1,     3,
-       4,     1,     1,     4,     3,     3,     6,     6,     1,     3,
-       1,     3,     3,     3,     3,     1,     3,     1,     1,     1,
-       1,     0,     1,     1,     3,     3,     2,     3,     1,     1,
-       3,     2,     1,     1,     5,     0,     1,     1,     3,     2,
-       4,     3,     3,     3,     3,     3,     0,     1,     0,     6,
-       1,     2,     1,     1,     1,     3,     1,     3,     3,     3,
-       0,     2,     1,     4,     4,     4,     6,     6,     1,     4,
-       3,     1,     3,     3,     3,     1,     3,     1,     3,     1,
-       1,     1,     1,     3,     3,     1,     4,     1,     1,     3,
-       0,     3,     1,     1,     1,     1,     1,     1,     1,     1,
-       3,     1,     1,     1,     1,     2,     1,     1,     1,     1,
-       2,     2,     1,     1,     2,     2,     1,     1,     1,     1,
-       1,     2,     1,     2,     1,     1,     1,     1,     1,     1,
+       0,     2,     1,     1,     2,     0,     9,     0,     1,     3,
+       2,     1,     2,     1,     4,     1,     0,     1,     1,     2,
+       2,     2,     2,     2,     2,     0,     1,     3,     1,     2,
+       1,     1,     1,     0,     3,     1,     0,     1,     3,     2,
+       1,     2,     0,     1,     4,     1,     3,     1,     3,     1,
+       0,     1,     3,     3,     2,     1,     3,     1,     3,     1,
+       3,     4,     1,     1,     4,     3,     3,     6,     6,     1,
+       3,     1,     3,     3,     3,     3,     1,     3,     1,     1,
+       1,     1,     0,     1,     1,     3,     3,     2,     3,     1,
+       1,     3,     2,     1,     1,     5,     0,     1,     1,     3,
+       2,     4,     3,     3,     3,     3,     3,     0,     1,     0,
+       6,     1,     2,     1,     1,     1,     3,     1,     3,     3,
+       3,     0,     2,     1,     4,     4,     4,     6,     6,     1,
+       4,     3,     1,     3,     3,     3,     1,     3,     1,     3,
+       1,     1,     1,     1,     3,     3,     1,     4,     1,     1,
+       3,     0,     3,     1,     1,     1,     1,     1,     1,     1,
+       1,     3,     1,     1,     1,     1,     2,     1,     1,     1,
+       1,     2,     2,     1,     1,     2,     2,     1,     1,     1,
+       1,     1,     2,     1,     2,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     1,     0,     1,     1,     4,     3,     4,     1,
-       1,     3,     5,     1,     3,     3,     3,     3,     4,     3,
-       1,     1,     3,     3,     3,     3,     1,     1,     0,     5,
-       1,     2,     2,     3,     1,     1,     1,     1,     1,     1,
-       1,     1,     3,     5,     1,     3,     1,     3,     0,     1,
-       1,     1,     1,     1,     1,     3,     4,     1,     3,     2,
-       3,     1,     3,     0,     1,     1,     2,     2,     3,     1,
-       3,     1,     4,     4,     1,     1,     1,     1,     1,     1,
-       0,     1,     2,     4,     0,     1,     1,     1,     0,     1,
-       1,     1,     1,     1,     0,     1,     1
+       1,     1,     1,     1,     0,     1,     1,     3,     1,     4,
+       3,     4,     1,     1,     3,     5,     1,     3,     3,     3,
+       3,     4,     3,     1,     1,     3,     3,     3,     3,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     3,     5,
+       1,     3,     1,     3,     0,     1,     1,     1,     1,     1,
+       1,     1,     0,     5,     2,     1,     2,     2,     3,     1,
+       1,     3,     4,     1,     3,     2,     3,     1,     3,     0,
+       1,     1,     2,     2,     3,     1,     3,     1,     4,     4,
+       1,     1,     1,     1,     1,     1,     0,     1,     2,     4,
+       0,     1,     1,     1,     0,     1,     1,     1,     1,     1,
+       0,     1,     1
 };
 
 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
@@ -907,368 +916,375 @@
    means the default is an error.  */
 static const unsigned short yydefact[] =
 {
-       0,   291,   292,     0,     2,     3,     6,     1,     4,     0,
-       0,     7,   296,    14,     9,     0,    10,    12,    15,     8,
-      11,     0,     0,     0,     0,     0,     0,     0,    16,    17,
-       0,    23,    21,    19,    22,    20,     0,    18,    13,    49,
-       0,     0,    25,    35,    50,     0,    53,     0,    54,    56,
-      58,     5,     0,     0,    36,    52,    51,     0,     0,    38,
-       0,    39,     0,    44,    46,    48,   184,     0,   185,   186,
-     187,   188,   189,   197,   190,   191,   192,   193,   194,   195,
-     196,    26,    27,    31,    29,    30,    34,     0,     0,    55,
-      57,    37,    40,     0,     0,     0,    32,    28,   280,   131,
-     293,     0,   166,     0,     0,   180,   173,   177,   179,   167,
-       0,     0,   168,   172,   176,     0,     0,    62,   182,   169,
-      61,   178,   135,     0,    41,    45,    47,    33,     0,   284,
-      65,    64,   120,   281,   288,     0,   181,   175,   174,   171,
-     170,     0,    68,     0,   169,    70,     0,   280,     0,   183,
-       0,     0,    42,    43,     0,   286,   287,   285,     0,     0,
-     203,   290,   289,   282,   132,   134,     0,     0,     0,     0,
-       0,    60,   155,   161,   156,   276,   277,   162,   163,   153,
-     154,    80,     0,    75,    77,    78,   157,   158,    79,   275,
-     267,     0,   269,   274,   271,   140,   141,   136,   137,   139,
-     133,   152,   150,   146,   147,   148,     0,   159,   280,   280,
-       0,    97,     0,   128,     0,     0,   203,   203,   122,   121,
-       0,     0,   119,   204,   205,   280,    69,    74,    73,    72,
-      71,   279,     0,     0,   236,   235,     0,   234,   237,     0,
-     209,     0,     0,   239,     0,   210,   213,     0,   220,   221,
-     227,   226,   253,   254,   278,   238,   241,   240,    63,   280,
-     268,     0,     0,     0,     0,     0,     0,   145,   142,     0,
-     265,   263,   263,   263,    99,   264,    95,   263,   263,   106,
-       0,   283,     0,   280,     0,   280,     0,   280,     0,     0,
-       0,     0,    67,    66,     0,     0,   230,     0,     0,     0,
-       0,     0,     0,    59,   200,   201,   198,   199,     0,     0,
-       0,   202,     0,     0,     0,     0,    76,   270,     0,     0,
-     159,   138,   164,   151,   160,   149,   266,   104,     0,   103,
-     105,    96,   263,   101,   102,     0,    94,   107,    98,     0,
-     116,     0,    89,    92,    93,   280,   130,     0,     0,    82,
-      83,    88,   263,   280,   294,     0,   294,     0,   207,     0,
-     214,   228,   231,   232,   225,   223,   242,     0,   255,   219,
-     211,   215,   216,   217,     0,   224,   222,     0,     0,   257,
-     273,   272,   165,   143,   144,   100,     0,   129,     0,   123,
-     280,    91,   280,   124,   280,    86,   263,   280,   295,   125,
-     280,   206,   208,     0,   233,   246,     0,   244,   203,     0,
-     218,     0,   259,   261,   256,     0,   108,   117,   118,    90,
-      87,    84,    85,   120,   120,   229,   243,     0,   248,   212,
-     260,     0,   258,     0,   126,   127,   245,   251,   252,   250,
-     247,   249,   262,   112,   113,     0,     0,   110,   114,     0,
-     109,   111,   115
+       0,   297,   298,     0,     2,     3,     5,     1,     4,     7,
+       0,     0,     8,   302,    15,    10,     0,    11,    13,    16,
+       9,    12,     0,     0,     0,     0,     0,     0,     0,    17,
+      18,     0,    24,    22,    20,    23,    21,     0,    19,    14,
+      50,     0,     0,    26,    36,    51,     0,    54,     0,    55,
+      57,    59,     6,     0,     0,    37,    53,    52,     0,     0,
+      39,     0,    40,     0,    45,    47,    49,   185,     0,   186,
+     187,   188,   189,   190,   198,   191,   192,   193,   194,   195,
+     196,   197,    27,    28,    32,    30,    31,    35,     0,     0,
+      56,    58,    38,    41,     0,     0,     0,    33,    29,   286,
+     132,   299,     0,   167,     0,     0,   181,   174,   178,   180,
+     168,     0,     0,   169,   173,   177,     0,     0,    63,   183,
+     170,    62,   179,   136,     0,    42,    46,    48,    34,     0,
+     290,    66,    65,   121,   287,   294,     0,   182,   176,   175,
+     172,   171,     0,    69,     0,   170,    71,     0,   286,     0,
+     184,     0,     0,    43,    44,     0,   292,   293,   291,     0,
+       0,   204,   296,   295,   288,   133,   135,     0,     0,     0,
+       0,     0,    61,   156,   162,   157,   282,   283,   163,   164,
+     154,   155,    81,     0,    76,    78,    79,   158,   159,    80,
+     281,   273,     0,   275,   280,   277,   141,   142,   137,   138,
+     140,   134,   153,   151,   147,   148,   149,     0,   160,   286,
+     286,     0,    98,     0,   129,     0,     0,   204,   204,   123,
+     122,     0,     0,   120,   205,   206,   208,   286,    70,    75,
+      74,    73,    72,   285,     0,   232,   231,     0,   230,   233,
+       0,   212,     0,   235,     0,   213,   216,     0,   223,   224,
+     229,   284,   234,   237,   236,    64,   286,   274,     0,     0,
+       0,     0,     0,     0,   146,   143,     0,   271,   269,   269,
+     269,   100,   270,    96,   269,   269,   107,     0,   289,     0,
+     286,     0,   286,     0,   286,     0,     0,     0,   286,     0,
+       0,     0,   249,   251,   250,   259,   260,     0,    68,    67,
+       0,   255,     0,     0,     0,     0,     0,    60,   201,   202,
+     199,   200,     0,     0,     0,   203,     0,     0,     0,    77,
+     276,     0,     0,   160,   139,   165,   152,   161,   150,   272,
+     105,     0,   104,   106,    97,   269,   102,   103,     0,    95,
+     108,    99,     0,   117,     0,    90,    93,    94,   286,   131,
+       0,     0,    83,    84,    89,   269,   286,   300,     0,   300,
+       0,     0,   254,     0,   210,   207,     0,     0,   217,   256,
+     257,   228,   226,     0,   238,     0,   222,   214,   218,   219,
+     220,     0,   227,   225,   279,   278,   166,   144,   145,   101,
+       0,   130,     0,   124,   286,    92,   286,   125,   286,    87,
+     269,   286,   301,   126,   286,   209,   252,   261,     0,     0,
+     263,   211,   258,   242,     0,   240,   204,     0,   221,   109,
+     118,   119,    91,    88,    85,    86,   121,   121,     0,     0,
+     265,   267,   262,     0,   239,     0,   244,   215,     0,   127,
+     128,   253,   266,     0,   264,   241,   247,   248,   246,   243,
+     245,   113,   114,     0,     0,   111,   115,   268,     0,   110,
+     112,   116
 };
 
 /* YYDEFGOTO[NTERM-NUM]. */
 static const short yydefgoto[] =
 {
-      -1,     3,     4,     5,    10,    11,    15,    16,    27,    28,
-      29,    41,    42,    81,    82,   127,    53,    54,    60,   153,
-      61,    62,    63,    43,    44,    47,    48,   181,    83,   116,
-      84,   141,   142,   182,   183,   348,   349,   350,   341,   342,
-     130,   332,   210,   211,   336,   337,   433,   446,   447,   351,
-     352,   159,   160,   219,   117,   197,   198,   448,   272,   273,
-      85,   203,   264,   204,   205,   243,   323,   118,   119,   120,
-     121,   309,   310,   312,   222,   223,   224,   244,   245,   246,
-     403,   298,   247,   248,   249,   250,   406,   407,   440,   441,
-     251,   252,   253,   378,   379,   412,   274,   275,   149,   191,
-     192,   254,   255,   132,   133,   134,   158,   163,   256,   122,
-     397,   257
+      -1,     3,     4,     5,     9,    11,    12,    16,    17,    28,
+      29,    30,    42,    43,    82,    83,   128,    54,    55,    61,
+     154,    62,    63,    64,    44,    45,    48,    49,   182,    84,
+     117,    85,   142,   143,   183,   184,   351,   352,   353,   344,
+     345,   131,   335,   211,   212,   339,   340,   438,   454,   455,
+     354,   355,   160,   161,   220,   118,   198,   199,   456,   269,
+     270,    86,   204,   261,   205,   206,   243,   326,   119,   120,
+     121,   122,   313,   314,   316,   223,   224,   225,   226,   290,
+     245,   246,   247,   248,   249,   250,   414,   415,   449,   450,
+     291,   292,   428,   293,   303,   294,   295,   296,   409,   410,
+     430,   271,   272,   150,   192,   193,   251,   252,   133,   134,
+     135,   159,   164,   253,   123,   401,   254
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -357
+#define YYPACT_NINF -345
 static const short yypact[] =
 {
-      83,  -357,  -357,    18,    83,  -357,   -80,  -357,  -357,    64,
-       3,  -357,  -357,  -357,  -357,    74,  -357,     2,   266,  -357,
-    -357,   139,   100,    88,    90,   148,   142,   230,   266,  -357,
-     135,  -357,  -357,  -357,  -357,  -357,   242,  -357,  -357,   127,
-      53,   233,  -357,   238,  -357,   177,  -357,    80,  -357,   199,
-    -357,  -357,   173,   256,  -357,  -357,  -357,   213,   206,  -357,
-      55,  -357,     8,  -357,   211,  -357,  -357,   308,  -357,  -357,
-    -357,  -357,  -357,  -357,  -357,  -357,  -357,  -357,  -357,  -357,
-    -357,   256,  -357,  -357,  -357,  -357,  -357,   345,   641,  -357,
-    -357,  -357,  -357,    83,   213,   217,  -357,  -357,   -23,   222,
-    -357,   257,  -357,   271,   276,  -357,  -357,  -357,  -357,  -357,
-     303,   281,  -357,  -357,  -357,   717,   359,   261,  -357,   262,
-    -357,  -357,   253,   372,   -80,  -357,  -357,  -357,   269,     6,
-    -357,  -357,  -357,  -357,   134,   213,  -357,  -357,  -357,  -357,
-    -357,    89,  -357,   264,  -357,   273,   272,    95,    69,  -357,
-     277,   205,  -357,  -357,   300,  -357,  -357,  -357,   373,   565,
-     -61,  -357,  -357,  -357,  -357,  -357,   381,   717,   213,   213,
-     445,  -357,  -357,  -357,  -357,  -357,  -357,  -357,  -357,  -357,
-    -357,  -357,    92,  -357,  -357,  -357,  -357,  -357,  -357,  -357,
-    -357,   114,  -357,  -357,   278,  -357,  -357,   274,  -357,  -357,
-    -357,  -357,  -357,  -357,  -357,  -357,   275,   282,    72,    40,
-     117,  -357,   279,   351,   293,   330,    87,    99,  -357,  -357,
-     294,   445,  -357,  -357,   295,   -23,  -357,  -357,  -357,  -357,
-    -357,  -357,   305,   377,  -357,  -357,   -79,  -357,  -357,   287,
-    -357,    83,   445,  -357,   301,   229,   310,   302,   -79,  -357,
-    -357,  -357,   312,  -357,  -357,  -357,  -357,  -357,  -357,    95,
-    -357,    27,   270,   311,   414,   412,   205,  -357,  -357,   205,
-    -357,   116,   126,   116,  -357,  -357,   332,   126,   116,   323,
-     300,  -357,   398,    41,   334,     4,   356,     4,   357,   445,
-     320,   445,  -357,  -357,   491,   324,   315,   331,   225,   326,
-     337,   329,   328,  -357,  -357,  -357,  -357,  -357,   339,   491,
-     491,  -357,   491,   445,   291,   327,  -357,  -357,   338,   340,
-    -357,  -357,  -357,   443,  -357,  -357,  -357,  -357,   346,  -357,
-    -357,  -357,   116,  -357,  -357,   363,  -357,  -357,  -357,   412,
-     347,   138,  -357,  -357,  -357,   348,  -357,   389,   360,   352,
-    -357,  -357,   116,   348,   412,   362,   412,   355,  -357,   369,
-    -357,  -357,  -357,   349,  -357,  -357,   295,    51,  -357,  -357,
-     370,  -357,  -357,  -357,   371,  -357,  -357,    10,   145,  -357,
-    -357,  -357,  -357,  -357,  -357,  -357,   376,  -357,   270,  -357,
-      41,  -357,   348,  -357,    46,  -357,   116,   348,  -357,  -357,
-     348,  -357,  -357,   414,  -357,  -357,   174,  -357,   -61,   463,
-    -357,   412,   368,  -357,  -357,   327,  -357,  -357,  -357,  -357,
-    -357,  -357,  -357,  -357,  -357,   443,  -357,    51,   130,   234,
-     368,   412,  -357,    28,  -357,  -357,  -357,  -357,  -357,  -357,
-    -357,  -357,  -357,  -357,  -357,    28,    48,  -357,  -357,    16,
-    -357,  -357,  -357
+     179,  -345,  -345,    94,   179,  -345,  -345,  -345,  -345,   -87,
+      25,   118,  -345,  -345,  -345,  -345,    64,  -345,    37,   234,
+    -345,  -345,   106,   123,   107,   113,   164,   165,   260,   234,
+    -345,   157,  -345,  -345,  -345,  -345,  -345,   247,  -345,  -345,
+     177,    60,   235,  -345,   239,  -345,   175,  -345,   -72,  -345,
+     198,  -345,  -345,   147,   506,  -345,  -345,  -345,   246,   199,
+    -345,    21,  -345,   100,  -345,   205,  -345,  -345,   299,  -345,
+    -345,  -345,  -345,  -345,  -345,  -345,  -345,  -345,  -345,  -345,
+    -345,  -345,   506,  -345,  -345,  -345,  -345,  -345,   273,   659,
+    -345,  -345,  -345,  -345,   179,   246,   212,  -345,  -345,    16,
+     242,  -345,   237,  -345,   254,   270,  -345,  -345,  -345,  -345,
+    -345,   306,   278,  -345,  -345,  -345,   735,   376,   272,  -345,
+     275,  -345,  -345,   267,   383,   -87,  -345,  -345,  -345,   281,
+      87,  -345,  -345,  -345,  -345,    14,   246,  -345,  -345,  -345,
+    -345,  -345,    36,  -345,   276,  -345,   277,   284,    91,    77,
+    -345,   341,   201,  -345,  -345,   214,  -345,  -345,  -345,   377,
+     583,   108,  -345,  -345,  -345,  -345,  -345,   391,   735,   246,
+     246,   435,  -345,  -345,  -345,  -345,  -345,  -345,  -345,  -345,
+    -345,  -345,  -345,   134,  -345,  -345,  -345,  -345,  -345,  -345,
+    -345,  -345,   186,  -345,  -345,   285,  -345,  -345,   289,  -345,
+    -345,  -345,  -345,  -345,  -345,  -345,  -345,   290,   282,   162,
+      76,   211,  -345,   293,   370,   303,   340,   -52,    95,  -345,
+    -345,   304,   390,  -345,  -345,  -345,   305,    16,  -345,  -345,
+    -345,  -345,  -345,  -345,   315,  -345,  -345,   114,  -345,  -345,
+     210,  -345,   435,  -345,   308,   181,   317,   310,   114,  -345,
+    -345,  -345,  -345,  -345,  -345,  -345,    91,  -345,    97,   301,
+     279,   416,   413,   201,  -345,  -345,   201,  -345,   -13,    74,
+     -13,  -345,  -345,   330,    74,   -13,   324,   214,  -345,   398,
+      61,   323,    68,   356,    68,   357,   435,   401,   319,   179,
+     321,   325,  -345,  -345,  -345,   327,  -345,   435,  -345,  -345,
+     497,   318,   332,   216,   329,   335,   342,  -345,  -345,  -345,
+    -345,  -345,   345,   497,   497,  -345,   497,   435,   228,  -345,
+    -345,   343,   344,  -345,  -345,  -345,   453,  -345,  -345,  -345,
+    -345,   349,  -345,  -345,  -345,   -13,  -345,  -345,   373,  -345,
+    -345,  -345,   413,   352,   220,  -345,  -345,  -345,   319,  -345,
+     397,   362,   359,  -345,  -345,   -13,   319,   413,   364,   413,
+     365,   369,  -345,   371,  -345,  -345,   358,   368,  -345,  -345,
+     363,  -345,  -345,   435,   305,     8,  -345,   374,  -345,  -345,
+    -345,   372,  -345,  -345,  -345,  -345,  -345,  -345,  -345,  -345,
+     380,  -345,   301,  -345,    61,  -345,   319,  -345,    43,  -345,
+     -13,   319,  -345,  -345,   319,  -345,  -345,  -345,    -5,   221,
+    -345,  -345,  -345,  -345,   222,  -345,   108,   452,  -345,  -345,
+    -345,  -345,  -345,  -345,  -345,  -345,  -345,  -345,   416,   413,
+     366,  -345,  -345,   358,  -345,     8,     6,   271,    49,  -345,
+    -345,   453,   366,   413,  -345,  -345,  -345,  -345,  -345,  -345,
+    -345,  -345,  -345,    49,    46,  -345,  -345,  -345,    28,  -345,
+    -345,  -345
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const short yypgoto[] =
 {
-    -357,  -357,  -357,   483,  -357,   364,  -357,   474,  -357,  -357,
-     462,  -357,  -357,  -357,   410,  -357,  -357,  -357,  -357,  -357,
-     432,  -357,   399,  -357,  -357,  -357,   437,   366,  -357,   -62,
-    -357,  -357,   341,  -357,   250,   210,  -357,   121,  -357,   120,
-     292,  -357,  -357,   236,  -357,  -357,  -357,    73,  -356,  -272,
-     -84,  -357,   -58,  -357,   235,  -357,   258,  -146,   313,   314,
-    -357,   -21,  -357,  -124,  -255,  -122,   122,   -38,    -1,  -357,
-      34,  -357,  -357,  -357,  -214,  -357,   221,   -25,   115,   -69,
-    -357,   280,  -357,  -207,  -357,  -357,  -357,   104,  -357,  -357,
-    -357,  -357,  -357,  -357,   111,   123,  -256,  -357,  -357,  -357,
-     283,  -139,  -357,  -138,  -357,  -357,  -357,  -357,     1,  -357,
-     176,    -9
+    -345,  -345,  -345,   485,  -345,  -345,   367,  -345,   475,  -345,
+    -345,   464,  -345,  -345,  -345,   412,  -345,  -345,  -345,  -345,
+    -345,   434,  -345,   404,  -345,  -345,  -345,   438,   378,  -345,
+     -79,  -345,  -345,   337,  -345,   258,   232,  -345,   119,  -345,
+     125,   296,  -345,  -345,   250,  -345,  -345,  -345,    71,  -344,
+    -271,   -91,  -345,   -49,  -345,   248,  -345,   268,  -132,   320,
+     322,  -345,    85,  -345,  -135,  -252,  -136,   103,   -89,   -78,
+    -345,   -43,  -345,  -345,  -345,  -215,  -345,  -345,   229,  -151,
+     121,  -126,  -345,   -84,  -345,  -345,  -345,   101,  -345,  -345,
+    -345,  -345,  -345,  -345,   291,  -345,  -345,  -345,  -345,   111,
+     112,  -246,  -345,  -345,  -345,   288,  -134,  -345,   -51,  -345,
+    -345,  -345,  -345,     1,  -345,   191,   -10
 };
 
 /* 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 zero, do what YYDEFACT says.
    If YYTABLE_NINF, parse error.  */
-#define YYTABLE_NINF -264
+#define YYTABLE_NINF -270
 static const short yytable[] =
 {
-      17,     6,   286,   288,   199,     6,    17,   318,   187,   193,
-     128,   343,   187,    12,   131,   327,   329,   330,     7,    12,
-     443,   333,   334,   185,   220,   186,   123,   296,     9,   186,
-     155,    50,   443,   195,   196,   444,    12,   175,   176,   347,
-     297,    49,    18,    65,    88,   195,   196,   444,    50,   221,
-      12,    65,   443,    64,    87,    12,   267,   268,    49,    93,
-      12,    64,    12,   184,    12,   195,   196,   444,     1,     2,
-       1,     2,    88,    12,    13,    45,   385,   143,    12,   175,
-     176,   347,    87,    12,    13,    65,   156,    86,   267,   268,
-     451,   365,   129,   451,   124,    64,   395,   218,     1,     2,
-     157,   172,   173,   174,    12,   175,   176,   376,   177,   178,
-     269,   340,    21,   -81,   144,    86,   145,   199,   343,   129,
-     187,    94,   193,   319,   271,   276,   165,   187,   411,   143,
-     187,   445,   452,   417,   189,   185,   164,   186,   188,   194,
-     422,   293,   207,   445,   186,   179,   270,   186,   340,    30,
-     437,   200,   206,   340,   269,   129,   129,   450,   405,   228,
-     230,   129,    31,   445,   269,    46,   144,    91,   145,   227,
-     229,   -24,   220,    14,    40,   184,   189,    32,   190,    33,
-     161,  -263,    12,    19,   220,  -263,   180,   129,     1,     2,
-     270,   162,    56,    57,   428,   285,   290,   221,   166,   344,
-     270,   258,   167,   170,   438,   259,    34,   287,   439,   221,
-     129,   172,   173,   174,    12,   175,   176,   302,   177,   178,
-       1,     2,    12,   260,    59,   360,   279,   261,     1,     2,
-     280,    35,   173,    36,    12,   175,   176,   231,   177,   178,
-     371,   372,   301,   373,   328,   325,    38,   389,   326,   418,
-     188,   390,   194,   320,   414,   179,   324,   207,   415,   423,
-     207,   391,   424,   206,   357,    12,   359,   206,    39,   396,
-     206,     1,     2,   201,   345,   234,   353,    51,   353,    12,
-     175,   176,    22,   426,    66,     1,     2,   427,   374,    55,
-     364,    23,     1,     2,   195,   196,   180,    52,   173,    67,
-      12,   175,   176,   231,   177,   178,   344,    58,   420,    68,
-      69,    70,    24,   202,    25,    90,   238,   208,   209,    95,
-      71,   299,   300,    26,    96,    72,   126,    73,   195,   196,
-     387,   304,   305,   306,   307,    74,   304,   305,   306,   307,
-     135,   234,   308,   136,    75,   398,    76,   398,    98,    99,
-     100,    77,   138,    78,    79,    80,   375,   137,   408,   139,
-      99,   100,   146,   383,   384,   434,   435,   140,   413,   147,
-     148,   150,   101,    66,   102,   151,   103,   154,   168,   320,
-     170,   345,   238,   212,   225,   353,   104,   169,   262,   206,
-     105,   282,   263,   265,   106,   281,   266,   107,    68,    69,
-      70,   283,   413,   284,   289,   291,   294,   295,   108,    71,
-     303,   311,   313,   109,    72,   110,    73,   111,   408,   322,
-     315,    12,   442,   335,    74,   331,   112,   113,   339,   354,
-     356,   358,   361,    75,   362,    76,   221,   363,   368,   369,
-      77,   114,    78,    79,    80,   367,   370,   377,   382,   380,
-     386,   381,   173,   115,    12,   175,   176,   231,   177,   178,
-       1,     2,   392,   129,   388,   394,   401,   232,   404,   393,
-     173,   399,    12,   175,   176,   231,   177,   178,     1,     2,
-     402,   233,   410,   409,   416,   232,   431,     8,   152,    20,
-      37,    97,    92,   125,    89,   234,   235,   355,   173,   233,
-      12,   175,   176,   231,   177,   178,     1,     2,   226,   316,
-     419,   236,   171,   234,   235,   421,   338,   292,   449,   346,
-     366,   321,   277,   278,   429,   425,   432,   233,   314,   236,
-     237,   436,   400,     0,   430,     0,   238,     0,     0,     0,
-       0,   234,   235,     0,   317,   239,     0,     0,   237,     0,
-       0,     0,   240,   241,   238,   242,     0,   236,     0,     0,
-       0,     0,     0,   239,     0,     0,     0,     0,     0,     0,
-       0,   241,     0,   242,     0,     0,   237,     0,     0,     0,
-      99,   100,   238,     0,     0,     0,     0,     0,   213,     0,
-       0,   239,   101,    66,   102,     0,   103,   214,     0,   241,
-       0,   242,     0,     0,     0,     0,   104,     0,     0,     0,
-     105,     0,     0,     0,   106,     0,     0,   107,    68,    69,
-      70,     0,     0,     0,     0,     0,   215,     0,   108,    71,
-       0,     0,     0,   109,    72,   110,    73,   111,     0,     0,
-       0,     0,     0,     0,    74,     0,   112,   113,   216,   217,
-       0,     0,     0,    75,     0,    76,    99,   100,     0,     0,
-      77,   114,    78,    79,    80,     0,     0,     0,   101,    66,
-     102,     0,   103,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   104,     0,     0,     0,   105,     0,     0,     0,
-     106,     0,     0,   107,    68,    69,    70,     0,     0,     0,
-       0,     0,     0,     0,   108,    71,     0,     0,     0,   109,
-      72,   110,    73,   111,     0,     0,     0,     0,     0,     0,
-      74,     0,   112,   113,     0,     0,     0,     0,     0,    75,
-       0,    76,     1,     2,     0,     0,    77,   114,    78,    79,
-      80,     0,     0,     0,   101,    66,   102,     0,   103,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   104,     0,
-       0,     0,   105,     0,     0,     0,   106,     0,     0,   107,
-      68,    69,    70,     0,     0,     0,     0,     0,     0,     0,
-     108,    71,     0,     0,     0,   109,    72,   110,    73,   111,
-       0,     0,     0,     0,     0,     0,    74,     0,   112,   113,
-       0,     0,     0,     0,     0,    75,     0,    76,     0,     0,
-       0,     0,    77,   114,    78,    79,    80
+      18,     6,   283,   285,    13,     6,    18,   321,   132,   346,
+     124,    87,   187,   186,   188,   194,   187,    13,   188,   200,
+     244,    10,   330,   332,   333,   266,   446,   144,   336,   337,
+      13,    51,   451,   221,    13,    14,     1,     2,   145,    87,
+      57,    58,    50,    66,    89,   196,   197,   452,    51,   129,
+     451,    66,    13,   451,    65,    88,   282,   185,   222,    50,
+     162,   267,    65,   196,   197,   452,   196,   197,   452,    13,
+      13,   163,    89,    13,    14,     1,     2,    13,   350,   144,
+     447,   219,    46,    88,   448,    66,    13,   176,   177,   389,
+     145,   306,   264,   265,     7,   125,    65,   173,   174,   175,
+      13,   176,   177,   350,   178,   179,    13,   176,   177,   399,
+     460,   156,   266,   429,   460,   413,    31,   146,   268,   273,
+     187,   186,   188,   346,   194,   322,   166,   187,   200,   188,
+     187,   130,   188,    92,    15,   360,   299,   165,   189,   195,
+     420,   180,   208,   453,   461,   167,   367,    22,   267,   168,
+     343,    94,   201,   207,   425,   459,    13,    19,   130,   230,
+     232,   453,     1,     2,   453,   185,   381,   157,   343,   146,
+     229,   231,    47,    20,   368,   343,   130,   -82,   264,   265,
+     221,   158,   181,   130,   190,    32,   191,   378,   379,   347,
+     380,   130,   331,   221,     1,     2,    33,   362,    60,   171,
+     266,   436,    34,   284,   190,   222,   130,   173,   174,   175,
+      13,   176,   177,    95,   178,   179,     1,     2,   222,   372,
+     301,   -25,    35,   174,    41,    13,   176,   177,   233,   178,
+     179,   209,   210,   302,   383,   174,   267,    13,   176,   177,
+     233,   178,   179,   255,   304,   305,   189,   256,   195,   323,
+      23,   180,   327,   208,    36,    13,   208,   395,   421,    24,
+     207,     1,     2,    37,   207,   400,   235,   207,    39,   202,
+     348,  -269,   356,    40,   356,  -269,    99,   130,   235,    52,
+      25,   371,    26,   308,   309,   310,   311,    56,   100,   101,
+     363,    27,   181,   382,   312,   257,   196,   197,    53,   258,
+     102,    67,   103,   347,   104,   423,    59,   239,    91,   203,
+      13,   176,   177,    96,   105,    97,     1,     2,   106,   239,
+     276,   127,   107,   137,   277,   108,    69,    70,    71,   393,
+     432,   434,   391,   394,   433,   435,   109,    72,   100,   101,
+     138,   110,    73,   111,    74,   112,   139,   402,   328,   402,
+     426,   329,    75,   427,   113,   114,     1,     2,   196,   197,
+     136,    76,   140,    77,   141,   416,   387,   388,    78,   115,
+      79,    80,    81,   308,   309,   310,   311,   439,   440,   147,
+     148,   116,   323,   149,   348,   151,   152,   213,   356,   155,
+     169,   170,   171,   207,   227,   259,   263,   174,   431,    13,
+     176,   177,   233,   178,   179,     1,     2,   260,   262,   278,
+     279,   280,   234,   281,   286,   297,   300,   307,   315,   431,
+     317,   325,    13,   334,   338,   416,   287,   288,   342,   357,
+     359,   361,   364,   457,   130,   366,   365,   369,   370,   373,
+     235,   236,   174,   375,    13,   176,   177,   233,   178,   179,
+       1,     2,   377,   376,   384,   385,   237,   234,   386,   174,
+     390,    13,   176,   177,   233,   178,   179,     1,     2,   392,
+     396,   397,   398,   403,   234,   238,   405,   406,   408,   411,
+     407,   239,   412,   418,   443,   235,   236,   417,   419,     8,
+     240,    21,   153,    38,    98,    93,    90,   241,   289,   126,
+     242,   237,   235,   236,   174,   228,    13,   176,   177,   233,
+     178,   179,     1,     2,   319,    13,   358,   424,   237,   422,
+     238,     1,     2,   298,   458,   172,   239,   341,   324,   349,
+     274,   441,   275,   374,    67,   240,   445,   238,   437,   318,
+       0,   442,   241,   239,   444,   242,   320,   235,   236,    68,
+     404,     0,   240,     0,     0,     0,     0,     0,     0,    69,
+      70,    71,   242,   237,     0,     0,     0,     0,     0,     0,
+      72,     0,     0,     0,     0,    73,     0,    74,     0,     0,
+       0,     0,   238,     0,     0,    75,     0,     0,   239,     0,
+       0,     0,     0,     0,    76,     0,    77,   240,   100,   101,
+       0,    78,     0,    79,    80,    81,   214,   242,     0,     0,
+     102,    67,   103,     0,   104,   215,     0,     0,     0,     0,
+       0,     0,     0,     0,   105,     0,     0,     0,   106,     0,
+       0,     0,   107,     0,     0,   108,    69,    70,    71,     0,
+       0,     0,     0,     0,   216,     0,   109,    72,     0,     0,
+       0,   110,    73,   111,    74,   112,     0,     0,     0,     0,
+       0,     0,    75,     0,   113,   114,   217,   218,     0,     0,
+       0,    76,     0,    77,   100,   101,     0,     0,    78,   115,
+      79,    80,    81,     0,     0,     0,   102,    67,   103,     0,
+     104,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     105,     0,     0,     0,   106,     0,     0,     0,   107,     0,
+       0,   108,    69,    70,    71,     0,     0,     0,     0,     0,
+       0,     0,   109,    72,     0,     0,     0,   110,    73,   111,
+      74,   112,     0,     0,     0,     0,     0,     0,    75,     0,
+     113,   114,     0,     0,     0,     0,     0,    76,     0,    77,
+       1,     2,     0,     0,    78,   115,    79,    80,    81,     0,
+       0,     0,   102,    67,   103,     0,   104,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   105,     0,     0,     0,
+     106,     0,     0,     0,   107,     0,     0,   108,    69,    70,
+      71,     0,     0,     0,     0,     0,     0,     0,   109,    72,
+       0,     0,     0,   110,    73,   111,    74,   112,     0,     0,
+       0,     0,     0,     0,    75,     0,   113,   114,     0,     0,
+       0,     0,     0,    76,     0,    77,     0,     0,     0,     0,
+      78,   115,    79,    80,    81
 };
 
 static const short yycheck[] =
 {
-       9,     0,   216,   217,   150,     4,    15,   262,   147,   148,
-      33,   283,   151,     9,    98,   271,   272,   273,     0,     9,
-       4,   277,   278,   147,    85,   147,    88,   106,   108,   151,
-      24,    40,     4,    17,    18,    19,     9,    10,    11,    35,
-     119,    40,    39,    52,    53,    17,    18,    19,    57,   110,
-       9,    60,     4,    52,    53,     9,    16,    17,    57,    51,
-       9,    60,     9,   147,     9,    17,    18,    19,    15,    16,
-      15,    16,    81,     9,    10,    22,   332,   115,     9,    10,
-      11,    35,    81,     9,    10,    94,    80,    53,    16,    17,
-     446,   298,   115,   449,    93,    94,   352,   159,    15,    16,
-      94,     6,     7,     8,     9,    10,    11,   314,    13,    14,
-      38,   107,   110,   109,   115,    81,   115,   263,   390,   115,
-     259,   113,   261,   262,   208,   209,   135,   266,   118,   167,
-     269,   115,   116,   388,   107,   259,   135,   259,   147,   148,
-     396,   225,   151,   115,   266,    50,    74,   269,   107,    10,
-      20,   150,   151,   107,    38,   115,   115,   109,   107,   168,
-     169,   115,    62,   115,    38,   112,   167,   112,   167,   168,
-     169,    44,    85,   109,    47,   259,   107,    89,   109,    89,
-      46,   109,     9,   109,    85,   113,    91,   115,    15,    16,
-      74,    57,   112,   113,   408,   108,   221,   110,   109,   283,
-      74,   109,   113,   108,    74,   113,    58,   108,    78,   110,
-     115,     6,     7,     8,     9,    10,    11,   242,    13,    14,
-      15,    16,     9,   109,    51,   294,   109,   113,    15,    16,
-     113,    89,     7,     3,     9,    10,    11,    12,    13,    14,
-     309,   310,   241,   312,   118,   266,   111,   109,   269,   388,
-     259,   113,   261,   262,   109,    50,   265,   266,   113,   397,
-     269,   345,   400,   262,   289,     9,   291,   266,    26,   353,
-     269,    15,    16,    68,   283,    50,   285,    44,   287,     9,
-      10,    11,    16,   109,    28,    15,    16,   113,   313,   112,
-      65,    25,    15,    16,    17,    18,    91,    59,     7,    43,
-       9,    10,    11,    12,    13,    14,   390,   108,   392,    53,
-      54,    55,    46,   108,    48,   109,    91,    17,    18,   108,
-      64,    34,    35,    57,    16,    69,   109,    71,    17,    18,
-     339,   102,   103,   104,   105,    79,   102,   103,   104,   105,
-     118,    50,   113,    86,    88,   354,    90,   356,     3,    15,
-      16,    95,    76,    97,    98,    99,    65,    86,   367,    56,
-      15,    16,     3,    17,    18,   423,   424,    86,   377,   108,
-     108,   118,    27,    28,    29,     3,    31,   108,   114,   388,
-     108,   390,    91,    10,     3,   394,    41,   114,   110,   388,
-      45,    40,   118,   118,    49,   116,   114,    52,    53,    54,
-      55,   108,   411,    73,   110,   110,   101,    30,    63,    64,
-     109,   101,   110,    68,    69,    70,    71,    72,   427,     5,
-     108,     9,   431,   100,    79,    93,    81,    82,    30,    73,
-      73,   111,   108,    88,   119,    90,   110,   106,   109,   111,
-      95,    96,    97,    98,    99,   108,   107,   120,     5,   111,
-      87,   111,     7,   108,     9,    10,    11,    12,    13,    14,
-      15,    16,    73,   115,   117,   113,   111,    22,   119,   109,
-       7,   109,     9,    10,    11,    12,    13,    14,    15,    16,
-     111,    36,   111,   113,   108,    22,   118,     4,   124,    15,
-      28,    81,    60,    94,    57,    50,    51,   287,     7,    36,
-       9,    10,    11,    12,    13,    14,    15,    16,   167,   259,
-     390,    66,   146,    50,    51,   394,   280,   225,   445,   284,
-     299,   263,   209,   209,   409,   403,   415,    36,   248,    66,
-      85,   427,   356,    -1,   411,    -1,    91,    -1,    -1,    -1,
-      -1,    50,    51,    -1,   261,   100,    -1,    -1,    85,    -1,
-      -1,    -1,   107,   108,    91,   110,    -1,    66,    -1,    -1,
-      -1,    -1,    -1,   100,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   108,    -1,   110,    -1,    -1,    85,    -1,    -1,    -1,
-      15,    16,    91,    -1,    -1,    -1,    -1,    -1,    23,    -1,
-      -1,   100,    27,    28,    29,    -1,    31,    32,    -1,   108,
-      -1,   110,    -1,    -1,    -1,    -1,    41,    -1,    -1,    -1,
+      10,     0,   217,   218,     9,     4,    16,   259,    99,   280,
+      89,    54,   148,   148,   148,   149,   152,     9,   152,   151,
+     171,   108,   268,   269,   270,    38,    20,   116,   274,   275,
+       9,    41,     4,    85,     9,    10,    15,    16,   116,    82,
+     112,   113,    41,    53,    54,    17,    18,    19,    58,    33,
+       4,    61,     9,     4,    53,    54,   108,   148,   110,    58,
+      46,    74,    61,    17,    18,    19,    17,    18,    19,     9,
+       9,    57,    82,     9,    10,    15,    16,     9,    35,   168,
+      74,   160,    22,    82,    78,    95,     9,    10,    11,   335,
+     168,   242,    16,    17,     0,    94,    95,     6,     7,     8,
+       9,    10,    11,    35,    13,    14,     9,    10,    11,   355,
+     454,    24,    38,   118,   458,   107,    10,   116,   209,   210,
+     256,   256,   256,   394,   258,   259,   136,   263,   260,   263,
+     266,   115,   266,   112,   109,   286,   227,   136,   148,   149,
+     392,    50,   152,   115,   116,   109,   297,   110,    74,   113,
+     107,    51,   151,   152,   400,   109,     9,    39,   115,   169,
+     170,   115,    15,    16,   115,   256,   317,    80,   107,   168,
+     169,   170,   112,   109,   300,   107,   115,   109,    16,    17,
+      85,    94,    91,   115,   107,    62,   109,   313,   314,   280,
+     316,   115,   118,    85,    15,    16,    89,   288,    51,   108,
+      38,   416,    89,   108,   107,   110,   115,     6,     7,     8,
+       9,    10,    11,   113,    13,    14,    15,    16,   110,   303,
+     106,    44,    58,     7,    47,     9,    10,    11,    12,    13,
+      14,    17,    18,   119,   318,     7,    74,     9,    10,    11,
+      12,    13,    14,   109,    34,    35,   256,   113,   258,   259,
+      16,    50,   262,   263,    89,     9,   266,   348,   392,    25,
+     259,    15,    16,     3,   263,   356,    50,   266,   111,    68,
+     280,   109,   282,    26,   284,   113,     3,   115,    50,    44,
+      46,    65,    48,   102,   103,   104,   105,   112,    15,    16,
+     289,    57,    91,    65,   113,   109,    17,    18,    59,   113,
+      27,    28,    29,   394,    31,   396,   108,    91,   109,   108,
+       9,    10,    11,   108,    41,    16,    15,    16,    45,    91,
+     109,   109,    49,    86,   113,    52,    53,    54,    55,   109,
+     109,   109,   342,   113,   113,   113,    63,    64,    15,    16,
+      86,    68,    69,    70,    71,    72,    76,   357,   263,   359,
+     401,   266,    79,   404,    81,    82,    15,    16,    17,    18,
+     118,    88,    56,    90,    86,   375,    17,    18,    95,    96,
+      97,    98,    99,   102,   103,   104,   105,   426,   427,     3,
+     108,   108,   392,   108,   394,   118,     3,    10,   398,   108,
+     114,   114,   108,   392,     3,   110,   114,     7,   408,     9,
+      10,    11,    12,    13,    14,    15,    16,   118,   118,   116,
+      40,   108,    22,    73,   110,   110,   101,   109,   101,   429,
+     110,     5,     9,    93,   100,   435,    36,    37,    30,    73,
+      73,    30,   111,   443,   115,   108,   111,   119,   106,   110,
+      50,    51,     7,   108,     9,    10,    11,    12,    13,    14,
+      15,    16,   107,   111,   111,   111,    66,    22,     5,     7,
+      87,     9,    10,    11,    12,    13,    14,    15,    16,   117,
+      73,   109,   113,   109,    22,    85,   111,   108,   120,   111,
+     109,    91,   119,   111,   118,    50,    51,   113,   108,     4,
+     100,    16,   125,    29,    82,    61,    58,   107,   108,    95,
+     110,    66,    50,    51,     7,   168,     9,    10,    11,    12,
+      13,    14,    15,    16,   256,     9,   284,   398,    66,   394,
+      85,    15,    16,   227,   453,   147,    91,   277,   260,   281,
+     210,   428,   210,   304,    28,   100,   435,    85,   417,   248,
+      -1,   429,   107,    91,   433,   110,   258,    50,    51,    43,
+     359,    -1,   100,    -1,    -1,    -1,    -1,    -1,    -1,    53,
+      54,    55,   110,    66,    -1,    -1,    -1,    -1,    -1,    -1,
+      64,    -1,    -1,    -1,    -1,    69,    -1,    71,    -1,    -1,
+      -1,    -1,    85,    -1,    -1,    79,    -1,    -1,    91,    -1,
+      -1,    -1,    -1,    -1,    88,    -1,    90,   100,    15,    16,
+      -1,    95,    -1,    97,    98,    99,    23,   110,    -1,    -1,
+      27,    28,    29,    -1,    31,    32,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    41,    -1,    -1,    -1,    45,    -1,
+      -1,    -1,    49,    -1,    -1,    52,    53,    54,    55,    -1,
+      -1,    -1,    -1,    -1,    61,    -1,    63,    64,    -1,    -1,
+      -1,    68,    69,    70,    71,    72,    -1,    -1,    -1,    -1,
+      -1,    -1,    79,    -1,    81,    82,    83,    84,    -1,    -1,
+      -1,    88,    -1,    90,    15,    16,    -1,    -1,    95,    96,
+      97,    98,    99,    -1,    -1,    -1,    27,    28,    29,    -1,
+      31,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      41,    -1,    -1,    -1,    45,    -1,    -1,    -1,    49,    -1,
+      -1,    52,    53,    54,    55,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    63,    64,    -1,    -1,    -1,    68,    69,    70,
+      71,    72,    -1,    -1,    -1,    -1,    -1,    -1,    79,    -1,
+      81,    82,    -1,    -1,    -1,    -1,    -1,    88,    -1,    90,
+      15,    16,    -1,    -1,    95,    96,    97,    98,    99,    -1,
+      -1,    -1,    27,    28,    29,    -1,    31,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    41,    -1,    -1,    -1,
       45,    -1,    -1,    -1,    49,    -1,    -1,    52,    53,    54,
-      55,    -1,    -1,    -1,    -1,    -1,    61,    -1,    63,    64,
+      55,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    63,    64,
       -1,    -1,    -1,    68,    69,    70,    71,    72,    -1,    -1,
-      -1,    -1,    -1,    -1,    79,    -1,    81,    82,    83,    84,
-      -1,    -1,    -1,    88,    -1,    90,    15,    16,    -1,    -1,
-      95,    96,    97,    98,    99,    -1,    -1,    -1,    27,    28,
-      29,    -1,    31,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    41,    -1,    -1,    -1,    45,    -1,    -1,    -1,
-      49,    -1,    -1,    52,    53,    54,    55,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    63,    64,    -1,    -1,    -1,    68,
-      69,    70,    71,    72,    -1,    -1,    -1,    -1,    -1,    -1,
-      79,    -1,    81,    82,    -1,    -1,    -1,    -1,    -1,    88,
-      -1,    90,    15,    16,    -1,    -1,    95,    96,    97,    98,
-      99,    -1,    -1,    -1,    27,    28,    29,    -1,    31,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    41,    -1,
-      -1,    -1,    45,    -1,    -1,    -1,    49,    -1,    -1,    52,
-      53,    54,    55,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      63,    64,    -1,    -1,    -1,    68,    69,    70,    71,    72,
-      -1,    -1,    -1,    -1,    -1,    -1,    79,    -1,    81,    82,
-      -1,    -1,    -1,    -1,    -1,    88,    -1,    90,    -1,    -1,
-      -1,    -1,    95,    96,    97,    98,    99
+      -1,    -1,    -1,    -1,    79,    -1,    81,    82,    -1,    -1,
+      -1,    -1,    -1,    88,    -1,    90,    -1,    -1,    -1,    -1,
+      95,    96,    97,    98,    99
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
    symbol of state STATE-NUM.  */
 static const unsigned char yystos[] =
 {
-       0,    15,    16,   122,   123,   124,   229,     0,   124,   108,
-     125,   126,     9,    10,   109,   127,   128,   232,    39,   109,
-     128,   110,    16,    25,    46,    48,    57,   129,   130,   131,
-      10,    62,    89,    89,    58,    89,     3,   131,   111,    26,
-      47,   132,   133,   144,   145,    22,   112,   146,   147,   229,
-     232,    44,    59,   137,   138,   112,   112,   113,   108,    51,
-     139,   141,   142,   143,   229,   232,    28,    43,    53,    54,
-      55,    64,    69,    71,    79,    88,    90,    95,    97,    98,
-      99,   134,   135,   149,   151,   181,   191,   229,   232,   147,
-     109,   112,   141,    51,   113,   108,    16,   135,     3,    15,
-      16,    27,    29,    31,    41,    45,    49,    52,    63,    68,
-      70,    72,    81,    82,    96,   108,   150,   175,   188,   189,
-     190,   191,   230,   150,   229,   143,   109,   136,    33,   115,
-     161,   171,   224,   225,   226,   118,    86,    86,    76,    56,
-      86,   152,   153,   188,   189,   229,     3,   108,   108,   219,
-     118,     3,   126,   140,   108,    24,    80,    94,   227,   172,
-     173,    46,    57,   228,   229,   232,   109,   113,   114,   114,
-     108,   148,     6,     7,     8,    10,    11,    13,    14,    50,
-      91,   148,   154,   155,   171,   184,   186,   222,   232,   107,
-     109,   220,   221,   222,   232,    17,    18,   176,   177,   178,
-     229,    68,   108,   182,   184,   185,   229,   232,    17,    18,
-     163,   164,    10,    23,    32,    61,    83,    84,   150,   174,
-      85,   110,   195,   196,   197,     3,   153,   229,   232,   229,
-     232,    12,    22,    36,    50,    51,    66,    85,    91,   100,
-     107,   108,   110,   186,   198,   199,   200,   203,   204,   205,
-     206,   211,   212,   213,   222,   223,   229,   232,   109,   113,
-     109,   113,   110,   118,   183,   118,   114,    16,    17,    38,
-      74,   171,   179,   180,   217,   218,   171,   179,   180,   109,
-     113,   116,    40,   108,    73,   108,   195,   108,   195,   110,
-     198,   110,   161,   171,   101,    30,   106,   119,   202,    34,
-      35,   229,   198,   109,   102,   103,   104,   105,   113,   192,
-     193,   101,   194,   110,   202,   108,   155,   221,   185,   222,
-     232,   177,     5,   187,   232,   182,   182,   217,   118,   217,
-     217,    93,   162,   217,   217,   100,   165,   166,   164,    30,
-     107,   159,   160,   170,   171,   232,   175,    35,   156,   157,
-     158,   170,   171,   232,    73,   156,    73,   198,   111,   198,
-     200,   108,   119,   106,    65,   204,   197,   108,   109,   111,
-     107,   200,   200,   200,   198,    65,   204,   120,   214,   215,
-     111,   111,     5,    17,    18,   217,    87,   232,   117,   109,
-     113,   171,    73,   109,   113,   217,   171,   231,   232,   109,
-     231,   111,   111,   201,   119,   107,   207,   208,   232,   113,
-     111,   118,   216,   232,   109,   113,   108,   185,   222,   160,
-     171,   158,   217,   224,   224,   187,   109,   113,   195,   199,
-     216,   118,   215,   167,   173,   173,   208,    20,    74,    78,
-     209,   210,   232,     4,    19,   115,   168,   169,   178,   168,
-     109,   169,   116
+       0,    15,    16,   122,   123,   124,   234,     0,   124,   125,
+     108,   126,   127,     9,    10,   109,   128,   129,   237,    39,
+     109,   129,   110,    16,    25,    46,    48,    57,   130,   131,
+     132,    10,    62,    89,    89,    58,    89,     3,   132,   111,
+      26,    47,   133,   134,   145,   146,    22,   112,   147,   148,
+     234,   237,    44,    59,   138,   139,   112,   112,   113,   108,
+      51,   140,   142,   143,   144,   234,   237,    28,    43,    53,
+      54,    55,    64,    69,    71,    79,    88,    90,    95,    97,
+      98,    99,   135,   136,   150,   152,   182,   192,   234,   237,
+     148,   109,   112,   142,    51,   113,   108,    16,   136,     3,
+      15,    16,    27,    29,    31,    41,    45,    49,    52,    63,
+      68,    70,    72,    81,    82,    96,   108,   151,   176,   189,
+     190,   191,   192,   235,   151,   234,   144,   109,   137,    33,
+     115,   162,   172,   229,   230,   231,   118,    86,    86,    76,
+      56,    86,   153,   154,   189,   190,   234,     3,   108,   108,
+     224,   118,     3,   127,   141,   108,    24,    80,    94,   232,
+     173,   174,    46,    57,   233,   234,   237,   109,   113,   114,
+     114,   108,   149,     6,     7,     8,    10,    11,    13,    14,
+      50,    91,   149,   155,   156,   172,   185,   187,   227,   237,
+     107,   109,   225,   226,   227,   237,    17,    18,   177,   178,
+     179,   234,    68,   108,   183,   185,   186,   234,   237,    17,
+      18,   164,   165,    10,    23,    32,    61,    83,    84,   151,
+     175,    85,   110,   196,   197,   198,   199,     3,   154,   234,
+     237,   234,   237,    12,    22,    50,    51,    66,    85,    91,
+     100,   107,   110,   187,   200,   201,   202,   203,   204,   205,
+     206,   227,   228,   234,   237,   109,   113,   109,   113,   110,
+     118,   184,   118,   114,    16,    17,    38,    74,   172,   180,
+     181,   222,   223,   172,   180,   181,   109,   113,   116,    40,
+     108,    73,   108,   196,   108,   196,   110,    36,    37,   108,
+     200,   211,   212,   214,   216,   217,   218,   110,   162,   172,
+     101,   106,   119,   215,    34,    35,   200,   109,   102,   103,
+     104,   105,   113,   193,   194,   101,   195,   110,   215,   156,
+     226,   186,   227,   237,   178,     5,   188,   237,   183,   183,
+     222,   118,   222,   222,    93,   163,   222,   222,   100,   166,
+     167,   165,    30,   107,   160,   161,   171,   172,   237,   176,
+      35,   157,   158,   159,   171,   172,   237,    73,   157,    73,
+     200,    30,   172,   234,   111,   111,   108,   200,   202,   119,
+     106,    65,   204,   110,   199,   108,   111,   107,   202,   202,
+     202,   200,    65,   204,   111,   111,     5,    17,    18,   222,
+      87,   237,   117,   109,   113,   172,    73,   109,   113,   222,
+     172,   236,   237,   109,   236,   111,   108,   109,   120,   219,
+     220,   111,   119,   107,   207,   208,   237,   113,   111,   108,
+     186,   227,   161,   172,   159,   222,   229,   229,   213,   118,
+     221,   237,   109,   113,   109,   113,   196,   201,   168,   174,
+     174,   188,   221,   118,   220,   208,    20,    74,    78,   209,
+     210,     4,    19,   115,   169,   170,   179,   237,   169,   109,
+     170,   116
 };
 
 #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
@@ -1819,14 +1835,14 @@
   switch (yyn)
     {
         case 2:
-#line 343 "asn1p_y.y"
+#line 350 "asn1p_y.y"
     {
 		*(void **)param = yyvsp[0].a_grammar;
 	}
     break;
 
   case 3:
-#line 349 "asn1p_y.y"
+#line 356 "asn1p_y.y"
     {
 		yyval.a_grammar = asn1p_new();
 		checkmem(yyval.a_grammar);
@@ -1835,7 +1851,7 @@
     break;
 
   case 4:
-#line 354 "asn1p_y.y"
+#line 361 "asn1p_y.y"
     {
 		yyval.a_grammar = yyvsp[-1].a_grammar;
 		TQ_ADD(&(yyval.a_grammar->modules), yyvsp[0].a_module, mod_next);
@@ -1843,49 +1859,57 @@
     break;
 
   case 5:
-#line 375 "asn1p_y.y"
+#line 378 "asn1p_y.y"
+    { currentModule = asn1p_module_new(); }
+    break;
+
+  case 6:
+#line 383 "asn1p_y.y"
     {
 
+		yyval.a_module = currentModule;
+
 		if(yyvsp[-1].a_module) {
-			yyval.a_module = yyvsp[-1].a_module;
+			asn1p_module_t tmp = *(yyval.a_module);
+			*(yyval.a_module) = *(yyvsp[-1].a_module);
+			*(yyvsp[-1].a_module) = tmp;
+			asn1p_module_free(yyvsp[-1].a_module);
 		} else {
 			/* There's a chance that a module is just plain empty */
-			yyval.a_module = asn1p_module_new();
 		}
-		checkmem(yyval.a_module);
 
-		yyval.a_module->ModuleName = yyvsp[-7].tv_str;
+		yyval.a_module->ModuleName = yyvsp[-8].tv_str;
 		yyval.a_module->module_oid = yyvsp[-6].a_oid;
 		yyval.a_module->module_flags = yyvsp[-4].a_module_flags;
 	}
     break;
 
-  case 6:
-#line 396 "asn1p_y.y"
+  case 7:
+#line 407 "asn1p_y.y"
     { yyval.a_oid = 0; }
     break;
 
-  case 7:
-#line 397 "asn1p_y.y"
+  case 8:
+#line 408 "asn1p_y.y"
     { yyval.a_oid = yyvsp[0].a_oid; }
     break;
 
-  case 8:
-#line 401 "asn1p_y.y"
+  case 9:
+#line 412 "asn1p_y.y"
     {
 		yyval.a_oid = yyvsp[-1].a_oid;
 	}
     break;
 
-  case 9:
-#line 404 "asn1p_y.y"
+  case 10:
+#line 415 "asn1p_y.y"
     {
 		yyval.a_oid = 0;
 	}
     break;
 
-  case 10:
-#line 410 "asn1p_y.y"
+  case 11:
+#line 421 "asn1p_y.y"
     {
 		yyval.a_oid = asn1p_oid_new();
 		asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc);
@@ -1894,8 +1918,8 @@
 	}
     break;
 
-  case 11:
-#line 416 "asn1p_y.y"
+  case 12:
+#line 427 "asn1p_y.y"
     {
 		yyval.a_oid = yyvsp[-1].a_oid;
 		asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc);
@@ -1904,86 +1928,86 @@
 	}
     break;
 
-  case 12:
-#line 425 "asn1p_y.y"
+  case 13:
+#line 436 "asn1p_y.y"
     {					/* iso */
 		yyval.a_oid_arc.name = yyvsp[0].tv_str;
 		yyval.a_oid_arc.number = -1;
 	}
     break;
 
-  case 13:
-#line 429 "asn1p_y.y"
+  case 14:
+#line 440 "asn1p_y.y"
     {		/* iso(1) */
 		yyval.a_oid_arc.name = yyvsp[-3].tv_str;
 		yyval.a_oid_arc.number = yyvsp[-1].a_int;
 	}
     break;
 
-  case 14:
-#line 433 "asn1p_y.y"
+  case 15:
+#line 444 "asn1p_y.y"
     {					/* 1 */
 		yyval.a_oid_arc.name = 0;
 		yyval.a_oid_arc.number = yyvsp[0].a_int;
 	}
     break;
 
-  case 15:
-#line 443 "asn1p_y.y"
+  case 16:
+#line 454 "asn1p_y.y"
     { yyval.a_module_flags = MSF_NOFLAGS; }
     break;
 
-  case 16:
-#line 444 "asn1p_y.y"
-    {
-		yyval.a_module_flags = yyvsp[0].a_module_flags;
-	}
-    break;
-
   case 17:
-#line 453 "asn1p_y.y"
+#line 455 "asn1p_y.y"
     {
 		yyval.a_module_flags = yyvsp[0].a_module_flags;
 	}
     break;
 
   case 18:
-#line 456 "asn1p_y.y"
+#line 464 "asn1p_y.y"
+    {
+		yyval.a_module_flags = yyvsp[0].a_module_flags;
+	}
+    break;
+
+  case 19:
+#line 467 "asn1p_y.y"
     {
 		yyval.a_module_flags = yyvsp[-1].a_module_flags | yyvsp[0].a_module_flags;
 	}
     break;
 
-  case 19:
-#line 465 "asn1p_y.y"
+  case 20:
+#line 476 "asn1p_y.y"
     {
 		yyval.a_module_flags = MSF_EXPLICIT_TAGS;
 	}
     break;
 
-  case 20:
-#line 468 "asn1p_y.y"
+  case 21:
+#line 479 "asn1p_y.y"
     {
 		yyval.a_module_flags = MSF_IMPLICIT_TAGS;
 	}
     break;
 
-  case 21:
-#line 471 "asn1p_y.y"
+  case 22:
+#line 482 "asn1p_y.y"
     {
 		yyval.a_module_flags = MSF_AUTOMATIC_TAGS;
 	}
     break;
 
-  case 22:
-#line 474 "asn1p_y.y"
+  case 23:
+#line 485 "asn1p_y.y"
     {
 		yyval.a_module_flags = MSF_EXTENSIBILITY_IMPLIED;
 	}
     break;
 
-  case 23:
-#line 478 "asn1p_y.y"
+  case 24:
+#line 489 "asn1p_y.y"
     {
 		/* X.680Amd1 specifies TAG and XER */
 		if(strcmp(yyvsp[-1].tv_str, "TAG") == 0) {
@@ -2001,20 +2025,20 @@
 	}
     break;
 
-  case 24:
-#line 499 "asn1p_y.y"
+  case 25:
+#line 510 "asn1p_y.y"
     { yyval.a_module = 0; }
     break;
 
-  case 25:
-#line 500 "asn1p_y.y"
+  case 26:
+#line 511 "asn1p_y.y"
     {
 		yyval.a_module = yyvsp[0].a_module;
 	}
     break;
 
-  case 26:
-#line 509 "asn1p_y.y"
+  case 27:
+#line 520 "asn1p_y.y"
     {
 		yyval.a_module = asn1p_module_new();
 		AL_IMPORT(yyval.a_module, exports, yyvsp[-2].a_module, xp_next);
@@ -2023,15 +2047,15 @@
 	}
     break;
 
-  case 27:
-#line 518 "asn1p_y.y"
+  case 28:
+#line 529 "asn1p_y.y"
     {
 		yyval.a_module = yyvsp[0].a_module;
 	}
     break;
 
-  case 28:
-#line 521 "asn1p_y.y"
+  case 29:
+#line 532 "asn1p_y.y"
     {
 		if(yyvsp[-1].a_module) {
 			yyval.a_module = yyvsp[-1].a_module;
@@ -2043,19 +2067,8 @@
 	}
     break;
 
-  case 29:
-#line 537 "asn1p_y.y"
-    {
-		yyval.a_module = asn1p_module_new();
-		checkmem(yyval.a_module);
-		assert(yyvsp[0].a_expr->expr_type != A1TC_INVALID);
-		assert(yyvsp[0].a_expr->meta_type != AMT_INVALID);
-		TQ_ADD(&(yyval.a_module->members), yyvsp[0].a_expr, next);
-	}
-    break;
-
   case 30:
-#line 544 "asn1p_y.y"
+#line 548 "asn1p_y.y"
     {
 		yyval.a_module = asn1p_module_new();
 		checkmem(yyval.a_module);
@@ -2066,7 +2079,7 @@
     break;
 
   case 31:
-#line 557 "asn1p_y.y"
+#line 555 "asn1p_y.y"
     {
 		yyval.a_module = asn1p_module_new();
 		checkmem(yyval.a_module);
@@ -2077,12 +2090,23 @@
     break;
 
   case 32:
-#line 565 "asn1p_y.y"
-    { asn1p_lexer_hack_push_encoding_control(); }
+#line 568 "asn1p_y.y"
+    {
+		yyval.a_module = asn1p_module_new();
+		checkmem(yyval.a_module);
+		assert(yyvsp[0].a_expr->expr_type != A1TC_INVALID);
+		assert(yyvsp[0].a_expr->meta_type != AMT_INVALID);
+		TQ_ADD(&(yyval.a_module->members), yyvsp[0].a_expr, next);
+	}
     break;
 
   case 33:
-#line 566 "asn1p_y.y"
+#line 576 "asn1p_y.y"
+    { asn1p_lexer_hack_push_encoding_control(); }
+    break;
+
+  case 34:
+#line 577 "asn1p_y.y"
     {
 		fprintf(stderr,
 			"WARNING: ENCODING-CONTROL %s "
@@ -2093,8 +2117,8 @@
 	}
     break;
 
-  case 34:
-#line 578 "asn1p_y.y"
+  case 35:
+#line 589 "asn1p_y.y"
     {
 		return yyerror(
 			"Attempt to redefine a standard basic string type, "
@@ -2102,13 +2126,13 @@
 	}
     break;
 
-  case 35:
-#line 591 "asn1p_y.y"
+  case 36:
+#line 602 "asn1p_y.y"
     { yyval.a_module = 0; }
     break;
 
-  case 37:
-#line 595 "asn1p_y.y"
+  case 38:
+#line 606 "asn1p_y.y"
     {
 		if(!saved_aid && 0)
 			return yyerror("Unterminated IMPORTS FROM, "
@@ -2118,15 +2142,15 @@
 	}
     break;
 
-  case 38:
-#line 605 "asn1p_y.y"
+  case 39:
+#line 616 "asn1p_y.y"
     {
 		return yyerror("Empty IMPORTS list");
 	}
     break;
 
-  case 39:
-#line 611 "asn1p_y.y"
+  case 40:
+#line 622 "asn1p_y.y"
     {
 		yyval.a_module = asn1p_module_new();
 		checkmem(yyval.a_module);
@@ -2134,26 +2158,26 @@
 	}
     break;
 
-  case 40:
-#line 616 "asn1p_y.y"
+  case 41:
+#line 627 "asn1p_y.y"
     {
 		yyval.a_module = yyvsp[-1].a_module;
 		TQ_ADD(&(yyval.a_module->imports), yyvsp[0].a_xports, xp_next);
 	}
     break;
 
-  case 41:
-#line 623 "asn1p_y.y"
+  case 42:
+#line 634 "asn1p_y.y"
     { memset(&yyval.a_aid, 0, sizeof(yyval.a_aid)); }
     break;
 
-  case 42:
-#line 624 "asn1p_y.y"
+  case 43:
+#line 635 "asn1p_y.y"
     { yyval.a_aid.oid = yyvsp[0].a_oid; }
     break;
 
-  case 43:
-#line 628 "asn1p_y.y"
+  case 44:
+#line 639 "asn1p_y.y"
     {
 		yyval.a_xports = yyvsp[-3].a_xports;
 		yyval.a_xports->fromModuleName = yyvsp[-1].tv_str;
@@ -2164,8 +2188,8 @@
 	}
     break;
 
-  case 44:
-#line 639 "asn1p_y.y"
+  case 45:
+#line 650 "asn1p_y.y"
     {
 		yyval.a_xports = asn1p_xports_new();
 		checkmem(yyval.a_xports);
@@ -2173,51 +2197,51 @@
 	}
     break;
 
-  case 45:
-#line 644 "asn1p_y.y"
+  case 46:
+#line 655 "asn1p_y.y"
     {
 		yyval.a_xports = yyvsp[-2].a_xports;
 		TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next);
 	}
     break;
 
-  case 46:
-#line 651 "asn1p_y.y"
+  case 47:
+#line 662 "asn1p_y.y"
     {
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
 		yyval.a_expr->Identifier = yyvsp[0].tv_str;
 		yyval.a_expr->expr_type = A1TC_REFERENCE;
 	}
     break;
 
-  case 47:
-#line 657 "asn1p_y.y"
+  case 48:
+#line 668 "asn1p_y.y"
     {		/* Completely equivalent to above */
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
 		yyval.a_expr->Identifier = yyvsp[-2].tv_str;
 		yyval.a_expr->expr_type = A1TC_REFERENCE;
 	}
     break;
 
-  case 48:
-#line 663 "asn1p_y.y"
+  case 49:
+#line 674 "asn1p_y.y"
     {
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
 		yyval.a_expr->Identifier = yyvsp[0].tv_str;
 		yyval.a_expr->expr_type = A1TC_REFERENCE;
 	}
     break;
 
-  case 49:
-#line 673 "asn1p_y.y"
+  case 50:
+#line 684 "asn1p_y.y"
     { yyval.a_module = 0; }
     break;
 
-  case 50:
-#line 674 "asn1p_y.y"
+  case 51:
+#line 685 "asn1p_y.y"
     {
 		yyval.a_module = asn1p_module_new();
 		checkmem(yyval.a_module);
@@ -2229,22 +2253,22 @@
 	}
     break;
 
-  case 51:
-#line 686 "asn1p_y.y"
+  case 52:
+#line 697 "asn1p_y.y"
     {
 		yyval.a_xports = yyvsp[-1].a_xports;
 	}
     break;
 
-  case 52:
-#line 689 "asn1p_y.y"
+  case 53:
+#line 700 "asn1p_y.y"
     {
 		yyval.a_xports = 0;
 	}
     break;
 
-  case 53:
-#line 692 "asn1p_y.y"
+  case 54:
+#line 703 "asn1p_y.y"
     {
 		/* Empty EXPORTS clause effectively prohibits export. */
 		yyval.a_xports = asn1p_xports_new();
@@ -2252,8 +2276,8 @@
 	}
     break;
 
-  case 54:
-#line 700 "asn1p_y.y"
+  case 55:
+#line 711 "asn1p_y.y"
     {
 		yyval.a_xports = asn1p_xports_new();
 		assert(yyval.a_xports);
@@ -2261,51 +2285,51 @@
 	}
     break;
 
-  case 55:
-#line 705 "asn1p_y.y"
+  case 56:
+#line 716 "asn1p_y.y"
     {
 		yyval.a_xports = yyvsp[-2].a_xports;
 		TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next);
 	}
     break;
 
-  case 56:
-#line 712 "asn1p_y.y"
+  case 57:
+#line 723 "asn1p_y.y"
     {
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
 		yyval.a_expr->Identifier = yyvsp[0].tv_str;
 		yyval.a_expr->expr_type = A1TC_EXPORTVAR;
 	}
     break;
 
-  case 57:
-#line 718 "asn1p_y.y"
+  case 58:
+#line 729 "asn1p_y.y"
     {
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
 		yyval.a_expr->Identifier = yyvsp[-2].tv_str;
 		yyval.a_expr->expr_type = A1TC_EXPORTVAR;
 	}
     break;
 
-  case 58:
-#line 724 "asn1p_y.y"
+  case 59:
+#line 735 "asn1p_y.y"
     {
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
 		yyval.a_expr->Identifier = yyvsp[0].tv_str;
 		yyval.a_expr->expr_type = A1TC_EXPORTVAR;
 	}
     break;
 
-  case 59:
-#line 733 "asn1p_y.y"
+  case 60:
+#line 744 "asn1p_y.y"
     { yyval.a_constr = yyvsp[-1].a_constr; }
     break;
 
-  case 60:
-#line 736 "asn1p_y.y"
+  case 61:
+#line 747 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		assert(yyval.a_expr->Identifier == 0);
@@ -2315,17 +2339,17 @@
 	}
     break;
 
-  case 61:
-#line 746 "asn1p_y.y"
+  case 62:
+#line 757 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[0].a_expr;
 	}
     break;
 
-  case 62:
-#line 759 "asn1p_y.y"
+  case 63:
+#line 770 "asn1p_y.y"
     {
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
 		yyval.a_expr->reference = yyvsp[0].a_ref;
 		yyval.a_expr->expr_type = A1TC_REFERENCE;
@@ -2333,10 +2357,10 @@
 	}
     break;
 
-  case 63:
-#line 769 "asn1p_y.y"
+  case 64:
+#line 780 "asn1p_y.y"
     {
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
 		yyval.a_expr->reference = yyvsp[-3].a_ref;
 		yyval.a_expr->rhs_pspecs = yyvsp[-1].a_expr;
@@ -2345,8 +2369,8 @@
 	}
     break;
 
-  case 64:
-#line 789 "asn1p_y.y"
+  case 65:
+#line 800 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[0].a_expr;
 		yyval.a_expr->Identifier = yyvsp[-2].tv_str;
@@ -2355,8 +2379,8 @@
 	}
     break;
 
-  case 65:
-#line 795 "asn1p_y.y"
+  case 66:
+#line 806 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[0].a_expr;
 		yyval.a_expr->Identifier = yyvsp[-2].tv_str;
@@ -2365,17 +2389,8 @@
 	}
     break;
 
-  case 66:
-#line 811 "asn1p_y.y"
-    {
-		yyval.a_expr = yyvsp[0].a_expr;
-		yyval.a_expr->Identifier = yyvsp[-5].tv_str;
-		yyval.a_expr->lhs_params = yyvsp[-3].a_plist;
-	}
-    break;
-
   case 67:
-#line 817 "asn1p_y.y"
+#line 822 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[0].a_expr;
 		yyval.a_expr->Identifier = yyvsp[-5].tv_str;
@@ -2384,7 +2399,16 @@
     break;
 
   case 68:
-#line 825 "asn1p_y.y"
+#line 828 "asn1p_y.y"
+    {
+		yyval.a_expr = yyvsp[0].a_expr;
+		yyval.a_expr->Identifier = yyvsp[-5].tv_str;
+		yyval.a_expr->lhs_params = yyvsp[-3].a_plist;
+	}
+    break;
+
+  case 69:
+#line 836 "asn1p_y.y"
     {
 		int ret;
 		yyval.a_plist = asn1p_paramlist_new(yylineno);
@@ -2396,8 +2420,8 @@
 	}
     break;
 
-  case 69:
-#line 834 "asn1p_y.y"
+  case 70:
+#line 845 "asn1p_y.y"
     {
 		int ret;
 		yyval.a_plist = yyvsp[-2].a_plist;
@@ -2408,27 +2432,16 @@
 	}
     break;
 
-  case 70:
-#line 845 "asn1p_y.y"
+  case 71:
+#line 856 "asn1p_y.y"
     {
 		yyval.a_parg.governor = NULL;
 		yyval.a_parg.argument = yyvsp[0].tv_str;
 	}
     break;
 
-  case 71:
-#line 849 "asn1p_y.y"
-    {
-		int ret;
-		yyval.a_parg.governor = asn1p_ref_new(yylineno);
-		ret = asn1p_ref_add_component(yyval.a_parg.governor, yyvsp[-2].tv_str, 0);
-		checkmem(ret == 0);
-		yyval.a_parg.argument = yyvsp[0].tv_str;
-	}
-    break;
-
   case 72:
-#line 856 "asn1p_y.y"
+#line 860 "asn1p_y.y"
     {
 		int ret;
 		yyval.a_parg.governor = asn1p_ref_new(yylineno);
@@ -2439,19 +2452,18 @@
     break;
 
   case 73:
-#line 863 "asn1p_y.y"
+#line 867 "asn1p_y.y"
     {
 		int ret;
 		yyval.a_parg.governor = asn1p_ref_new(yylineno);
-		ret = asn1p_ref_add_component(yyval.a_parg.governor,
-			ASN_EXPR_TYPE2STR(yyvsp[-2].a_type), 1);
+		ret = asn1p_ref_add_component(yyval.a_parg.governor, yyvsp[-2].tv_str, 0);
 		checkmem(ret == 0);
 		yyval.a_parg.argument = yyvsp[0].tv_str;
 	}
     break;
 
   case 74:
-#line 871 "asn1p_y.y"
+#line 874 "asn1p_y.y"
     {
 		int ret;
 		yyval.a_parg.governor = asn1p_ref_new(yylineno);
@@ -2465,31 +2477,43 @@
   case 75:
 #line 882 "asn1p_y.y"
     {
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		int ret;
+		yyval.a_parg.governor = asn1p_ref_new(yylineno);
+		ret = asn1p_ref_add_component(yyval.a_parg.governor,
+			ASN_EXPR_TYPE2STR(yyvsp[-2].a_type), 1);
+		checkmem(ret == 0);
+		yyval.a_parg.argument = yyvsp[0].tv_str;
+	}
+    break;
+
+  case 76:
+#line 893 "asn1p_y.y"
+    {
+		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
 	}
     break;
 
-  case 76:
-#line 887 "asn1p_y.y"
+  case 77:
+#line 898 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
 	}
     break;
 
-  case 77:
-#line 894 "asn1p_y.y"
+  case 78:
+#line 905 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[0].a_expr;
 	}
     break;
 
-  case 78:
-#line 897 "asn1p_y.y"
+  case 79:
+#line 908 "asn1p_y.y"
     {
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
 		yyval.a_expr->Identifier = "?";
 		yyval.a_expr->expr_type = A1TC_REFERENCE;
@@ -2498,11 +2522,11 @@
 	}
     break;
 
-  case 79:
-#line 905 "asn1p_y.y"
+  case 80:
+#line 916 "asn1p_y.y"
     {
 		asn1p_ref_t *ref;
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
 		yyval.a_expr->Identifier = yyvsp[0].tv_str;
 		yyval.a_expr->expr_type = A1TC_REFERENCE;
@@ -2513,45 +2537,45 @@
 	}
     break;
 
-  case 80:
-#line 916 "asn1p_y.y"
+  case 81:
+#line 927 "asn1p_y.y"
     {
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
 		yyval.a_expr->expr_type = A1TC_VALUESET;
 		yyval.a_expr->meta_type = AMT_VALUESET;
 		yyval.a_expr->constraints = yyvsp[0].a_constr;
 	}
     break;
 
-  case 81:
-#line 939 "asn1p_y.y"
-    { yyval.a_expr = asn1p_expr_new(yylineno); }
-    break;
-
   case 82:
-#line 940 "asn1p_y.y"
-    { yyval.a_expr = yyvsp[0].a_expr; }
+#line 950 "asn1p_y.y"
+    { yyval.a_expr = NEW_EXPR(); }
     break;
 
   case 83:
-#line 943 "asn1p_y.y"
+#line 951 "asn1p_y.y"
+    { yyval.a_expr = yyvsp[0].a_expr; }
+    break;
+
+  case 84:
+#line 954 "asn1p_y.y"
     {
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
 	}
     break;
 
-  case 84:
-#line 948 "asn1p_y.y"
+  case 85:
+#line 959 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
 	}
     break;
 
-  case 85:
-#line 955 "asn1p_y.y"
+  case 86:
+#line 966 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[-1].a_expr;
 		assert(yyval.a_expr->Identifier == 0);
@@ -2561,8 +2585,8 @@
 	}
     break;
 
-  case 86:
-#line 962 "asn1p_y.y"
+  case 87:
+#line 973 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[-1].a_expr;
 		yyvsp[0].a_marker.flags |= yyval.a_expr->marker.flags;
@@ -2571,10 +2595,10 @@
 	}
     break;
 
-  case 87:
-#line 968 "asn1p_y.y"
+  case 88:
+#line 979 "asn1p_y.y"
     {
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
 		yyval.a_expr->meta_type = yyvsp[0].a_expr->meta_type;
 		yyval.a_expr->expr_type = A1TC_COMPONENTS_OF;
@@ -2582,32 +2606,32 @@
 	}
     break;
 
-  case 88:
-#line 975 "asn1p_y.y"
+  case 89:
+#line 986 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[0].a_expr;
 	}
     break;
 
-  case 89:
-#line 981 "asn1p_y.y"
+  case 90:
+#line 992 "asn1p_y.y"
     {
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
 	}
     break;
 
-  case 90:
-#line 986 "asn1p_y.y"
+  case 91:
+#line 997 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
 	}
     break;
 
-  case 91:
-#line 993 "asn1p_y.y"
+  case 92:
+#line 1004 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[0].a_expr;
 		assert(yyval.a_expr->Identifier == 0);
@@ -2615,23 +2639,23 @@
 	}
     break;
 
-  case 92:
-#line 998 "asn1p_y.y"
+  case 93:
+#line 1009 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[0].a_expr;
 	}
     break;
 
-  case 93:
-#line 1001 "asn1p_y.y"
+  case 94:
+#line 1012 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[0].a_expr;
 		_fixup_anonymous_identifier(yyval.a_expr);
 	}
     break;
 
-  case 94:
-#line 1008 "asn1p_y.y"
+  case 95:
+#line 1019 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		checkmem(yyval.a_expr);
@@ -2641,20 +2665,20 @@
 	}
     break;
 
-  case 95:
-#line 1018 "asn1p_y.y"
+  case 96:
+#line 1029 "asn1p_y.y"
     { yyval.a_int = 0; }
     break;
 
-  case 96:
-#line 1019 "asn1p_y.y"
+  case 97:
+#line 1030 "asn1p_y.y"
     { yyval.a_int = 1; }
     break;
 
-  case 97:
-#line 1023 "asn1p_y.y"
+  case 98:
+#line 1034 "asn1p_y.y"
     {
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
 		yyval.a_expr->expr_type = A1TC_CLASSDEF;
 		yyval.a_expr->meta_type = AMT_OBJECTCLASS;
@@ -2662,18 +2686,18 @@
 	}
     break;
 
-  case 98:
-#line 1030 "asn1p_y.y"
+  case 99:
+#line 1041 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
 	}
     break;
 
-  case 99:
-#line 1040 "asn1p_y.y"
+  case 100:
+#line 1051 "asn1p_y.y"
     {
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
 		yyval.a_expr->Identifier = yyvsp[-1].tv_str;
 		yyval.a_expr->meta_type = AMT_OBJECTFIELD;
@@ -2682,10 +2706,10 @@
 	}
     break;
 
-  case 100:
-#line 1050 "asn1p_y.y"
+  case 101:
+#line 1061 "asn1p_y.y"
     {
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
 		yyval.a_expr->Identifier = yyvsp[-3].tv_str;
 		yyval.a_expr->meta_type = AMT_OBJECTFIELD;
 		yyval.a_expr->expr_type = A1TC_CLASSFIELD_FTVFS;	/* FixedTypeValueFieldSpec */
@@ -2695,10 +2719,10 @@
 	}
     break;
 
-  case 101:
-#line 1061 "asn1p_y.y"
+  case 102:
+#line 1072 "asn1p_y.y"
     {
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
 		yyval.a_expr->Identifier = yyvsp[-2].tv_str;
 		yyval.a_expr->meta_type = AMT_OBJECTFIELD;
 		yyval.a_expr->expr_type = A1TC_CLASSFIELD_VTVFS;
@@ -2707,10 +2731,10 @@
 	}
     break;
 
-  case 102:
-#line 1071 "asn1p_y.y"
+  case 103:
+#line 1082 "asn1p_y.y"
     {
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
 		yyval.a_expr->Identifier = yyvsp[-2].tv_str;
 		yyval.a_expr->reference = yyvsp[-1].a_ref;
@@ -2720,10 +2744,10 @@
 	}
     break;
 
-  case 103:
-#line 1082 "asn1p_y.y"
+  case 104:
+#line 1093 "asn1p_y.y"
     {
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
 		yyval.a_expr->Identifier = yyvsp[-2].tv_str;
 		yyval.a_expr->meta_type = AMT_OBJECTFIELD;
 		yyval.a_expr->expr_type = A1TC_CLASSFIELD_VTVSFS;
@@ -2732,10 +2756,10 @@
 	}
     break;
 
-  case 104:
-#line 1092 "asn1p_y.y"
+  case 105:
+#line 1103 "asn1p_y.y"
     {
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
 		yyval.a_expr->Identifier = yyvsp[-2].tv_str;
 		yyval.a_expr->meta_type = AMT_OBJECTFIELD;
@@ -2745,10 +2769,10 @@
 	}
     break;
 
-  case 105:
-#line 1103 "asn1p_y.y"
+  case 106:
+#line 1114 "asn1p_y.y"
     {
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
 		yyval.a_expr->Identifier = yyvsp[-2].tv_str;
 		yyval.a_expr->reference = yyvsp[-1].a_ref;
@@ -2758,105 +2782,105 @@
 	}
     break;
 
-  case 106:
-#line 1115 "asn1p_y.y"
+  case 107:
+#line 1126 "asn1p_y.y"
     { yyval.a_wsynt = 0; }
     break;
 
-  case 107:
-#line 1116 "asn1p_y.y"
+  case 108:
+#line 1127 "asn1p_y.y"
     {
 		yyval.a_wsynt = yyvsp[0].a_wsynt;
 	}
     break;
 
-  case 108:
-#line 1123 "asn1p_y.y"
+  case 109:
+#line 1134 "asn1p_y.y"
     { asn1p_lexer_hack_enable_with_syntax(); }
     break;
 
-  case 109:
-#line 1125 "asn1p_y.y"
+  case 110:
+#line 1136 "asn1p_y.y"
     {
 		yyval.a_wsynt = yyvsp[-1].a_wsynt;
 	}
     break;
 
-  case 110:
-#line 1131 "asn1p_y.y"
+  case 111:
+#line 1142 "asn1p_y.y"
     {
 		yyval.a_wsynt = asn1p_wsyntx_new();
 		TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next);
 	}
     break;
 
-  case 111:
-#line 1135 "asn1p_y.y"
+  case 112:
+#line 1146 "asn1p_y.y"
     {
 		yyval.a_wsynt = yyvsp[-1].a_wsynt;
 		TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next);
 	}
     break;
 
-  case 112:
-#line 1142 "asn1p_y.y"
+  case 113:
+#line 1153 "asn1p_y.y"
     {
 		yyval.a_wchunk = asn1p_wsyntx_chunk_fromstring(yyvsp[0].tv_opaque.buf, 0);
 		yyval.a_wchunk->type = WC_WHITESPACE;
 	}
     break;
 
-  case 113:
-#line 1146 "asn1p_y.y"
+  case 114:
+#line 1157 "asn1p_y.y"
     {
 		yyval.a_wchunk = asn1p_wsyntx_chunk_fromstring(yyvsp[0].tv_str, 0);
 	}
     break;
 
-  case 114:
-#line 1149 "asn1p_y.y"
+  case 115:
+#line 1160 "asn1p_y.y"
     {
 		yyval.a_wchunk = asn1p_wsyntx_chunk_fromstring(yyvsp[0].a_refcomp.name, 0);
 		yyval.a_wchunk->type = WC_FIELD;
 	}
     break;
 
-  case 115:
-#line 1153 "asn1p_y.y"
+  case 116:
+#line 1164 "asn1p_y.y"
     {
 		yyval.a_wchunk = asn1p_wsyntx_chunk_fromsyntax(yyvsp[-1].a_wsynt);
 	}
     break;
 
-  case 116:
-#line 1159 "asn1p_y.y"
-    {
-		yyval.a_expr = asn1p_expr_new(yylineno);
-		checkmem(yyval.a_expr);
-		yyval.a_expr->Identifier = strdup("...");
-		checkmem(yyval.a_expr->Identifier);
-		yyval.a_expr->expr_type = A1TC_EXTENSIBLE;
-		yyval.a_expr->meta_type = AMT_TYPE;
-	}
-    break;
-
   case 117:
-#line 1167 "asn1p_y.y"
+#line 1170 "asn1p_y.y"
     {
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
 		yyval.a_expr->Identifier = strdup("...");
 		checkmem(yyval.a_expr->Identifier);
-		yyval.a_expr->value = yyvsp[0].a_value;
 		yyval.a_expr->expr_type = A1TC_EXTENSIBLE;
 		yyval.a_expr->meta_type = AMT_TYPE;
 	}
     break;
 
   case 118:
-#line 1176 "asn1p_y.y"
+#line 1178 "asn1p_y.y"
     {
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
+		checkmem(yyval.a_expr);
+		yyval.a_expr->Identifier = strdup("...");
+		checkmem(yyval.a_expr->Identifier);
+		yyval.a_expr->value = yyvsp[0].a_value;
+		yyval.a_expr->expr_type = A1TC_EXTENSIBLE;
+		yyval.a_expr->meta_type = AMT_TYPE;
+	}
+    break;
+
+  case 119:
+#line 1187 "asn1p_y.y"
+    {
+		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
 		yyval.a_expr->Identifier = strdup("...");
 		yyval.a_expr->value = yyvsp[0].a_value;
@@ -2866,8 +2890,8 @@
 	}
     break;
 
-  case 119:
-#line 1188 "asn1p_y.y"
+  case 120:
+#line 1199 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[-1].a_expr;
 		yyval.a_expr->tag = yyvsp[-2].a_tag;
@@ -2889,16 +2913,16 @@
 	}
     break;
 
-  case 120:
-#line 1210 "asn1p_y.y"
+  case 121:
+#line 1221 "asn1p_y.y"
     {
 		yyval.a_int = asn1p_as_pointer ? EM_INDIRECT : 0;
 		asn1p_as_pointer = 0;
 	}
     break;
 
-  case 121:
-#line 1217 "asn1p_y.y"
+  case 122:
+#line 1228 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[0].a_expr;
 		yyval.a_expr->marker.flags |= yyvsp[-1].a_int;
@@ -2917,15 +2941,15 @@
 	}
     break;
 
-  case 122:
-#line 1236 "asn1p_y.y"
+  case 123:
+#line 1247 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[0].a_expr;
 	}
     break;
 
-  case 123:
-#line 1239 "asn1p_y.y"
+  case 124:
+#line 1250 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[-1].a_expr;
 		assert(yyval.a_expr->expr_type == A1TC_INVALID);
@@ -2934,8 +2958,8 @@
 	}
     break;
 
-  case 124:
-#line 1245 "asn1p_y.y"
+  case 125:
+#line 1256 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[-1].a_expr;
 		assert(yyval.a_expr->expr_type == A1TC_INVALID);
@@ -2944,8 +2968,8 @@
 	}
     break;
 
-  case 125:
-#line 1251 "asn1p_y.y"
+  case 126:
+#line 1262 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[-1].a_expr;
 		assert(yyval.a_expr->expr_type == A1TC_INVALID);
@@ -2954,10 +2978,10 @@
 	}
     break;
 
-  case 126:
-#line 1257 "asn1p_y.y"
+  case 127:
+#line 1268 "asn1p_y.y"
     {
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
 		yyval.a_expr->constraints = yyvsp[-4].a_constr;
 		yyval.a_expr->expr_type = ASN_CONSTR_SEQUENCE_OF;
@@ -2968,10 +2992,10 @@
 	}
     break;
 
-  case 127:
-#line 1267 "asn1p_y.y"
+  case 128:
+#line 1278 "asn1p_y.y"
     {
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
 		yyval.a_expr->constraints = yyvsp[-4].a_constr;
 		yyval.a_expr->expr_type = ASN_CONSTR_SET_OF;
@@ -2982,21 +3006,21 @@
 	}
     break;
 
-  case 128:
-#line 1277 "asn1p_y.y"
+  case 129:
+#line 1288 "asn1p_y.y"
     {
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
 		yyval.a_expr->expr_type = ASN_TYPE_ANY;
 		yyval.a_expr->meta_type = AMT_TYPE;
 	}
     break;
 
-  case 129:
-#line 1283 "asn1p_y.y"
+  case 130:
+#line 1294 "asn1p_y.y"
     {
 		int ret;
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
 		yyval.a_expr->reference = asn1p_ref_new(yylineno);
 		ret = asn1p_ref_add_component(yyval.a_expr->reference,
@@ -3007,10 +3031,10 @@
 	}
     break;
 
-  case 130:
-#line 1294 "asn1p_y.y"
+  case 131:
+#line 1305 "asn1p_y.y"
     {
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
 		yyval.a_expr->reference = yyvsp[0].a_ref;
 		yyval.a_expr->expr_type = A1TC_INSTANCE;
@@ -3018,8 +3042,8 @@
 	}
     break;
 
-  case 131:
-#line 1309 "asn1p_y.y"
+  case 132:
+#line 1320 "asn1p_y.y"
     {
 		int ret;
 		yyval.a_ref = asn1p_ref_new(yylineno);
@@ -3030,22 +3054,8 @@
 	}
     break;
 
-  case 132:
-#line 1317 "asn1p_y.y"
-    {
-		int ret;
-		yyval.a_ref = asn1p_ref_new(yylineno);
-		checkmem(yyval.a_ref);
-		ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[-2].tv_str, RLT_UNKNOWN);
-		checkmem(ret == 0);
-		ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_UNKNOWN);
-		checkmem(ret == 0);
-		free(yyvsp[-2].tv_str);
-	}
-    break;
-
   case 133:
-#line 1327 "asn1p_y.y"
+#line 1328 "asn1p_y.y"
     {
 		int ret;
 		yyval.a_ref = asn1p_ref_new(yylineno);
@@ -3059,7 +3069,21 @@
     break;
 
   case 134:
-#line 1337 "asn1p_y.y"
+#line 1338 "asn1p_y.y"
+    {
+		int ret;
+		yyval.a_ref = asn1p_ref_new(yylineno);
+		checkmem(yyval.a_ref);
+		ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[-2].tv_str, RLT_UNKNOWN);
+		checkmem(ret == 0);
+		ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_UNKNOWN);
+		checkmem(ret == 0);
+		free(yyvsp[-2].tv_str);
+	}
+    break;
+
+  case 135:
+#line 1348 "asn1p_y.y"
     {
 		int ret;
 		yyval.a_ref = asn1p_ref_new(yylineno);
@@ -3072,8 +3096,8 @@
 	}
     break;
 
-  case 135:
-#line 1347 "asn1p_y.y"
+  case 136:
+#line 1358 "asn1p_y.y"
     {
 		int ret;
 		yyval.a_ref = asn1p_ref_new(yylineno);
@@ -3084,8 +3108,8 @@
 	}
     break;
 
-  case 136:
-#line 1355 "asn1p_y.y"
+  case 137:
+#line 1366 "asn1p_y.y"
     {
 		int ret;
 		yyval.a_ref = yyvsp[0].a_ref;
@@ -3107,8 +3131,8 @@
 	}
     break;
 
-  case 137:
-#line 1377 "asn1p_y.y"
+  case 138:
+#line 1388 "asn1p_y.y"
     {
 		int ret;
 		yyval.a_ref = asn1p_ref_new(yylineno);
@@ -3119,8 +3143,8 @@
 	}
     break;
 
-  case 138:
-#line 1385 "asn1p_y.y"
+  case 139:
+#line 1396 "asn1p_y.y"
     {
 		int ret;
 		yyval.a_ref = yyvsp[-2].a_ref;
@@ -3130,56 +3154,56 @@
 	}
     break;
 
-  case 140:
-#line 1398 "asn1p_y.y"
+  case 141:
+#line 1409 "asn1p_y.y"
     {
 		yyval.a_refcomp.lex_type = RLT_AmpUppercase;
 		yyval.a_refcomp.name = yyvsp[0].tv_str;
 	}
     break;
 
-  case 141:
-#line 1403 "asn1p_y.y"
+  case 142:
+#line 1414 "asn1p_y.y"
     {
 		yyval.a_refcomp.lex_type = RLT_Amplowercase;
 		yyval.a_refcomp.name = yyvsp[0].tv_str;
 	}
     break;
 
-  case 142:
-#line 1412 "asn1p_y.y"
+  case 143:
+#line 1423 "asn1p_y.y"
     {
 		yyval.a_ref = asn1p_ref_new(yylineno);
 		asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_AmpUppercase);
 	}
     break;
 
-  case 143:
-#line 1416 "asn1p_y.y"
+  case 144:
+#line 1427 "asn1p_y.y"
     {
 		yyval.a_ref = yyval.a_ref;
 		asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_AmpUppercase);
 	}
     break;
 
-  case 144:
-#line 1420 "asn1p_y.y"
+  case 145:
+#line 1431 "asn1p_y.y"
     {
 		yyval.a_ref = yyval.a_ref;
 		asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_Amplowercase);
 	}
     break;
 
-  case 145:
-#line 1427 "asn1p_y.y"
+  case 146:
+#line 1438 "asn1p_y.y"
     {
 		yyval.a_ref = asn1p_ref_new(yylineno);
 		asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_CAPITALS);
 	}
     break;
 
-  case 146:
-#line 1447 "asn1p_y.y"
+  case 147:
+#line 1458 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		assert(yyval.a_expr->Identifier == NULL);
@@ -3189,8 +3213,8 @@
 	}
     break;
 
-  case 149:
-#line 1459 "asn1p_y.y"
+  case 150:
+#line 1470 "asn1p_y.y"
     {
 		yyval.a_value = asn1p_value_fromint(0);
 		checkmem(yyval.a_value);
@@ -3200,13 +3224,13 @@
 	}
     break;
 
-  case 150:
-#line 1466 "asn1p_y.y"
+  case 151:
+#line 1477 "asn1p_y.y"
     { asn1p_lexer_hack_push_opaque_state(); }
     break;
 
-  case 151:
-#line 1466 "asn1p_y.y"
+  case 152:
+#line 1477 "asn1p_y.y"
     {
 		yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0);
 		checkmem(yyval.a_value);
@@ -3214,8 +3238,8 @@
 	}
     break;
 
-  case 152:
-#line 1471 "asn1p_y.y"
+  case 153:
+#line 1482 "asn1p_y.y"
     {
 		yyval.a_value = asn1p_value_fromint(0);
 		checkmem(yyval.a_value);
@@ -3223,8 +3247,8 @@
 	}
     break;
 
-  case 153:
-#line 1479 "asn1p_y.y"
+  case 154:
+#line 1490 "asn1p_y.y"
     {
 		yyval.a_value = asn1p_value_fromint(0);
 		checkmem(yyval.a_value);
@@ -3232,8 +3256,8 @@
 	}
     break;
 
-  case 154:
-#line 1484 "asn1p_y.y"
+  case 155:
+#line 1495 "asn1p_y.y"
     {
 		yyval.a_value = asn1p_value_fromint(0);
 		checkmem(yyval.a_value);
@@ -3241,38 +3265,38 @@
 	}
     break;
 
-  case 155:
-#line 1489 "asn1p_y.y"
+  case 156:
+#line 1500 "asn1p_y.y"
     {
 		yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'B');
 		checkmem(yyval.a_value);
 	}
     break;
 
-  case 156:
-#line 1493 "asn1p_y.y"
+  case 157:
+#line 1504 "asn1p_y.y"
     {
 		yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'H');
 		checkmem(yyval.a_value);
 	}
     break;
 
-  case 157:
-#line 1497 "asn1p_y.y"
+  case 158:
+#line 1508 "asn1p_y.y"
     {
 		yyval.a_value = yyval.a_value;
 	}
     break;
 
-  case 158:
-#line 1500 "asn1p_y.y"
+  case 159:
+#line 1511 "asn1p_y.y"
     {
 		yyval.a_value = yyvsp[0].a_value;
 	}
     break;
 
-  case 159:
-#line 1506 "asn1p_y.y"
+  case 160:
+#line 1517 "asn1p_y.y"
     {
 		asn1p_ref_t *ref;
 		int ret;
@@ -3286,8 +3310,8 @@
 	}
     break;
 
-  case 160:
-#line 1517 "asn1p_y.y"
+  case 161:
+#line 1528 "asn1p_y.y"
     {
 		asn1p_ref_t *ref;
 		int ret;
@@ -3304,16 +3328,16 @@
 	}
     break;
 
-  case 161:
-#line 1535 "asn1p_y.y"
+  case 162:
+#line 1546 "asn1p_y.y"
     {
 		yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0);
 		checkmem(yyval.a_value);
 	}
     break;
 
-  case 162:
-#line 1539 "asn1p_y.y"
+  case 163:
+#line 1550 "asn1p_y.y"
     {
 		yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int);
 		checkmem(yyval.a_value);
@@ -3321,8 +3345,8 @@
 	}
     break;
 
-  case 163:
-#line 1544 "asn1p_y.y"
+  case 164:
+#line 1555 "asn1p_y.y"
     {
 		yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int);
 		checkmem(yyval.a_value);
@@ -3330,8 +3354,8 @@
 	}
     break;
 
-  case 164:
-#line 1578 "asn1p_y.y"
+  case 165:
+#line 1589 "asn1p_y.y"
     {
 		yyval.tv_opaque.len = yyvsp[0].tv_opaque.len + 1;
 		yyval.tv_opaque.buf = malloc(yyval.tv_opaque.len + 1);
@@ -3343,8 +3367,8 @@
 	}
     break;
 
-  case 165:
-#line 1587 "asn1p_y.y"
+  case 166:
+#line 1598 "asn1p_y.y"
     {
 		int newsize = yyvsp[-1].tv_opaque.len + yyvsp[0].tv_opaque.len;
 		char *p = malloc(newsize + 1);
@@ -3359,103 +3383,103 @@
 	}
     break;
 
-  case 166:
-#line 1602 "asn1p_y.y"
+  case 167:
+#line 1613 "asn1p_y.y"
     { yyval.a_type = ASN_BASIC_BOOLEAN; }
     break;
 
-  case 167:
-#line 1603 "asn1p_y.y"
+  case 168:
+#line 1614 "asn1p_y.y"
     { yyval.a_type = ASN_BASIC_NULL; }
     break;
 
-  case 168:
-#line 1604 "asn1p_y.y"
+  case 169:
+#line 1615 "asn1p_y.y"
     { yyval.a_type = ASN_BASIC_REAL; }
     break;
 
-  case 169:
-#line 1605 "asn1p_y.y"
-    { yyval.a_type = yyvsp[0].a_type; }
-    break;
-
   case 170:
-#line 1606 "asn1p_y.y"
-    { yyval.a_type = ASN_BASIC_OCTET_STRING; }
+#line 1616 "asn1p_y.y"
+    { yyval.a_type = yyvsp[0].a_type; }
     break;
 
   case 171:
-#line 1607 "asn1p_y.y"
-    { yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; }
+#line 1617 "asn1p_y.y"
+    { yyval.a_type = ASN_BASIC_OCTET_STRING; }
     break;
 
   case 172:
-#line 1608 "asn1p_y.y"
-    { yyval.a_type = ASN_BASIC_RELATIVE_OID; }
+#line 1618 "asn1p_y.y"
+    { yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; }
     break;
 
   case 173:
-#line 1609 "asn1p_y.y"
-    { yyval.a_type = ASN_BASIC_EXTERNAL; }
+#line 1619 "asn1p_y.y"
+    { yyval.a_type = ASN_BASIC_RELATIVE_OID; }
     break;
 
   case 174:
-#line 1610 "asn1p_y.y"
-    { yyval.a_type = ASN_BASIC_EMBEDDED_PDV; }
+#line 1620 "asn1p_y.y"
+    { yyval.a_type = ASN_BASIC_EXTERNAL; }
     break;
 
   case 175:
-#line 1611 "asn1p_y.y"
-    { yyval.a_type = ASN_BASIC_CHARACTER_STRING; }
+#line 1621 "asn1p_y.y"
+    { yyval.a_type = ASN_BASIC_EMBEDDED_PDV; }
     break;
 
   case 176:
-#line 1612 "asn1p_y.y"
-    { yyval.a_type = ASN_BASIC_UTCTime; }
+#line 1622 "asn1p_y.y"
+    { yyval.a_type = ASN_BASIC_CHARACTER_STRING; }
     break;
 
   case 177:
-#line 1613 "asn1p_y.y"
-    { yyval.a_type = ASN_BASIC_GeneralizedTime; }
+#line 1623 "asn1p_y.y"
+    { yyval.a_type = ASN_BASIC_UTCTime; }
     break;
 
   case 178:
-#line 1614 "asn1p_y.y"
-    { yyval.a_type = yyvsp[0].a_type; }
+#line 1624 "asn1p_y.y"
+    { yyval.a_type = ASN_BASIC_GeneralizedTime; }
     break;
 
   case 179:
-#line 1621 "asn1p_y.y"
-    { yyval.a_type = ASN_BASIC_INTEGER; }
+#line 1625 "asn1p_y.y"
+    { yyval.a_type = yyvsp[0].a_type; }
     break;
 
   case 180:
-#line 1622 "asn1p_y.y"
-    { yyval.a_type = ASN_BASIC_ENUMERATED; }
+#line 1632 "asn1p_y.y"
+    { yyval.a_type = ASN_BASIC_INTEGER; }
     break;
 
   case 181:
-#line 1623 "asn1p_y.y"
-    { yyval.a_type = ASN_BASIC_BIT_STRING; }
+#line 1633 "asn1p_y.y"
+    { yyval.a_type = ASN_BASIC_ENUMERATED; }
     break;
 
   case 182:
-#line 1627 "asn1p_y.y"
+#line 1634 "asn1p_y.y"
+    { yyval.a_type = ASN_BASIC_BIT_STRING; }
+    break;
+
+  case 183:
+#line 1638 "asn1p_y.y"
     {
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
 		yyval.a_expr->expr_type = yyvsp[0].a_type;
 		yyval.a_expr->meta_type = AMT_TYPE;
 	}
     break;
 
-  case 183:
-#line 1633 "asn1p_y.y"
+  case 184:
+#line 1644 "asn1p_y.y"
     {
 		if(yyvsp[0].a_expr) {
 			yyval.a_expr = yyvsp[0].a_expr;
 		} else {
-			yyval.a_expr = asn1p_expr_new(yylineno);
+			yyval.a_expr = NEW_EXPR();
 			checkmem(yyval.a_expr);
 		}
 		yyval.a_expr->expr_type = yyvsp[-1].a_type;
@@ -3463,109 +3487,116 @@
 	}
     break;
 
-  case 184:
-#line 1646 "asn1p_y.y"
+  case 185:
+#line 1657 "asn1p_y.y"
     { yyval.a_type = ASN_STRING_BMPString; }
     break;
 
-  case 185:
-#line 1647 "asn1p_y.y"
+  case 186:
+#line 1658 "asn1p_y.y"
     {
 		yyval.a_type = ASN_STRING_GeneralString;
 		fprintf(stderr, "WARNING: GeneralString is not fully supported\n");
 	}
     break;
 
-  case 186:
-#line 1651 "asn1p_y.y"
+  case 187:
+#line 1662 "asn1p_y.y"
     {
 		yyval.a_type = ASN_STRING_GraphicString;
 		fprintf(stderr, "WARNING: GraphicString is not fully supported\n");
 	}
     break;
 
-  case 187:
-#line 1655 "asn1p_y.y"
+  case 188:
+#line 1666 "asn1p_y.y"
     { yyval.a_type = ASN_STRING_IA5String; }
     break;
 
-  case 188:
-#line 1656 "asn1p_y.y"
+  case 189:
+#line 1667 "asn1p_y.y"
     { yyval.a_type = ASN_STRING_ISO646String; }
     break;
 
-  case 189:
-#line 1657 "asn1p_y.y"
+  case 190:
+#line 1668 "asn1p_y.y"
     { yyval.a_type = ASN_STRING_NumericString; }
     break;
 
-  case 190:
-#line 1658 "asn1p_y.y"
+  case 191:
+#line 1669 "asn1p_y.y"
     { yyval.a_type = ASN_STRING_PrintableString; }
     break;
 
-  case 191:
-#line 1659 "asn1p_y.y"
+  case 192:
+#line 1670 "asn1p_y.y"
     {
 		yyval.a_type = ASN_STRING_T61String;
 		fprintf(stderr, "WARNING: T61String is not fully supported\n");
 	}
     break;
 
-  case 192:
-#line 1663 "asn1p_y.y"
+  case 193:
+#line 1674 "asn1p_y.y"
     { yyval.a_type = ASN_STRING_TeletexString; }
     break;
 
-  case 193:
-#line 1664 "asn1p_y.y"
+  case 194:
+#line 1675 "asn1p_y.y"
     { yyval.a_type = ASN_STRING_UniversalString; }
     break;
 
-  case 194:
-#line 1665 "asn1p_y.y"
+  case 195:
+#line 1676 "asn1p_y.y"
     { yyval.a_type = ASN_STRING_UTF8String; }
     break;
 
-  case 195:
-#line 1666 "asn1p_y.y"
+  case 196:
+#line 1677 "asn1p_y.y"
     {
 		yyval.a_type = ASN_STRING_VideotexString;
 		fprintf(stderr, "WARNING: VideotexString is not fully supported\n");
 	}
     break;
 
-  case 196:
-#line 1670 "asn1p_y.y"
+  case 197:
+#line 1681 "asn1p_y.y"
     { yyval.a_type = ASN_STRING_VisibleString; }
     break;
 
-  case 197:
-#line 1671 "asn1p_y.y"
+  case 198:
+#line 1682 "asn1p_y.y"
     { yyval.a_type = ASN_STRING_ObjectDescriptor; }
     break;
 
-  case 203:
-#line 1683 "asn1p_y.y"
+  case 204:
+#line 1694 "asn1p_y.y"
     { yyval.a_constr = 0; }
     break;
 
-  case 204:
-#line 1684 "asn1p_y.y"
+  case 205:
+#line 1695 "asn1p_y.y"
     {
 		yyval.a_constr = yyvsp[0].a_constr;
 	}
     break;
 
-  case 205:
-#line 1690 "asn1p_y.y"
+  case 207:
+#line 1702 "asn1p_y.y"
+    {
+		yyval.a_constr = yyvsp[-1].a_constr;
+	}
+    break;
+
+  case 208:
+#line 1708 "asn1p_y.y"
     {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[0].a_constr, 0);
 	}
     break;
 
-  case 206:
-#line 1693 "asn1p_y.y"
+  case 209:
+#line 1711 "asn1p_y.y"
     {
 		/*
 		 * This is a special case, for compatibility purposes.
@@ -3575,37 +3606,37 @@
 	}
     break;
 
-  case 207:
-#line 1703 "asn1p_y.y"
+  case 210:
+#line 1721 "asn1p_y.y"
     {
 		yyval.a_constr = yyvsp[-1].a_constr;
 	}
     break;
 
-  case 208:
-#line 1706 "asn1p_y.y"
+  case 211:
+#line 1724 "asn1p_y.y"
     {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[-3].a_constr, yyvsp[-1].a_constr);
 	}
     break;
 
-  case 209:
-#line 1712 "asn1p_y.y"
+  case 212:
+#line 1730 "asn1p_y.y"
     {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		yyval.a_constr->type = ACT_EL_EXT;
 	}
     break;
 
-  case 210:
-#line 1716 "asn1p_y.y"
+  case 213:
+#line 1734 "asn1p_y.y"
     {
 		yyval.a_constr = yyvsp[0].a_constr;
 	}
     break;
 
-  case 211:
-#line 1719 "asn1p_y.y"
+  case 214:
+#line 1737 "asn1p_y.y"
     {
 		asn1p_constraint_t *ct;
 		ct = asn1p_constraint_new(yylineno);
@@ -3614,8 +3645,8 @@
 	}
     break;
 
-  case 212:
-#line 1725 "asn1p_y.y"
+  case 215:
+#line 1743 "asn1p_y.y"
     {
 		asn1p_constraint_t *ct;
 		ct = asn1p_constraint_new(yylineno);
@@ -3626,43 +3657,43 @@
 	}
     break;
 
-  case 213:
-#line 1736 "asn1p_y.y"
+  case 216:
+#line 1754 "asn1p_y.y"
     {
 		yyval.a_constr = yyvsp[0].a_constr;
 	}
     break;
 
-  case 214:
-#line 1739 "asn1p_y.y"
+  case 217:
+#line 1757 "asn1p_y.y"
     {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_AEX, yyvsp[0].a_constr, 0);
 	}
     break;
 
-  case 215:
-#line 1742 "asn1p_y.y"
+  case 218:
+#line 1760 "asn1p_y.y"
     {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_UNI, yyvsp[-2].a_constr, yyvsp[0].a_constr);
 	}
     break;
 
-  case 216:
-#line 1745 "asn1p_y.y"
+  case 219:
+#line 1763 "asn1p_y.y"
     {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_INT, yyvsp[-2].a_constr, yyvsp[0].a_constr);
 	}
     break;
 
-  case 217:
-#line 1748 "asn1p_y.y"
+  case 220:
+#line 1766 "asn1p_y.y"
     {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_EXC, yyvsp[-2].a_constr, yyvsp[0].a_constr);
 	}
     break;
 
-  case 218:
-#line 1754 "asn1p_y.y"
+  case 221:
+#line 1772 "asn1p_y.y"
     {
 		int ret;
 		yyval.a_constr = asn1p_constraint_new(yylineno);
@@ -3673,8 +3704,8 @@
 	}
     break;
 
-  case 219:
-#line 1762 "asn1p_y.y"
+  case 222:
+#line 1780 "asn1p_y.y"
     {
 		int ret;
 		yyval.a_constr = asn1p_constraint_new(yylineno);
@@ -3685,8 +3716,8 @@
 	}
     break;
 
-  case 220:
-#line 1770 "asn1p_y.y"
+  case 223:
+#line 1788 "asn1p_y.y"
     {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
@@ -3695,8 +3726,8 @@
 	}
     break;
 
-  case 221:
-#line 1776 "asn1p_y.y"
+  case 224:
+#line 1794 "asn1p_y.y"
     {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
@@ -3705,121 +3736,77 @@
 	}
     break;
 
-  case 222:
-#line 1782 "asn1p_y.y"
-    {
-		yyval.a_constr = asn1p_constraint_new(yylineno);
-		checkmem(yyval.a_constr);
-		yyval.a_constr->type = yyvsp[-1].a_ctype;
-		yyval.a_constr->range_start = yyvsp[-2].a_value;
-		yyval.a_constr->range_stop = yyvsp[0].a_value;
-	}
-    break;
-
-  case 223:
-#line 1789 "asn1p_y.y"
-    {
-		yyval.a_constr = asn1p_constraint_new(yylineno);
-		checkmem(yyval.a_constr);
-		yyval.a_constr->type = yyvsp[-1].a_ctype;
-		yyval.a_constr->range_start = asn1p_value_fromint(-123);
-		yyval.a_constr->range_stop = yyvsp[0].a_value;
-		yyval.a_constr->range_start->type = ATV_MIN;
-	}
-    break;
-
-  case 224:
-#line 1797 "asn1p_y.y"
-    {
-		yyval.a_constr = asn1p_constraint_new(yylineno);
-		checkmem(yyval.a_constr);
-		yyval.a_constr->type = yyvsp[-1].a_ctype;
-		yyval.a_constr->range_start = yyvsp[-2].a_value;
-		yyval.a_constr->range_stop = asn1p_value_fromint(321);
-		yyval.a_constr->range_stop->type = ATV_MAX;
-	}
-    break;
-
   case 225:
-#line 1805 "asn1p_y.y"
+#line 1800 "asn1p_y.y"
     {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
 		yyval.a_constr->type = yyvsp[-1].a_ctype;
-		yyval.a_constr->range_start = asn1p_value_fromint(-123);
-		yyval.a_constr->range_stop = asn1p_value_fromint(321);
-		yyval.a_constr->range_start->type = ATV_MIN;
-		yyval.a_constr->range_stop->type = ATV_MAX;
+		yyval.a_constr->range_start = yyvsp[-2].a_value;
+		yyval.a_constr->range_stop = yyvsp[0].a_value;
 	}
     break;
 
   case 226:
-#line 1814 "asn1p_y.y"
+#line 1807 "asn1p_y.y"
     {
-		yyval.a_constr = yyvsp[0].a_constr;
+		yyval.a_constr = asn1p_constraint_new(yylineno);
+		checkmem(yyval.a_constr);
+		yyval.a_constr->type = yyvsp[-1].a_ctype;
+		yyval.a_constr->range_start = asn1p_value_fromint(-123);
+		yyval.a_constr->range_stop = yyvsp[0].a_value;
+		yyval.a_constr->range_start->type = ATV_MIN;
 	}
     break;
 
   case 227:
-#line 1817 "asn1p_y.y"
+#line 1815 "asn1p_y.y"
+    {
+		yyval.a_constr = asn1p_constraint_new(yylineno);
+		checkmem(yyval.a_constr);
+		yyval.a_constr->type = yyvsp[-1].a_ctype;
+		yyval.a_constr->range_start = yyvsp[-2].a_value;
+		yyval.a_constr->range_stop = asn1p_value_fromint(321);
+		yyval.a_constr->range_stop->type = ATV_MAX;
+	}
+    break;
+
+  case 228:
+#line 1823 "asn1p_y.y"
+    {
+		yyval.a_constr = asn1p_constraint_new(yylineno);
+		checkmem(yyval.a_constr);
+		yyval.a_constr->type = yyvsp[-1].a_ctype;
+		yyval.a_constr->range_start = asn1p_value_fromint(-123);
+		yyval.a_constr->range_stop = asn1p_value_fromint(321);
+		yyval.a_constr->range_start->type = ATV_MIN;
+		yyval.a_constr->range_stop->type = ATV_MAX;
+	}
+    break;
+
+  case 229:
+#line 1832 "asn1p_y.y"
     {
 		yyval.a_constr = yyvsp[0].a_constr;
 	}
     break;
 
-  case 228:
-#line 1821 "asn1p_y.y"
-    { asn1p_lexer_hack_push_opaque_state(); }
-    break;
-
-  case 229:
-#line 1821 "asn1p_y.y"
-    {
-		yyval.a_constr = asn1p_constraint_new(yylineno);
-		checkmem(yyval.a_constr);
-		yyval.a_constr->type = ACT_CT_CTDBY;
-		yyval.a_constr->value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0);
-		checkmem(yyval.a_constr->value);
-		yyval.a_constr->value->type = ATV_UNPARSED;
-	}
-    break;
-
   case 230:
-#line 1832 "asn1p_y.y"
-    { yyval.a_ctype = ACT_EL_RANGE; }
-    break;
-
-  case 231:
-#line 1833 "asn1p_y.y"
-    { yyval.a_ctype = ACT_EL_RLRANGE; }
-    break;
-
-  case 232:
-#line 1834 "asn1p_y.y"
-    { yyval.a_ctype = ACT_EL_LLRANGE; }
-    break;
-
-  case 233:
-#line 1835 "asn1p_y.y"
-    { yyval.a_ctype = ACT_EL_ULRANGE; }
-    break;
-
-  case 234:
-#line 1839 "asn1p_y.y"
+#line 1838 "asn1p_y.y"
     {
 		yyval.a_ctype = ACT_CT_SIZE;
 	}
     break;
 
-  case 235:
-#line 1842 "asn1p_y.y"
+  case 231:
+#line 1841 "asn1p_y.y"
     {
 		yyval.a_ctype = ACT_CT_FROM;
 	}
     break;
 
-  case 236:
-#line 1848 "asn1p_y.y"
+  case 232:
+#line 1847 "asn1p_y.y"
     {
 		yyval.a_value = asn1p_value_fromint(0);
 		checkmem(yyval.a_value);
@@ -3827,8 +3814,8 @@
 	}
     break;
 
-  case 237:
-#line 1853 "asn1p_y.y"
+  case 233:
+#line 1852 "asn1p_y.y"
     {
 		yyval.a_value = asn1p_value_fromint(1);
 		checkmem(yyval.a_value);
@@ -3836,8 +3823,8 @@
 	}
     break;
 
-  case 240:
-#line 1860 "asn1p_y.y"
+  case 236:
+#line 1859 "asn1p_y.y"
     {
 		asn1p_ref_t *ref;
 		int ret;
@@ -3851,8 +3838,8 @@
 	}
     break;
 
-  case 241:
-#line 1874 "asn1p_y.y"
+  case 237:
+#line 1873 "asn1p_y.y"
     {
 		asn1p_ref_t *ref;
 		int ret;
@@ -3866,36 +3853,36 @@
 	}
     break;
 
-  case 242:
-#line 1888 "asn1p_y.y"
+  case 238:
+#line 1887 "asn1p_y.y"
     {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMP, yyvsp[0].a_constr, 0);
 	}
     break;
 
-  case 243:
-#line 1891 "asn1p_y.y"
+  case 239:
+#line 1890 "asn1p_y.y"
     {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-1].a_constr, 0);
 	}
     break;
 
-  case 244:
-#line 1897 "asn1p_y.y"
+  case 240:
+#line 1896 "asn1p_y.y"
     {
 		yyval.a_constr = yyvsp[0].a_constr;
 	}
     break;
 
-  case 245:
-#line 1900 "asn1p_y.y"
+  case 241:
+#line 1899 "asn1p_y.y"
     {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-2].a_constr, yyvsp[0].a_constr);
 	}
     break;
 
-  case 246:
-#line 1906 "asn1p_y.y"
+  case 242:
+#line 1905 "asn1p_y.y"
     {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
@@ -3904,8 +3891,8 @@
 	}
     break;
 
-  case 247:
-#line 1912 "asn1p_y.y"
+  case 243:
+#line 1911 "asn1p_y.y"
     {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
@@ -3916,53 +3903,99 @@
 	}
     break;
 
-  case 248:
-#line 1926 "asn1p_y.y"
+  case 244:
+#line 1925 "asn1p_y.y"
     { yyval.a_pres = ACPRES_DEFAULT; }
     break;
 
-  case 249:
-#line 1927 "asn1p_y.y"
+  case 245:
+#line 1926 "asn1p_y.y"
     { yyval.a_pres = yyvsp[0].a_pres; }
     break;
 
-  case 250:
-#line 1931 "asn1p_y.y"
+  case 246:
+#line 1930 "asn1p_y.y"
     {
 		yyval.a_pres = ACPRES_PRESENT;
 	}
     break;
 
-  case 251:
-#line 1934 "asn1p_y.y"
+  case 247:
+#line 1933 "asn1p_y.y"
     {
 		yyval.a_pres = ACPRES_ABSENT;
 	}
     break;
 
-  case 252:
-#line 1937 "asn1p_y.y"
+  case 248:
+#line 1936 "asn1p_y.y"
     {
 		yyval.a_pres = ACPRES_OPTIONAL;
 	}
     break;
 
+  case 252:
+#line 1951 "asn1p_y.y"
+    { asn1p_lexer_hack_push_opaque_state(); }
+    break;
+
   case 253:
-#line 1943 "asn1p_y.y"
+#line 1951 "asn1p_y.y"
     {
-		yyval.a_constr = yyvsp[0].a_constr;
+		yyval.a_constr = asn1p_constraint_new(yylineno);
+		checkmem(yyval.a_constr);
+		yyval.a_constr->type = ACT_CT_CTDBY;
+		yyval.a_constr->value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0);
+		checkmem(yyval.a_constr->value);
+		yyval.a_constr->value->type = ATV_UNPARSED;
 	}
     break;
 
   case 254:
-#line 1946 "asn1p_y.y"
+#line 1962 "asn1p_y.y"
+    {
+		yyval.a_constr = asn1p_constraint_new(yylineno);
+		yyval.a_constr->type = ACT_CT_CTNG;
+		yyval.a_constr->value = asn1p_value_fromtype(yyvsp[0].a_expr);
+	}
+    break;
+
+  case 255:
+#line 1970 "asn1p_y.y"
+    { yyval.a_ctype = ACT_EL_RANGE; }
+    break;
+
+  case 256:
+#line 1971 "asn1p_y.y"
+    { yyval.a_ctype = ACT_EL_RLRANGE; }
+    break;
+
+  case 257:
+#line 1972 "asn1p_y.y"
+    { yyval.a_ctype = ACT_EL_LLRANGE; }
+    break;
+
+  case 258:
+#line 1973 "asn1p_y.y"
+    { yyval.a_ctype = ACT_EL_ULRANGE; }
+    break;
+
+  case 259:
+#line 1976 "asn1p_y.y"
     {
 		yyval.a_constr = yyvsp[0].a_constr;
 	}
     break;
 
-  case 255:
-#line 1955 "asn1p_y.y"
+  case 260:
+#line 1979 "asn1p_y.y"
+    {
+		yyval.a_constr = yyvsp[0].a_constr;
+	}
+    break;
+
+  case 261:
+#line 1988 "asn1p_y.y"
     {
 		asn1p_ref_t *ref = asn1p_ref_new(yylineno);
 		asn1p_constraint_t *ct;
@@ -3977,15 +4010,15 @@
 	}
     break;
 
-  case 256:
-#line 1970 "asn1p_y.y"
+  case 262:
+#line 2003 "asn1p_y.y"
     {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, yyvsp[-3].a_constr, yyvsp[-1].a_constr);
 	}
     break;
 
-  case 257:
-#line 1976 "asn1p_y.y"
+  case 263:
+#line 2009 "asn1p_y.y"
     {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
@@ -3994,8 +4027,8 @@
 	}
     break;
 
-  case 258:
-#line 1982 "asn1p_y.y"
+  case 264:
+#line 2015 "asn1p_y.y"
     {
 		asn1p_constraint_t *ct;
 		ct = asn1p_constraint_new(yylineno);
@@ -4006,8 +4039,8 @@
 	}
     break;
 
-  case 259:
-#line 1996 "asn1p_y.y"
+  case 265:
+#line 2029 "asn1p_y.y"
     {
 		char *p = malloc(strlen(yyvsp[0].tv_str) + 2);
 		int ret;
@@ -4021,8 +4054,8 @@
 	}
     break;
 
-  case 260:
-#line 2007 "asn1p_y.y"
+  case 266:
+#line 2040 "asn1p_y.y"
     {
 		char *p = malloc(strlen(yyvsp[0].tv_str) + 3);
 		int ret;
@@ -4037,15 +4070,15 @@
 	}
     break;
 
-  case 261:
-#line 2023 "asn1p_y.y"
+  case 267:
+#line 2056 "asn1p_y.y"
     {
 		yyval.tv_str = yyvsp[0].tv_str;
 	}
     break;
 
-  case 262:
-#line 2026 "asn1p_y.y"
+  case 268:
+#line 2059 "asn1p_y.y"
     {
 		int l1 = strlen(yyvsp[-2].tv_str);
 		int l3 = strlen(yyvsp[0].tv_str);
@@ -4057,71 +4090,71 @@
 	}
     break;
 
-  case 263:
-#line 2044 "asn1p_y.y"
+  case 269:
+#line 2077 "asn1p_y.y"
     {
 		yyval.a_marker.flags = EM_NOMARK;
 		yyval.a_marker.default_value = 0;
 	}
     break;
 
-  case 264:
-#line 2048 "asn1p_y.y"
+  case 270:
+#line 2081 "asn1p_y.y"
     { yyval.a_marker = yyvsp[0].a_marker; }
     break;
 
-  case 265:
-#line 2052 "asn1p_y.y"
+  case 271:
+#line 2085 "asn1p_y.y"
     {
 		yyval.a_marker.flags = EM_OPTIONAL | EM_INDIRECT;
 		yyval.a_marker.default_value = 0;
 	}
     break;
 
-  case 266:
-#line 2056 "asn1p_y.y"
+  case 272:
+#line 2089 "asn1p_y.y"
     {
 		yyval.a_marker.flags = EM_DEFAULT;
 		yyval.a_marker.default_value = yyvsp[0].a_value;
 	}
     break;
 
-  case 267:
-#line 2079 "asn1p_y.y"
+  case 273:
+#line 2112 "asn1p_y.y"
     {
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
 	}
     break;
 
-  case 268:
-#line 2083 "asn1p_y.y"
+  case 274:
+#line 2116 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[-1].a_expr;
 	}
     break;
 
-  case 269:
-#line 2089 "asn1p_y.y"
+  case 275:
+#line 2122 "asn1p_y.y"
     {
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
 	}
     break;
 
-  case 270:
-#line 2094 "asn1p_y.y"
+  case 276:
+#line 2127 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
 	}
     break;
 
-  case 271:
-#line 2101 "asn1p_y.y"
+  case 277:
+#line 2134 "asn1p_y.y"
     {
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
 		yyval.a_expr->expr_type = A1TC_UNIVERVAL;
 		yyval.a_expr->meta_type = AMT_VALUE;
@@ -4129,10 +4162,10 @@
 	}
     break;
 
-  case 272:
-#line 2108 "asn1p_y.y"
+  case 278:
+#line 2141 "asn1p_y.y"
     {
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
 		yyval.a_expr->expr_type = A1TC_UNIVERVAL;
 		yyval.a_expr->meta_type = AMT_VALUE;
@@ -4141,10 +4174,10 @@
 	}
     break;
 
-  case 273:
-#line 2116 "asn1p_y.y"
+  case 279:
+#line 2149 "asn1p_y.y"
     {
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
 		yyval.a_expr->expr_type = A1TC_UNIVERVAL;
 		yyval.a_expr->meta_type = AMT_VALUE;
@@ -4153,10 +4186,10 @@
 	}
     break;
 
-  case 274:
-#line 2124 "asn1p_y.y"
+  case 280:
+#line 2157 "asn1p_y.y"
     {
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
 		yyval.a_expr->expr_type = A1TC_UNIVERVAL;
 		yyval.a_expr->meta_type = AMT_VALUE;
@@ -4164,10 +4197,10 @@
 	}
     break;
 
-  case 275:
-#line 2131 "asn1p_y.y"
+  case 281:
+#line 2164 "asn1p_y.y"
     {
-		yyval.a_expr = asn1p_expr_new(yylineno);
+		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
 		yyval.a_expr->Identifier = strdup("...");
 		checkmem(yyval.a_expr->Identifier);
@@ -4176,129 +4209,129 @@
 	}
     break;
 
-  case 276:
-#line 2142 "asn1p_y.y"
+  case 282:
+#line 2175 "asn1p_y.y"
     {
 		yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int);
 		checkmem(yyval.a_value);
 	}
     break;
 
-  case 277:
-#line 2146 "asn1p_y.y"
+  case 283:
+#line 2179 "asn1p_y.y"
     {
 		yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int);
 		checkmem(yyval.a_value);
 	}
     break;
 
-  case 279:
-#line 2154 "asn1p_y.y"
+  case 285:
+#line 2187 "asn1p_y.y"
     {
 		yyval.a_value = asn1p_value_fromdouble(yyvsp[0].a_dbl);
 		checkmem(yyval.a_value);
 	}
     break;
 
-  case 280:
-#line 2185 "asn1p_y.y"
+  case 286:
+#line 2218 "asn1p_y.y"
     { memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); }
     break;
 
-  case 281:
-#line 2186 "asn1p_y.y"
+  case 287:
+#line 2219 "asn1p_y.y"
     { yyval.a_tag = yyvsp[0].a_tag; }
     break;
 
-  case 282:
-#line 2190 "asn1p_y.y"
+  case 288:
+#line 2223 "asn1p_y.y"
     {
 		yyval.a_tag = yyvsp[-1].a_tag;
 		yyval.a_tag.tag_mode = yyvsp[0].a_tag.tag_mode;
 	}
     break;
 
-  case 283:
-#line 2197 "asn1p_y.y"
+  case 289:
+#line 2230 "asn1p_y.y"
     {
 		yyval.a_tag = yyvsp[-2].a_tag;
 		yyval.a_tag.tag_value = yyvsp[-1].a_int;
 	}
     break;
 
-  case 284:
-#line 2203 "asn1p_y.y"
+  case 290:
+#line 2236 "asn1p_y.y"
     { yyval.a_tag.tag_class = TC_CONTEXT_SPECIFIC; }
     break;
 
-  case 285:
-#line 2204 "asn1p_y.y"
+  case 291:
+#line 2237 "asn1p_y.y"
     { yyval.a_tag.tag_class = TC_UNIVERSAL; }
     break;
 
-  case 286:
-#line 2205 "asn1p_y.y"
+  case 292:
+#line 2238 "asn1p_y.y"
     { yyval.a_tag.tag_class = TC_APPLICATION; }
     break;
 
-  case 287:
-#line 2206 "asn1p_y.y"
+  case 293:
+#line 2239 "asn1p_y.y"
     { yyval.a_tag.tag_class = TC_PRIVATE; }
     break;
 
-  case 288:
-#line 2210 "asn1p_y.y"
+  case 294:
+#line 2243 "asn1p_y.y"
     { yyval.a_tag.tag_mode = TM_DEFAULT; }
     break;
 
-  case 289:
-#line 2211 "asn1p_y.y"
+  case 295:
+#line 2244 "asn1p_y.y"
     { yyval.a_tag.tag_mode = TM_IMPLICIT; }
     break;
 
-  case 290:
-#line 2212 "asn1p_y.y"
+  case 296:
+#line 2245 "asn1p_y.y"
     { yyval.a_tag.tag_mode = TM_EXPLICIT; }
     break;
 
-  case 291:
-#line 2216 "asn1p_y.y"
+  case 297:
+#line 2249 "asn1p_y.y"
     {
 		checkmem(yyvsp[0].tv_str);
 		yyval.tv_str = yyvsp[0].tv_str;
 	}
     break;
 
-  case 292:
-#line 2220 "asn1p_y.y"
+  case 298:
+#line 2253 "asn1p_y.y"
     {
 		checkmem(yyvsp[0].tv_str);
 		yyval.tv_str = yyvsp[0].tv_str;
 	}
     break;
 
-  case 293:
-#line 2228 "asn1p_y.y"
+  case 299:
+#line 2261 "asn1p_y.y"
     {
 		checkmem(yyvsp[0].tv_str);
 		yyval.tv_str = yyvsp[0].tv_str;
 	}
     break;
 
-  case 294:
-#line 2235 "asn1p_y.y"
+  case 300:
+#line 2268 "asn1p_y.y"
     { yyval.tv_str = 0; }
     break;
 
-  case 295:
-#line 2236 "asn1p_y.y"
+  case 301:
+#line 2269 "asn1p_y.y"
     {
 		yyval.tv_str = yyvsp[0].tv_str;
 	}
     break;
 
-  case 296:
-#line 2242 "asn1p_y.y"
+  case 302:
+#line 2275 "asn1p_y.y"
     {
 		checkmem(yyvsp[0].tv_str);
 		yyval.tv_str = yyvsp[0].tv_str;
@@ -4309,7 +4342,7 @@
     }
 
 /* Line 1016 of /usr/local/share/bison/yacc.c.  */
-#line 4313 "asn1p_y.c"
+#line 4346 "asn1p_y.c"
 
   yyvsp -= yylen;
   yyssp -= yylen;
@@ -4528,7 +4561,7 @@
 }
 
 
-#line 2248 "asn1p_y.y"
+#line 2281 "asn1p_y.y"
 
 
 
diff --git a/libasn1parser/asn1p_y.h b/libasn1parser/asn1p_y.h
index 19de334..ee3af65 100644
--- a/libasn1parser/asn1p_y.h
+++ b/libasn1parser/asn1p_y.h
@@ -245,7 +245,7 @@
 
 
 #ifndef YYSTYPE
-#line 85 "asn1p_y.y"
+#line 88 "asn1p_y.y"
 typedef union {
 	asn1p_t			*a_grammar;
 	asn1p_module_flags_e	 a_module_flags;
diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y
index b252a73..9baa9ce 100644
--- a/libasn1parser/asn1p_y.y
+++ b/libasn1parser/asn1p_y.y
@@ -37,6 +37,9 @@
 static asn1p_value_t *_convert_bitstring2binary(char *str, int base);
 static void _fixup_anonymous_identifier(asn1p_expr_t *expr);
 
+static asn1p_module_t *currentModule;
+#define	NEW_EXPR()	(asn1p_expr_new(yylineno, currentModule))
+
 #define	checkmem(ptr)	do {						\
 		if(!(ptr))						\
 		return yyerror("Memory failure");			\
@@ -255,6 +258,7 @@
 %type	<a_expr>		ImportsElement
 %type	<a_expr>		ExportsElement
 %type	<a_expr>		ExtensionAndException
+%type	<a_expr>		Type
 %type	<a_expr>		TypeDeclaration
 %type	<a_expr>		TypeDeclarationSet
 %type	<a_ref>			ComplexTypeReference
@@ -266,7 +270,6 @@
 %type	<a_ref>			DefinedObjectClass
 %type	<a_expr>		ClassField
 %type	<a_expr>		ObjectClass
-%type	<a_expr>		Type
 %type	<a_expr>		DataTypeReference	/* Type1 ::= Type2 */
 %type	<a_expr>		DefinedType
 %type	<a_constr>		ValueSet		/* {a|b|c}*/
@@ -307,13 +310,17 @@
 %type	<a_tag>			TagClass TagTypeValue TagPlicit
 %type	<a_tag>			optTag		/* [UNIVERSAL 0] IMPLICIT */
 %type	<a_constr>		optConstraints
-%type	<a_constr>		Constraints
+%type	<a_constr>		Constraint
+%type	<a_constr>		SubtypeConstraint
+%type	<a_constr>		GeneralConstraint
 %type	<a_constr>		SetOfConstraints
 %type	<a_constr>		ElementSetSpecs		/* 1..2,...,3 */
 %type	<a_constr>		ElementSetSpec		/* 1..2,...,3 */
 %type	<a_constr>		ConstraintSubtypeElement /* 1..2 */
 %type	<a_constr>		SimpleTableConstraint
+%type	<a_constr>		UserDefinedConstraint
 %type	<a_constr>		TableConstraint
+%type	<a_constr>		ContentsConstraint
 %type	<a_constr>		InnerTypeConstraint
 %type	<a_constr>		WithComponentsList
 %type	<a_constr>		WithComponentsElement
@@ -368,23 +375,27 @@
  */
 
 ModuleDefinition:
-	TypeRefName optObjectIdentifier TOK_DEFINITIONS
+	TypeRefName { currentModule = asn1p_module_new(); }
+	optObjectIdentifier TOK_DEFINITIONS
 		optModuleDefinitionFlags
 		TOK_PPEQ TOK_BEGIN
 		optModuleBody
 		TOK_END {
 
-		if($7) {
-			$$ = $7;
+		$$ = currentModule;
+
+		if($8) {
+			asn1p_module_t tmp = *($$);
+			*($$) = *($8);
+			*($8) = tmp;
+			asn1p_module_free($8);
 		} else {
 			/* There's a chance that a module is just plain empty */
-			$$ = asn1p_module_new();
 		}
-		checkmem($$);
 
 		$$->ModuleName = $1;
-		$$->module_oid = $2;
-		$$->module_flags = $4;
+		$$->module_oid = $3;
+		$$->module_flags = $5;
 	}
 	;
 
@@ -649,19 +660,19 @@
 
 ImportsElement:
 	TypeRefName {
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		checkmem($$);
 		$$->Identifier = $1;
 		$$->expr_type = A1TC_REFERENCE;
 	}
 	| TypeRefName '{' '}' {		/* Completely equivalent to above */
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		checkmem($$);
 		$$->Identifier = $1;
 		$$->expr_type = A1TC_REFERENCE;
 	}
 	| Identifier {
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		checkmem($$);
 		$$->Identifier = $1;
 		$$->expr_type = A1TC_REFERENCE;
@@ -710,19 +721,19 @@
 
 ExportsElement:
 	TypeRefName {
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		checkmem($$);
 		$$->Identifier = $1;
 		$$->expr_type = A1TC_EXPORTVAR;
 	}
 	| TypeRefName '{' '}' {
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		checkmem($$);
 		$$->Identifier = $1;
 		$$->expr_type = A1TC_EXPORTVAR;
 	}
 	| Identifier {
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		checkmem($$);
 		$$->Identifier = $1;
 		$$->expr_type = A1TC_EXPORTVAR;
@@ -757,7 +768,7 @@
 	 * "Type"
 	 */
 	| ComplexTypeReference {
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		checkmem($$);
 		$$->reference = $1;
 		$$->expr_type = A1TC_REFERENCE;
@@ -767,7 +778,7 @@
 	 * A parameterized assignment.
 	 */
 	| ComplexTypeReference '{' ActualParameterList '}' {
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		checkmem($$);
 		$$->reference = $1;
 		$$->rhs_pspecs = $3;
@@ -880,7 +891,7 @@
 
 ActualParameterList:
 	ActualParameter {
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		checkmem($$);
 		asn1p_expr_add($$, $1);
 	}
@@ -895,7 +906,7 @@
 		$$ = $1;
 	}
 	| SimpleValue {
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		checkmem($$);
 		$$->Identifier = "?";
 		$$->expr_type = A1TC_REFERENCE;
@@ -904,7 +915,7 @@
 	}
 	| Identifier {
 		asn1p_ref_t *ref;
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		checkmem($$);
 		$$->Identifier = $1;
 		$$->expr_type = A1TC_REFERENCE;
@@ -914,7 +925,7 @@
 		$$->value = asn1p_value_fromref(ref, 0);
 	}
 	| ValueSet {
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		$$->expr_type = A1TC_VALUESET;
 		$$->meta_type = AMT_VALUESET;
 		$$->constraints = $1;
@@ -923,7 +934,7 @@
 
 /*
 	| '{' ActualParameter '}' {
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		checkmem($$);
 		asn1p_expr_add($$, $2);
 		$$->expr_type = A1TC_PARAMETRIZED;
@@ -936,12 +947,12 @@
  * A collection of constructed data type members.
  */
 optComponentTypeLists:
-	{ $$ = asn1p_expr_new(yylineno); }
+	{ $$ = NEW_EXPR(); }
 	| ComponentTypeLists { $$ = $1; };
 
 ComponentTypeLists:
 	ComponentType {
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		checkmem($$);
 		asn1p_expr_add($$, $1);
 	}
@@ -966,7 +977,7 @@
 		_fixup_anonymous_identifier($$);
 	}
 	| TOK_COMPONENTS TOK_OF Type {
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		checkmem($$);
 		$$->meta_type = $3->meta_type;
 		$$->expr_type = A1TC_COMPONENTS_OF;
@@ -979,7 +990,7 @@
 
 AlternativeTypeLists:
 	AlternativeType {
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		checkmem($$);
 		asn1p_expr_add($$, $1);
 	}
@@ -1021,7 +1032,7 @@
 
 FieldSpec:
 	ClassField {
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		checkmem($$);
 		$$->expr_type = A1TC_CLASSDEF;
 		$$->meta_type = AMT_OBJECTCLASS;
@@ -1038,7 +1049,7 @@
 
 	/* TypeFieldSpec ::= typefieldreference TypeOptionalitySpec? */
 	TOK_typefieldreference optMarker {
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		checkmem($$);
 		$$->Identifier = $1;
 		$$->meta_type = AMT_OBJECTFIELD;
@@ -1048,7 +1059,7 @@
 
 	/* FixedTypeValueFieldSpec ::= valuefieldreference Type UNIQUE ? ValueOptionalitySpec ? */
 	| TOK_valuefieldreference Type optUnique optMarker {
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		$$->Identifier = $1;
 		$$->meta_type = AMT_OBJECTFIELD;
 		$$->expr_type = A1TC_CLASSFIELD_FTVFS;	/* FixedTypeValueFieldSpec */
@@ -1059,7 +1070,7 @@
 
 	/* VariableTypeValueFieldSpec ::= valuefieldreference FieldName ValueOptionalitySpec ? */
 	| TOK_valuefieldreference FieldName optMarker {
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		$$->Identifier = $1;
 		$$->meta_type = AMT_OBJECTFIELD;
 		$$->expr_type = A1TC_CLASSFIELD_VTVFS;
@@ -1069,7 +1080,7 @@
 
 	/*  ObjectFieldSpec ::= objectfieldreference DefinedObjectClass ObjectOptionalitySpec ? */
 	| TOK_valuefieldreference DefinedObjectClass optMarker {
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		checkmem($$);
 		$$->Identifier = $1;
 		$$->reference = $2;
@@ -1080,7 +1091,7 @@
 
 	/* VariableTypeValueSetFieldSpec ::= valuesetfieldreference FieldName ValueOptionalitySpec ? */
 	| TOK_typefieldreference FieldName optMarker {
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		$$->Identifier = $1;
 		$$->meta_type = AMT_OBJECTFIELD;
 		$$->expr_type = A1TC_CLASSFIELD_VTVSFS;
@@ -1090,7 +1101,7 @@
 
 	/* FixedTypeValueSetFieldSpec ::= valuesetfieldreference Type ValueSetOptionalitySpec ? */
 	| TOK_typefieldreference Type optMarker {
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		checkmem($$);
 		$$->Identifier = $1;
 		$$->meta_type = AMT_OBJECTFIELD;
@@ -1101,7 +1112,7 @@
 
 	/*  ObjectSetFieldSpec ::= objectsetfieldreference DefinedObjectClass ObjectOptionalitySpec ? */
 	| TOK_typefieldreference DefinedObjectClass optMarker {
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		checkmem($$);
 		$$->Identifier = $1;
 		$$->reference = $2;
@@ -1157,7 +1168,7 @@
 
 ExtensionAndException:
 	TOK_ThreeDots {
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		checkmem($$);
 		$$->Identifier = strdup("...");
 		checkmem($$->Identifier);
@@ -1165,7 +1176,7 @@
 		$$->meta_type = AMT_TYPE;
 	}
 	| TOK_ThreeDots '!' DefinedValue {
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		checkmem($$);
 		$$->Identifier = strdup("...");
 		checkmem($$->Identifier);
@@ -1174,7 +1185,7 @@
 		$$->meta_type = AMT_TYPE;
 	}
 	| TOK_ThreeDots '!' SignedNumber {
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		checkmem($$);
 		$$->Identifier = strdup("...");
 		$$->value = $3;
@@ -1255,7 +1266,7 @@
 		$$->meta_type = AMT_TYPE;
 	}
 	| TOK_SEQUENCE optConstraints TOK_OF optIdentifier optTag TypeDeclaration {
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		checkmem($$);
 		$$->constraints = $2;
 		$$->expr_type = ASN_CONSTR_SEQUENCE_OF;
@@ -1265,7 +1276,7 @@
 		asn1p_expr_add($$, $6);
 	}
 	| TOK_SET optConstraints TOK_OF optIdentifier optTag TypeDeclaration {
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		checkmem($$);
 		$$->constraints = $2;
 		$$->expr_type = ASN_CONSTR_SET_OF;
@@ -1275,14 +1286,14 @@
 		asn1p_expr_add($$, $6);
 	}
 	| TOK_ANY 					{
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		checkmem($$);
 		$$->expr_type = ASN_TYPE_ANY;
 		$$->meta_type = AMT_TYPE;
 	}
 	| TOK_ANY TOK_DEFINED TOK_BY Identifier		{
 		int ret;
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		checkmem($$);
 		$$->reference = asn1p_ref_new(yylineno);
 		ret = asn1p_ref_add_component($$->reference,
@@ -1292,7 +1303,7 @@
 		$$->meta_type = AMT_TYPE;
 	}
 	| TOK_INSTANCE TOK_OF ComplexTypeReference {
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		checkmem($$);
 		$$->reference = $3;
 		$$->expr_type = A1TC_INSTANCE;
@@ -1625,7 +1636,7 @@
 
 BasicType:
 	BasicTypeId {
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		checkmem($$);
 		$$->expr_type = $1;
 		$$->meta_type = AMT_TYPE;
@@ -1634,7 +1645,7 @@
 		if($2) {
 			$$ = $2;
 		} else {
-			$$ = asn1p_expr_new(yylineno);
+			$$ = NEW_EXPR();
 			checkmem($$);
 		}
 		$$->expr_type = $1;
@@ -1681,12 +1692,19 @@
 
 optConstraints:
 	{ $$ = 0; }
-	| Constraints {
+	| Constraint {
 		$$ = $1;
 	}
 	;
 
-Constraints:
+Constraint:
+	SubtypeConstraint
+	| '(' GeneralConstraint ')' {
+		$$ = $2;
+	}
+	;
+
+SubtypeConstraint:
 	SetOfConstraints {
 		CONSTRAINT_INSERT($$, ACT_CA_SET, $1, 0);
 	}
@@ -1811,28 +1829,9 @@
 		$$->range_start->type = ATV_MIN;
 		$$->range_stop->type = ATV_MAX;
 	}
-	| TableConstraint {
-		$$ = $1;
-	}
 	| InnerTypeConstraint {
 		$$ = $1;
 	}
-	| TOK_CONSTRAINED TOK_BY '{'
-		{ asn1p_lexer_hack_push_opaque_state(); } Opaque /* '}' */ {
-		$$ = asn1p_constraint_new(yylineno);
-		checkmem($$);
-		$$->type = ACT_CT_CTDBY;
-		$$->value = asn1p_value_frombuf($5.buf, $5.len, 0);
-		checkmem($$->value);
-		$$->value->type = ATV_UNPARSED;
-	}
-	;
-
-ConstraintRangeSpec:
-	TOK_TwoDots		{ $$ = ACT_EL_RANGE; }
-	| TOK_TwoDots '<'	{ $$ = ACT_EL_RLRANGE; }
-	| '<' TOK_TwoDots	{ $$ = ACT_EL_LLRANGE; }
-	| '<' TOK_TwoDots '<'	{ $$ = ACT_EL_ULRANGE; }
 	;
 
 ConstraintSpec:
@@ -1939,6 +1938,40 @@
 	}
 	;
 
+
+/* X.682 */
+GeneralConstraint:
+	UserDefinedConstraint
+	| TableConstraint
+	| ContentsConstraint
+	;
+
+UserDefinedConstraint:
+	TOK_CONSTRAINED TOK_BY '{'
+		{ asn1p_lexer_hack_push_opaque_state(); } Opaque /* '}' */ {
+		$$ = asn1p_constraint_new(yylineno);
+		checkmem($$);
+		$$->type = ACT_CT_CTDBY;
+		$$->value = asn1p_value_frombuf($5.buf, $5.len, 0);
+		checkmem($$->value);
+		$$->value->type = ATV_UNPARSED;
+	}
+	;
+
+ContentsConstraint:
+	TOK_CONTAINING Type {
+		$$ = asn1p_constraint_new(yylineno);
+		$$->type = ACT_CT_CTNG;
+		$$->value = asn1p_value_fromtype($2);
+	}
+	;
+
+ConstraintRangeSpec:
+	TOK_TwoDots		{ $$ = ACT_EL_RANGE; }
+	| TOK_TwoDots '<'	{ $$ = ACT_EL_RLRANGE; }
+	| '<' TOK_TwoDots	{ $$ = ACT_EL_LLRANGE; }
+	| '<' TOK_TwoDots '<'	{ $$ = ACT_EL_ULRANGE; }
+	;
 TableConstraint:
 	SimpleTableConstraint {
 		$$ = $1;
@@ -2077,7 +2110,7 @@
 
 UniverationDefinition:
 	'{' '}' {
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		checkmem($$);
 	}
 	| '{' UniverationList '}' {
@@ -2087,7 +2120,7 @@
 
 UniverationList:
 	UniverationElement {
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		checkmem($$);
 		asn1p_expr_add($$, $1);
 	}
@@ -2099,14 +2132,14 @@
 
 UniverationElement:
 	Identifier {
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		checkmem($$);
 		$$->expr_type = A1TC_UNIVERVAL;
 		$$->meta_type = AMT_VALUE;
 		$$->Identifier = $1;
 	}
 	| Identifier '(' SignedNumber ')' {
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		checkmem($$);
 		$$->expr_type = A1TC_UNIVERVAL;
 		$$->meta_type = AMT_VALUE;
@@ -2114,7 +2147,7 @@
 		$$->value = $3;
 	}
 	| Identifier '(' DefinedValue ')' {
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		checkmem($$);
 		$$->expr_type = A1TC_UNIVERVAL;
 		$$->meta_type = AMT_VALUE;
@@ -2122,14 +2155,14 @@
 		$$->value = $3;
 	}
 	| SignedNumber {
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		checkmem($$);
 		$$->expr_type = A1TC_UNIVERVAL;
 		$$->meta_type = AMT_VALUE;
 		$$->value = $1;
 	}
 	| TOK_ThreeDots {
-		$$ = asn1p_expr_new(yylineno);
+		$$ = NEW_EXPR();
 		checkmem($$);
 		$$->Identifier = strdup("...");
 		checkmem($$->Identifier);
diff --git a/libasn1parser/asn1parser.c b/libasn1parser/asn1parser.c
index a2e2ae2..7d9a88d 100644
--- a/libasn1parser/asn1parser.c
+++ b/libasn1parser/asn1parser.c
@@ -150,45 +150,14 @@
 	return 0;
 }
 
-/*
- * Perform last touches.
- */
-static void
-_asn1p_apply_module2expr(asn1p_expr_t *expr, asn1p_module_t *mod) {
-	asn1p_expr_t *e;
-
-	expr->module = mod;	/* This is a useful thing */
-
-	/*
-	 * Do it to children also.
-	 */
-	TQ_FOR(e, &(expr->members), next) {
-		_asn1p_apply_module2expr(e, mod);
-	}
-
-	/*
-	 * Do to parameterization.
-	 */
-	if(expr->rhs_pspecs) {
-		TQ_FOR(e, &(expr->rhs_pspecs->members), next) {
-			_asn1p_apply_module2expr(e, mod);
-		}
-	}
-}
-
 static int
 _asn1p_fix_modules(asn1p_t *a, const char *fname) {
 	asn1p_module_t *mod;
 	TQ_FOR(mod, &(a->modules), mod_next) {
-		asn1p_expr_t *expr;
-
 		mod->source_file_name = strdup(fname);
 		if(mod->source_file_name == NULL)
 			return -1;
-
-		TQ_FOR(expr, &(mod->members), next) {
-			_asn1p_apply_module2expr(expr, mod);
-		}
+		mod->asn1p = a;
 	}
 	return 0;
 }
diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c
index 47cfb1f..3462d1a 100644
--- a/libasn1print/asn1print.c
+++ b/libasn1print/asn1print.c
@@ -190,6 +190,11 @@
 	case ATV_REAL:
 		printf("%f", val->value.v_double);
 		return 0;
+	case ATV_TYPE:
+		asn1print_expr(val->value.v_type->module->asn1p,
+			val->value.v_type->module,
+			val->value.v_type, flags, 0);
+		return 0;
 	case ATV_INTEGER:
 		printf("%" PRIdASN, val->value.v_integer);
 		return 0;
@@ -349,10 +354,19 @@
 		}
 		break;
 	case ACT_CT_CTDBY:
-		printf("CONSTRAINED BY ");
+		printf("(CONSTRAINED BY ");
 		assert(ct->value->type == ATV_UNPARSED);
 		fwrite(ct->value->value.string.buf,
 			1, ct->value->value.string.size, stdout);
+		printf(")");
+		break;
+	case ACT_CT_CTNG:
+		printf("(CONTAINING ");
+		asn1print_expr(ct->value->value.v_type->module->asn1p,
+			ct->value->value.v_type->module,
+			ct->value->value.v_type,
+			flags, 1);
+		printf(")");
 		break;
 	case ACT_CA_SET: symno++;
 	case ACT_CA_CRC: symno++;
@@ -364,6 +378,7 @@
 			char *symtable[] = { " EXCEPT ", " ^ ", " | ", ",",
 					"", "(" };
 			unsigned int i;
+			if(ct->type == ACT_CA_CRC) fputs("(", stdout);
 			for(i = 0; i < ct->el_count; i++) {
 				if(i) fputs(symtable[symno], stdout);
 				if(ct->type == ACT_CA_CRC) fputs("{", stdout);
@@ -373,6 +388,7 @@
 				&& ct->type == ACT_CA_SET)
 					fputs(")", stdout);
 			}
+			if(ct->type == ACT_CA_CRC) fputs(")", stdout);
 		}
 		break;
 	case ACT_CA_AEX: