COMPONENTS OF support and other enhancements


git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@185 59561ff5-6e30-0410-9f3c-9617f08c8826
diff --git a/libasn1parser/asn1p_expr.c b/libasn1parser/asn1p_expr.c
index be9da77..4337981 100644
--- a/libasn1parser/asn1p_expr.c
+++ b/libasn1parser/asn1p_expr.c
@@ -23,9 +23,10 @@
 }
 
 asn1p_expr_t *
-asn1p_expr_clone(asn1p_expr_t *expr) {
+asn1p_expr_clone(asn1p_expr_t *expr, int skip_extensions) {
 	asn1p_expr_t *clone;
 	asn1p_expr_t *tcmemb;	/* Child of tc */
+	int hit_ext = 0;
 
 	clone = asn1p_expr_new(expr->_lineno);
 	if(clone == NULL) return NULL;
@@ -45,7 +46,8 @@
 	CLCOPY(meta_type);
 	CLCOPY(expr_type);
 	CLCOPY(tag);
-	CLCOPY(marker);
+	CLCOPY(marker);		/* OPTIONAL/DEFAULT */
+	CLCOPY(module);
 	CLCOPY(_mark);
 
 	clone->data = 0;	/* Do not clone this */
@@ -66,7 +68,16 @@
 	 * Copy all the children of this expr.
 	 */
 	TQ_FOR(tcmemb, &(expr->members), next) {
-		asn1p_expr_t *cmemb = asn1p_expr_clone(tcmemb);
+		asn1p_expr_t *cmemb;
+
+		if(skip_extensions
+		&& tcmemb->expr_type == A1TC_EXTENSIBLE) {
+			hit_ext++; /* Even if hit_ext wraps around, we're OK. */
+			continue;
+		}
+		if(hit_ext == 1) continue;	/* Skip between ...'s */
+
+		cmemb = asn1p_expr_clone(tcmemb, skip_extensions);
 		if(cmemb == NULL) {
 			asn1p_expr_free(clone);
 			return NULL;
diff --git a/libasn1parser/asn1p_expr.h b/libasn1parser/asn1p_expr.h
index ef1941b..e00e740 100644
--- a/libasn1parser/asn1p_expr.h
+++ b/libasn1parser/asn1p_expr.h
@@ -35,12 +35,14 @@
 	A1TC_BITVECTOR,		/* A plain collection of bits */
 	A1TC_OPAQUE,		/* Opaque data encoded as a bitvector */
 	A1TC_EXTENSIBLE,	/* An extension marker "..." */
+	A1TC_COMPONENTS_OF,	/* COMPONENTS OF clause */
 	A1TC_PARAMETRIZED,	/* A parametrized type declaration */
 	A1TC_VALUESET,		/* Value set definition */
 	A1TC_CLASSDEF,		/* Information Object Class */
 	A1TC_CLASSFIELD,	/* Information Object Class field */
 	A1TC_INSTANCE,		/* Instance of Object Class */
 	A1TC_TYPEID,		/* Type identifier */
+
 	/*
 	 * ASN.1 Constructed types
 	 */
@@ -69,6 +71,7 @@
 	ASN_BASIC_CHARACTER_STRING,
 	ASN_BASIC_UTCTime,
 	ASN_BASIC_GeneralizedTime,
+
 	/*
 	 * ASN.1 String types
 	 */
@@ -93,6 +96,8 @@
 #include "asn1p_expr_str.h"
 #include "asn1p_expr2uclass.h"
 
+struct asn1p_module_s;	/* Forward declaration */
+
 /*
  * A named collection of types.
  */
@@ -192,6 +197,9 @@
 	 * grammar source.
 	 */
 	int _lineno;
+
+	struct asn1p_module_s *module;	/* Defined in module */
+
 	/*
 	 * Marks are used for various purposes.
 	 * Here are some predefined ones.
@@ -201,6 +209,8 @@
 		TM_RECURSION,	/* Used to break recursion */
 	} _mark;
 
+	int _anonymous_type;	/* Used by the compiler */
+
 	/*
 	 * Opaque data may be attached to this structure,
 	 * probably by compiler.
@@ -214,7 +224,7 @@
  * Constructor and destructor.
  */
 asn1p_expr_t *asn1p_expr_new(int _lineno);
-asn1p_expr_t *asn1p_expr_clone(asn1p_expr_t *);
+asn1p_expr_t *asn1p_expr_clone(asn1p_expr_t *, int skip_extensions);
 void asn1p_expr_free(asn1p_expr_t *expr);
 
 #endif	/* ASN1_PARSER_EXPR_H */
diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c
index fe2d194..e8cdfb2 100644
--- a/libasn1parser/asn1p_y.c
+++ b/libasn1parser/asn1p_y.c
@@ -205,7 +205,7 @@
 
 
 
-#define	YYFINAL		385
+#define	YYFINAL		391
 #define	YYFLAG		-32768
 #define	YYNTBASE	115
 
@@ -259,24 +259,25 @@
    107,   111,   113,   115,   119,   123,   126,   128,   132,   134,
    136,   143,   145,   147,   148,   150,   155,   160,   164,   171,
    173,   177,   179,   183,   187,   189,   193,   195,   197,   199,
-   203,   209,   210,   212,   214,   218,   221,   225,   230,   231,
-   233,   234,   241,   243,   246,   248,   250,   253,   255,   259,
-   261,   263,   267,   271,   273,   275,   277,   282,   284,   288,
-   290,   294,   298,   300,   304,   306,   310,   312,   314,   316,
-   318,   323,   324,   328,   330,   332,   334,   336,   338,   340,
-   344,   346,   349,   351,   353,   355,   357,   360,   363,   365,
-   367,   370,   373,   375,   377,   379,   381,   384,   386,   389,
-   391,   393,   395,   397,   399,   401,   403,   405,   407,   409,
-   411,   413,   415,   417,   422,   427,   432,   437,   442,   444,
-   449,   451,   453,   455,   457,   459,   460,   462,   464,   469,
-   473,   478,   480,   484,   490,   492,   496,   500,   504,   509,
-   513,   515,   519,   523,   527,   531,   533,   535,   537,   540,
-   543,   547,   549,   551,   553,   555,   557,   559,   561,   567,
-   569,   573,   575,   579,   580,   582,   584,   586,   588,   590,
-   592,   596,   601,   603,   607,   610,   614,   616,   620,   621,
-   623,   625,   628,   630,   632,   633,   637,   640,   644,   646,
-   650,   652,   657,   662,   664,   666,   668,   670,   671,   673,
-   675,   678,   681,   683,   685,   687,   689,   691
+   203,   207,   211,   213,   215,   219,   222,   224,   230,   231,
+   233,   235,   239,   242,   247,   252,   253,   255,   256,   263,
+   265,   268,   270,   272,   274,   278,   282,   285,   287,   289,
+   294,   299,   304,   309,   314,   316,   321,   326,   328,   332,
+   334,   338,   342,   344,   348,   350,   354,   356,   358,   360,
+   362,   367,   368,   372,   374,   376,   378,   380,   382,   384,
+   388,   390,   393,   395,   397,   399,   401,   404,   407,   409,
+   411,   414,   417,   419,   421,   423,   425,   428,   430,   433,
+   435,   437,   439,   441,   443,   445,   447,   449,   451,   453,
+   455,   457,   459,   461,   463,   465,   467,   469,   471,   472,
+   474,   476,   481,   485,   490,   492,   496,   502,   504,   508,
+   512,   516,   521,   525,   527,   531,   535,   539,   543,   545,
+   547,   549,   552,   555,   559,   561,   563,   565,   567,   569,
+   571,   573,   579,   581,   585,   587,   591,   592,   594,   596,
+   598,   600,   602,   604,   608,   613,   615,   619,   622,   626,
+   628,   632,   633,   635,   637,   640,   642,   644,   645,   649,
+   652,   656,   658,   662,   664,   669,   674,   676,   678,   680,
+   682,   683,   685,   687,   690,   693,   695,   697,   699,   701,
+   703
 };
 
 static const short yyrhs[] = {   116,
@@ -287,69 +288,70 @@
    123,     0,   124,     0,   123,   124,     0,    41,    84,     0,
     52,    84,     0,    20,    84,     0,    43,    53,     0,    12,
     57,     0,     0,   126,     0,   127,     0,   126,   127,     0,
-   129,     0,   134,     0,   140,     0,   164,     0,   137,     0,
-     0,    38,    12,   128,     0,   172,     0,    54,   130,   108,
+   129,     0,   134,     0,   140,     0,   166,     0,   137,     0,
+     0,    38,    12,   128,     0,   174,     0,    54,   130,   108,
      0,    54,    46,     0,   131,     0,   130,   131,     0,   132,
     46,   208,   118,     0,   133,     0,   132,   109,   133,     0,
    208,     0,   210,     0,    42,   135,   108,     0,    42,    17,
    108,     0,    42,   108,     0,   136,     0,   135,   109,   136,
      0,   208,     0,   210,     0,   208,   138,     3,   104,   139,
-   105,     0,   159,     0,   169,     0,     0,   181,     0,   208,
-     3,   206,    87,     0,   208,     3,   206,   156,     0,   208,
-     3,   146,     0,   208,   104,   141,   105,     3,   156,     0,
+   105,     0,   161,     0,   171,     0,     0,   181,     0,   208,
+     3,   206,    87,     0,   208,     3,   206,   159,     0,   208,
+     3,   149,     0,   208,   104,   141,   105,     3,   159,     0,
    142,     0,   141,   109,   142,     0,   208,     0,   208,   110,
-   210,     0,   169,   110,   210,     0,   144,     0,   143,   109,
-   144,     0,   158,     0,   210,     0,   155,     0,   145,   109,
-   155,     0,    28,   104,   148,   105,   150,     0,     0,    88,
-     0,   149,     0,   148,   109,   149,     0,   162,   198,     0,
-   162,   156,   147,     0,   162,   162,   198,   147,     0,     0,
-   151,     0,     0,    95,    82,   104,   152,   153,   105,     0,
-   154,     0,   153,   154,     0,     4,     0,   162,     0,   211,
-   156,     0,   157,     0,   158,   178,   198,     0,   173,     0,
-   102,     0,   102,   111,   167,     0,   102,   111,   205,     0,
-   171,     0,   172,     0,   174,     0,   208,   104,   143,   105,
-     0,   159,     0,    56,    68,   159,     0,    11,     0,    11,
-   112,   208,     0,    11,   112,   210,     0,   209,     0,   209,
-   112,   160,     0,   161,     0,   160,   112,   161,     0,   163,
-     0,   163,     0,    13,     0,    14,     0,   210,   138,     3,
-   165,     0,     0,   104,   166,   168,     0,     5,     0,     7,
-     0,     6,     0,   205,     0,   167,     0,   210,     0,   208,
-   112,   210,     0,     4,     0,   168,     4,     0,    24,     0,
-    63,     0,    76,     0,   170,     0,    67,    81,     0,    65,
-    51,     0,    77,     0,    44,     0,    36,    71,     0,    26,
-    81,     0,    91,     0,    47,     0,    58,     0,    40,     0,
-    22,    81,     0,   169,     0,   170,   202,     0,    23,     0,
-    48,     0,    49,     0,    50,     0,    59,     0,    64,     0,
-    74,     0,    83,     0,    85,     0,    90,     0,    92,     0,
-    93,     0,    94,     0,    66,     0,    78,   178,    68,   156,
-     0,    79,   178,    68,   156,     0,    27,   104,   145,   105,
-     0,    78,   104,   145,   105,     0,    79,   104,   145,   105,
-     0,    18,     0,    18,    35,    25,   210,     0,    99,     0,
-   100,     0,    97,     0,    98,     0,    96,     0,     0,   179,
-     0,   180,     0,    80,   106,   181,   107,     0,   106,   181,
-   107,     0,   180,   106,   181,   107,     0,   182,     0,   182,
-   109,   102,     0,   182,   109,   102,   109,   182,     0,   183,
-     0,   182,   175,   183,     0,   182,   176,   183,     0,   183,
-   177,   183,     0,   185,   106,   181,   107,     0,   106,   181,
-   107,     0,   186,     0,   186,   184,   186,     0,    61,   184,
-   186,     0,   186,   184,    60,     0,    61,   184,    60,     0,
-   192,     0,   187,     0,   101,     0,   101,   113,     0,   113,
-   101,     0,   113,   101,   113,     0,    80,     0,    46,     0,
-   205,     0,   210,     0,     6,     0,    45,     0,    86,     0,
-    95,    30,   104,   188,   105,     0,   189,     0,   188,   109,
-   189,     0,   102,     0,   210,   178,   190,     0,     0,   191,
-     0,    73,     0,    15,     0,    69,     0,   193,     0,   194,
-     0,   104,   208,   105,     0,   193,   104,   195,   105,     0,
-   196,     0,   195,   109,   196,     0,   114,   197,     0,   114,
-   112,   197,     0,   210,     0,   197,   112,   210,     0,     0,
-   199,     0,    69,     0,    33,   200,     0,   186,     0,   169,
-     0,     0,   104,   201,   168,     0,   104,   105,     0,   104,
-   203,   105,     0,   204,     0,   203,   109,   204,     0,   210,
-     0,   210,   106,   205,   107,     0,   210,   106,   167,   107,
-     0,   205,     0,   102,     0,     9,     0,    10,     0,     0,
-   207,     0,   103,     0,   103,    52,     0,   103,    41,     0,
-    11,     0,    12,     0,    12,     0,     8,     0,   210,     0,
-   210,   207,     0
+   210,     0,   171,   110,   210,     0,   144,     0,   143,   109,
+   144,     0,   159,     0,   210,     0,   146,     0,   145,   109,
+   146,     0,   211,   159,   198,     0,    30,    68,   159,     0,
+   158,     0,   148,     0,   147,   109,   148,     0,   211,   159,
+     0,   158,     0,    28,   104,   151,   105,   153,     0,     0,
+    88,     0,   152,     0,   151,   109,   152,     0,   164,   198,
+     0,   164,   159,   198,   150,     0,   164,   164,   198,   150,
+     0,     0,   154,     0,     0,    95,    82,   104,   155,   156,
+   105,     0,   157,     0,   156,   157,     0,     4,     0,   164,
+     0,   102,     0,   102,   111,   169,     0,   102,   111,   205,
+     0,   160,   178,     0,   173,     0,   174,     0,    27,   104,
+   147,   105,     0,    78,   104,   145,   105,     0,    79,   104,
+   145,   105,     0,    78,   178,    68,   160,     0,    79,   178,
+    68,   160,     0,    18,     0,    18,    35,    25,   210,     0,
+   208,   104,   143,   105,     0,   161,     0,    56,    68,   161,
+     0,    11,     0,    11,   112,   208,     0,    11,   112,   210,
+     0,   209,     0,   209,   112,   162,     0,   163,     0,   162,
+   112,   163,     0,   165,     0,   165,     0,    13,     0,    14,
+     0,   210,   138,     3,   167,     0,     0,   104,   168,   170,
+     0,     5,     0,     7,     0,     6,     0,   205,     0,   169,
+     0,   210,     0,   208,   112,   210,     0,     4,     0,   170,
+     4,     0,    24,     0,    63,     0,    76,     0,   172,     0,
+    67,    81,     0,    65,    51,     0,    77,     0,    44,     0,
+    36,    71,     0,    26,    81,     0,    91,     0,    47,     0,
+    58,     0,    40,     0,    22,    81,     0,   171,     0,   172,
+   202,     0,    23,     0,    48,     0,    49,     0,    50,     0,
+    59,     0,    64,     0,    74,     0,    83,     0,    85,     0,
+    90,     0,    92,     0,    93,     0,    94,     0,    66,     0,
+    99,     0,   100,     0,    97,     0,    98,     0,    96,     0,
+     0,   179,     0,   180,     0,    80,   106,   181,   107,     0,
+   106,   181,   107,     0,   180,   106,   181,   107,     0,   182,
+     0,   182,   109,   102,     0,   182,   109,   102,   109,   182,
+     0,   183,     0,   182,   175,   183,     0,   182,   176,   183,
+     0,   183,   177,   183,     0,   185,   106,   181,   107,     0,
+   106,   181,   107,     0,   186,     0,   186,   184,   186,     0,
+    61,   184,   186,     0,   186,   184,    60,     0,    61,   184,
+    60,     0,   192,     0,   187,     0,   101,     0,   101,   113,
+     0,   113,   101,     0,   113,   101,   113,     0,    80,     0,
+    46,     0,   205,     0,   210,     0,     6,     0,    45,     0,
+    86,     0,    95,    30,   104,   188,   105,     0,   189,     0,
+   188,   109,   189,     0,   102,     0,   210,   178,   190,     0,
+     0,   191,     0,    73,     0,    15,     0,    69,     0,   193,
+     0,   194,     0,   104,   208,   105,     0,   193,   104,   195,
+   105,     0,   196,     0,   195,   109,   196,     0,   114,   197,
+     0,   114,   112,   197,     0,   210,     0,   197,   112,   210,
+     0,     0,   199,     0,    69,     0,    33,   200,     0,   186,
+     0,   171,     0,     0,   104,   201,   170,     0,   104,   105,
+     0,   104,   203,   105,     0,   204,     0,   203,   109,   204,
+     0,   210,     0,   210,   106,   205,   107,     0,   210,   106,
+   169,   107,     0,   205,     0,   102,     0,     9,     0,    10,
+     0,     0,   207,     0,   103,     0,   103,    52,     0,   103,
+    41,     0,    11,     0,    12,     0,    12,     0,     8,     0,
+   210,     0,   210,   207,     0
 };
 
 #endif
@@ -361,26 +363,27 @@
    430,   434,   454,   456,   464,   468,   500,   504,   513,   520,
    533,   540,   542,   554,   567,   574,   579,   585,   591,   600,
    606,   612,   619,   627,   631,   634,   641,   647,   653,   660,
-   669,   679,   687,   695,   697,   709,   721,   728,   744,   754,
-   764,   774,   779,   786,   796,   802,   808,   812,   824,   830,
-   836,   846,   848,   851,   859,   865,   874,   879,   896,   898,
-   903,   907,   912,   917,   923,   927,   952,   959,   964,   974,
-   982,   991,  1000,  1011,  1015,  1021,  1029,  1053,  1060,  1074,
-  1083,  1093,  1103,  1111,  1132,  1141,  1150,  1151,  1153,  1160,
-  1172,  1182,  1184,  1189,  1193,  1197,  1201,  1204,  1209,  1221,
-  1237,  1248,  1262,  1264,  1265,  1266,  1267,  1268,  1269,  1270,
-  1271,  1272,  1273,  1274,  1280,  1282,  1283,  1286,  1293,  1305,
-  1307,  1311,  1315,  1316,  1317,  1318,  1319,  1323,  1324,  1325,
-  1326,  1330,  1331,  1335,  1344,  1354,  1361,  1367,  1373,  1379,
-  1395,  1395,  1396,  1396,  1397,  1399,  1401,  1406,  1410,  1419,
-  1423,  1428,  1432,  1438,  1448,  1452,  1455,  1458,  1463,  1472,
-  1480,  1486,  1493,  1501,  1509,  1518,  1521,  1526,  1528,  1529,
-  1530,  1533,  1537,  1542,  1546,  1557,  1562,  1567,  1574,  1580,
-  1584,  1589,  1595,  1607,  1609,  1612,  1616,  1619,  1624,  1628,
-  1636,  1651,  1657,  1664,  1677,  1689,  1704,  1708,  1725,  1727,
-  1730,  1734,  1740,  1743,  1745,  1745,  1765,  1770,  1775,  1781,
-  1787,  1795,  1803,  1811,  1818,  1828,  1833,  1863,  1865,  1868,
-  1873,  1877,  1883,  1888,  1895,  1902,  1909,  1914
+   669,   679,   687,   695,   697,   709,   721,   728,   744,   753,
+   763,   773,   778,   785,   795,   801,   807,   811,   823,   829,
+   835,   843,   850,   855,   861,   867,   874,   879,   889,   891,
+   894,   902,   908,   917,   923,   940,   942,   947,   951,   956,
+   961,   967,   971,   982,   991,  1000,  1011,  1032,  1036,  1042,
+  1048,  1054,  1060,  1068,  1076,  1082,  1097,  1121,  1128,  1142,
+  1151,  1161,  1171,  1179,  1200,  1209,  1218,  1219,  1221,  1228,
+  1240,  1250,  1252,  1257,  1261,  1265,  1269,  1272,  1277,  1289,
+  1305,  1316,  1330,  1332,  1333,  1334,  1335,  1336,  1337,  1338,
+  1339,  1340,  1341,  1342,  1348,  1350,  1351,  1354,  1361,  1373,
+  1375,  1379,  1383,  1384,  1385,  1386,  1387,  1391,  1392,  1393,
+  1394,  1398,  1399,  1406,  1406,  1407,  1407,  1408,  1410,  1412,
+  1417,  1421,  1430,  1434,  1439,  1443,  1449,  1459,  1463,  1466,
+  1469,  1474,  1483,  1491,  1497,  1504,  1512,  1520,  1529,  1532,
+  1537,  1539,  1540,  1541,  1544,  1548,  1553,  1557,  1568,  1573,
+  1578,  1585,  1591,  1595,  1600,  1606,  1618,  1620,  1623,  1627,
+  1630,  1635,  1639,  1647,  1662,  1668,  1675,  1688,  1700,  1715,
+  1719,  1736,  1738,  1741,  1745,  1751,  1754,  1756,  1756,  1776,
+  1781,  1786,  1792,  1798,  1806,  1814,  1822,  1829,  1839,  1844,
+  1874,  1876,  1879,  1884,  1888,  1894,  1899,  1906,  1913,  1920,
+  1925
 };
 #endif
 
@@ -414,21 +417,20 @@
 "ImportsBundleSet","ImportsBundle","ImportsList","ImportsElement","ExportsDefinition",
 "ExportsBody","ExportsElement","ValueSetDefinition","DefinedTypeRef","optValueSetBody",
 "DataTypeReference","ParameterArgumentList","ParameterArgumentName","ActualParameterList",
-"ActualParameter","ConstructedDataTypeDefinition","ClassDeclaration","optUnique",
-"ClassFieldList","ClassField","optWithSyntax","WithSyntax","@2","WithSyntaxFormat",
-"WithSyntaxFormatToken","DataTypeMember","ConstrainedTypeDeclaration","ExtensionAndException",
-"UnconstrainedTypeDeclaration","ComplexTypeReference","ComplexTypeReferenceAmpList",
+"ActualParameter","ComponentTypeLists","ComponentType","AlternativeTypeLists",
+"AlternativeType","ClassDeclaration","optUnique","ClassFieldList","ClassField",
+"optWithSyntax","WithSyntax","@2","WithSyntaxFormat","WithSyntaxFormatToken",
+"ExtensionAndException","Type","TypeDeclaration","ComplexTypeReference","ComplexTypeReferenceAmpList",
 "ComplexTypeReferenceElement","ClassFieldIdentifier","ClassFieldName","ValueDefinition",
 "InlineOrDefinedValue","@3","DefinedValue","Opaque","BasicTypeId","BasicTypeId_UniverationCompatible",
-"BasicType","BasicString","ConstructedTypeConstrained","ConstructedType","Union",
-"Intersection","Except","optConstraints","Constraints","SetOfConstraints","ElementSetSpecs",
-"ElementSetSpec","ConstraintSubtypeElement","ConstraintRangeSpec","ConstraintSpec",
-"ConstraintValue","WithComponents","WithComponentsList","WithComponentsElement",
-"optPresenceConstraint","PresenceConstraint","TableConstraint","SimpleTableConstraint",
-"ComponentRelationConstraint","AtNotationList","AtNotationElement","ComponentIdList",
-"optMarker","Marker","DefaultValue","@4","UniverationDefinition","UniverationList",
-"UniverationElement","SignedNumber","optTag","Tag","TypeRefName","ObjectClassReference",
-"Identifier","TaggedIdentifier", NULL
+"BasicType","BasicString","Union","Intersection","Except","optConstraints","Constraints",
+"SetOfConstraints","ElementSetSpecs","ElementSetSpec","ConstraintSubtypeElement",
+"ConstraintRangeSpec","ConstraintSpec","ConstraintValue","WithComponents","WithComponentsList",
+"WithComponentsElement","optPresenceConstraint","PresenceConstraint","TableConstraint",
+"SimpleTableConstraint","ComponentRelationConstraint","AtNotationList","AtNotationElement",
+"ComponentIdList","optMarker","Marker","DefaultValue","@4","UniverationDefinition",
+"UniverationList","UniverationElement","SignedNumber","optTag","Tag","TypeRefName",
+"ObjectClassReference","Identifier","TaggedIdentifier", NULL
 };
 #endif
 
@@ -440,24 +442,25 @@
    132,   133,   133,   134,   134,   134,   135,   135,   136,   136,
    137,   138,   138,   139,   139,   140,   140,   140,   140,   141,
    141,   142,   142,   142,   143,   143,   144,   144,   145,   145,
-   146,   147,   147,   148,   148,   149,   149,   149,   150,   150,
-   152,   151,   153,   153,   154,   154,   155,   155,   156,   156,
-   157,   157,   157,   158,   158,   158,   158,   158,   158,   159,
-   159,   159,   159,   159,   160,   160,   161,   162,   163,   163,
-   164,   166,   165,   165,   165,   165,   165,   165,   167,   167,
-   168,   168,   169,   169,   169,   169,   169,   169,   169,   169,
-   169,   169,   169,   169,   170,   170,   170,   171,   171,   172,
-   172,   172,   172,   172,   172,   172,   172,   172,   172,   172,
-   172,   172,   172,   173,   173,   174,   174,   174,   174,   174,
-   175,   175,   176,   176,   177,   178,   178,   179,   179,   180,
-   180,   181,   181,   181,   182,   182,   182,   182,   183,   183,
-   183,   183,   183,   183,   183,   183,   183,   184,   184,   184,
-   184,   185,   185,   186,   186,   186,   186,   186,   187,   188,
-   188,   189,   189,   190,   190,   191,   191,   191,   192,   192,
-   193,   194,   195,   195,   196,   196,   197,   197,   198,   198,
-   199,   199,   200,   200,   201,   200,   202,   202,   203,   203,
-   204,   204,   204,   204,   204,   205,   205,   206,   206,   207,
-   207,   207,   208,   208,   209,   210,   211,   211
+   146,   146,   146,   147,   147,   148,   148,   149,   150,   150,
+   151,   151,   152,   152,   152,   153,   153,   155,   154,   156,
+   156,   157,   157,   158,   158,   158,   159,   160,   160,   160,
+   160,   160,   160,   160,   160,   160,   160,   160,   160,   161,
+   161,   161,   161,   161,   162,   162,   163,   164,   165,   165,
+   166,   168,   167,   167,   167,   167,   167,   167,   169,   169,
+   170,   170,   171,   171,   171,   171,   171,   171,   171,   171,
+   171,   171,   171,   171,   172,   172,   172,   173,   173,   174,
+   174,   174,   174,   174,   174,   174,   174,   174,   174,   174,
+   174,   174,   174,   175,   175,   176,   176,   177,   178,   178,
+   179,   179,   180,   180,   181,   181,   181,   182,   182,   182,
+   182,   183,   183,   183,   183,   183,   183,   183,   183,   183,
+   184,   184,   184,   184,   185,   185,   186,   186,   186,   186,
+   186,   187,   188,   188,   189,   189,   190,   190,   191,   191,
+   191,   192,   192,   193,   194,   195,   195,   196,   196,   197,
+   197,   198,   198,   199,   199,   200,   200,   201,   200,   202,
+   202,   203,   203,   204,   204,   204,   204,   204,   205,   205,
+   206,   206,   207,   207,   207,   208,   208,   209,   210,   211,
+   211
 };
 
 static const short yyr2[] = {     0,
@@ -468,302 +471,311 @@
      3,     1,     1,     3,     3,     2,     1,     3,     1,     1,
      6,     1,     1,     0,     1,     4,     4,     3,     6,     1,
      3,     1,     3,     3,     1,     3,     1,     1,     1,     3,
-     5,     0,     1,     1,     3,     2,     3,     4,     0,     1,
-     0,     6,     1,     2,     1,     1,     2,     1,     3,     1,
-     1,     3,     3,     1,     1,     1,     4,     1,     3,     1,
+     3,     3,     1,     1,     3,     2,     1,     5,     0,     1,
+     1,     3,     2,     4,     4,     0,     1,     0,     6,     1,
+     2,     1,     1,     1,     3,     3,     2,     1,     1,     4,
+     4,     4,     4,     4,     1,     4,     4,     1,     3,     1,
      3,     3,     1,     3,     1,     3,     1,     1,     1,     1,
      4,     0,     3,     1,     1,     1,     1,     1,     1,     3,
      1,     2,     1,     1,     1,     1,     2,     2,     1,     1,
      2,     2,     1,     1,     1,     1,     2,     1,     2,     1,
      1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-     1,     1,     1,     4,     4,     4,     4,     4,     1,     4,
-     1,     1,     1,     1,     1,     0,     1,     1,     4,     3,
-     4,     1,     3,     5,     1,     3,     3,     3,     4,     3,
-     1,     3,     3,     3,     3,     1,     1,     1,     2,     2,
-     3,     1,     1,     1,     1,     1,     1,     1,     5,     1,
-     3,     1,     3,     0,     1,     1,     1,     1,     1,     1,
-     3,     4,     1,     3,     2,     3,     1,     3,     0,     1,
-     1,     2,     1,     1,     0,     3,     2,     3,     1,     3,
-     1,     4,     4,     1,     1,     1,     1,     0,     1,     1,
-     2,     2,     1,     1,     1,     1,     1,     2
+     1,     1,     1,     1,     1,     1,     1,     1,     0,     1,
+     1,     4,     3,     4,     1,     3,     5,     1,     3,     3,
+     3,     4,     3,     1,     3,     3,     3,     3,     1,     1,
+     1,     2,     2,     3,     1,     1,     1,     1,     1,     1,
+     1,     5,     1,     3,     1,     3,     0,     1,     1,     1,
+     1,     1,     1,     3,     4,     1,     3,     2,     3,     1,
+     3,     0,     1,     1,     2,     1,     1,     0,     3,     2,
+     3,     1,     3,     1,     4,     4,     1,     1,     1,     1,
+     0,     1,     1,     2,     2,     1,     1,     1,     1,     1,
+     2
 };
 
 static const short yydefact[] = {     0,
-   243,   244,     1,     2,     5,     3,     0,     0,     6,   246,
+   246,   247,     1,     2,     5,     3,     0,     0,     6,   249,
     13,     8,     0,     9,    11,    14,     7,    10,     0,     0,
      0,     0,     0,     0,     0,    15,    16,     0,    22,    20,
-    18,    21,    19,     0,    17,    12,    23,   140,     0,     0,
-   141,   142,   143,     0,   144,   145,   153,   146,   147,   148,
-   149,   150,   151,   152,     0,    24,    25,    27,    28,    31,
+    18,    21,    19,     0,    17,    12,    23,   150,     0,     0,
+   151,   152,   153,     0,   154,   155,   163,   156,   157,   158,
+   159,   160,   161,   162,     0,    24,    25,    27,    28,    31,
     29,    30,    34,     0,     0,    32,     0,    46,     0,    47,
     49,    50,    36,     0,    37,     0,    40,    42,    43,     4,
-    26,   238,   100,   245,     0,   123,     0,     0,   136,   130,
-   134,   135,   124,     0,     0,   125,   129,   133,     0,     0,
-    52,    53,   126,   103,     0,    33,    45,    44,     0,    35,
-    38,     0,     0,     0,   240,    58,     0,   239,     0,   137,
-   132,   131,   128,   127,     0,    60,     0,    62,     0,     0,
-     0,    48,     5,    41,     0,   242,   241,   100,   245,   159,
-     0,     0,   166,   166,    56,    57,   166,    98,   138,   126,
-    94,    95,    90,    96,     0,   101,   102,     0,     0,     0,
-     0,    54,   109,   110,   104,   105,   107,   114,   116,   115,
-   236,   237,   112,   111,   118,   117,     0,   119,    39,     0,
-    74,   219,   108,     0,     0,     0,     0,     0,     0,     0,
-   167,   168,     0,     0,   219,     0,   139,     0,     0,    61,
-    64,    63,   196,   197,   193,     0,   192,   198,     0,     0,
-     0,     0,    55,   172,   175,     0,   181,   187,   186,   209,
-   210,   194,   195,     0,     0,     0,    79,     0,     0,   221,
-    72,   219,    76,   220,     0,    91,     0,    69,    88,   247,
-     0,    99,     0,     0,     0,     0,     0,     0,     0,    89,
-   235,   227,     0,   229,   234,   231,     0,     0,     0,    65,
-    67,    68,    59,   188,     0,     0,     0,     0,     0,    51,
-   163,   164,   161,   162,     0,     0,     0,   165,     0,     0,
-     0,     0,   106,   121,   113,   120,     0,    71,    80,    75,
-   225,   224,   223,   222,    73,    77,    72,   160,     0,   156,
-     0,   248,    87,     0,   157,   170,   154,     0,   158,   155,
-   228,     0,     0,    97,     0,   189,   190,   185,   183,     0,
-   211,   180,   173,   176,   177,   178,     0,   184,   182,     0,
-     0,   213,   122,     0,     0,    78,    92,    93,    70,   169,
-   171,   230,     0,     0,    66,   191,   202,     0,   200,   166,
-     0,   179,     0,   215,   217,   212,     0,    81,   226,   233,
-   232,   199,     0,   204,   174,   216,     0,   214,     0,   201,
-   207,   208,   206,   203,   205,   218,    85,     0,    83,    86,
-    82,    84,     0,     0,     0
+    26,   241,   110,   248,     0,   133,     0,     0,   146,   140,
+   144,   145,   134,     0,     0,   135,   139,   143,     0,     0,
+    52,    53,   136,   113,     0,    33,    45,    44,     0,    35,
+    38,     0,     0,     0,   243,    58,     0,   242,     0,   147,
+   142,   141,   138,   137,     0,    60,     0,    62,     0,     0,
+     0,    48,     5,    41,     0,   245,   244,   110,   248,   105,
+     0,     0,   169,   169,    56,    57,   169,   108,   148,   136,
+    98,    99,     0,   111,   112,     0,     0,     0,     0,    54,
+   119,   120,   114,   115,   117,   124,   126,   125,   239,   240,
+   122,   121,   128,   127,     0,   129,    39,     0,    81,   222,
+   118,     0,     0,     0,     0,     0,     0,     0,   170,   171,
+     0,     0,    97,     0,   149,     0,     0,    61,    64,    63,
+   199,   200,   196,     0,   195,   201,     0,     0,     0,     0,
+    55,   175,   178,     0,   184,   190,   189,   212,   213,   197,
+   198,     0,     0,     0,    86,     0,     0,   224,   222,   222,
+    83,   223,     0,    94,     0,    74,    77,   250,     0,   109,
+     0,     0,     0,    69,    73,     0,     0,     0,     0,     0,
+     0,   238,   230,     0,   232,   237,   234,     0,    65,    67,
+    68,    59,   191,     0,     0,     0,     0,     0,    51,   166,
+   167,   164,   165,     0,     0,     0,   168,     0,     0,     0,
+     0,   116,   131,   123,   130,     0,    78,    87,    82,   228,
+   227,   226,   225,    79,    79,   106,     0,   100,     0,   251,
+    76,     0,     0,   101,     0,   222,   173,   103,     0,   102,
+   104,   231,     0,     0,   107,     0,   192,   193,   188,   186,
+     0,   214,   183,   176,   179,   180,   181,     0,   187,   185,
+     0,     0,   216,   132,     0,     0,    80,    84,    85,    95,
+    96,    75,   172,    72,    70,    71,   174,   233,     0,     0,
+    66,   194,   205,     0,   203,   169,     0,   182,     0,   218,
+   220,   215,     0,    88,   229,   236,   235,   202,     0,   207,
+   177,   219,     0,   217,     0,   204,   210,   211,   209,   206,
+   208,   221,    92,     0,    90,    93,    89,    91,     0,     0,
+     0
 };
 
-static const short yydefgoto[] = {   383,
+static const short yydefgoto[] = {   389,
      3,     4,     8,     9,    13,    14,    25,    26,    27,    55,
     56,    57,   106,    58,    74,    75,    76,    77,    59,    69,
-    70,    60,   100,   212,    61,   125,   126,   259,   260,   237,
-   116,   296,   180,   181,   288,   289,   369,   378,   379,   238,
-   146,   239,   147,   148,   165,   166,   182,   183,    62,   174,
-   225,   175,   285,   149,   150,   151,   152,   153,   154,   276,
-   277,   279,   190,   191,   192,   213,   214,   215,   266,   216,
-   217,   218,   348,   349,   374,   375,   219,   220,   221,   331,
-   332,   354,   233,   234,   294,   335,   197,   253,   254,   222,
-   117,   118,   155,   104,   223,   241
+    70,    60,   100,   210,    61,   125,   126,   258,   259,   243,
+   244,   235,   236,   116,   338,   178,   179,   287,   288,   375,
+   384,   385,   245,   260,   147,   148,   163,   164,   180,   181,
+    62,   172,   223,   173,   284,   149,   150,   151,   152,   275,
+   276,   278,   188,   189,   190,   211,   212,   213,   265,   214,
+   215,   216,   354,   355,   380,   381,   217,   218,   219,   332,
+   333,   360,   231,   232,   293,   336,   195,   254,   255,   220,
+   117,   118,   153,   104,   221,   246
 };
 
-static const short yypact[] = {    62,
--32768,-32768,    62,-32768,   -36,-32768,    11,    56,-32768,-32768,
--32768,-32768,    26,-32768,   -13,   202,-32768,-32768,    87,    52,
-    66,    99,   108,   101,   116,   202,-32768,    81,-32768,-32768,
--32768,-32768,-32768,   149,-32768,-32768,   375,-32768,   185,    10,
--32768,-32768,-32768,    58,-32768,-32768,-32768,-32768,-32768,-32768,
--32768,-32768,-32768,-32768,   163,   375,-32768,-32768,-32768,-32768,
--32768,-32768,-32768,   140,   673,-32768,    96,-32768,    86,-32768,
--32768,-32768,-32768,    20,-32768,    -4,-32768,-32768,-32768,-32768,
--32768,   -11,    98,-32768,   134,-32768,   137,   156,-32768,-32768,
--32768,-32768,-32768,   187,   139,-32768,-32768,-32768,   690,   269,
--32768,-32768,-32768,   165,   272,-32768,-32768,-32768,   218,-32768,
--32768,    62,   218,   179,    94,-32768,   536,-32768,   218,-32768,
--32768,-32768,-32768,-32768,   -65,-32768,   175,   176,   183,   199,
-    53,-32768,   -36,-32768,   199,-32768,-32768,    70,   184,   255,
-   192,   229,    61,    65,-32768,-32768,   -27,-32768,-32768,   194,
--32768,-32768,-32768,-32768,   195,-32768,-32768,   301,   690,   299,
-   299,   215,-32768,-32768,   197,-32768,-32768,-32768,-32768,-32768,
--32768,-32768,-32768,-32768,-32768,-32768,   203,-32768,-32768,    63,
--32768,   459,-32768,   286,    21,   235,   210,    21,   215,   250,
--32768,   214,    21,   256,    15,    42,-32768,   314,   613,-32768,
--32768,-32768,-32768,-32768,-32768,   -12,-32768,-32768,   297,    62,
-   215,   223,-32768,   142,   233,   225,   -12,-32768,-32768,   230,
--32768,-32768,-32768,   199,   329,   299,   240,   199,   226,-32768,
-   251,    15,-32768,-32768,   299,   231,    91,-32768,-32768,   241,
-   613,-32768,   215,   128,   236,   613,   215,   144,   613,-32768,
--32768,-32768,   158,-32768,-32768,   239,   243,   244,   159,-32768,
--32768,-32768,-32768,   238,   248,    77,   249,   252,   245,-32768,
--32768,-32768,-32768,-32768,   253,   215,   215,-32768,   215,   215,
-    89,   254,-32768,-32768,   355,-32768,   283,-32768,-32768,-32768,
--32768,-32768,-32768,-32768,-32768,-32768,   251,-32768,   247,-32768,
-    21,-32768,-32768,   259,-32768,-32768,-32768,   260,-32768,-32768,
--32768,    46,   247,-32768,   314,-32768,   258,-32768,-32768,    28,
--32768,-32768,   265,-32768,-32768,-32768,   262,-32768,-32768,    -1,
-   160,-32768,-32768,   271,   329,-32768,-32768,-32768,-32768,-32768,
--32768,-32768,   275,   277,-32768,-32768,-32768,   169,-32768,   -27,
-   215,-32768,   299,   264,-32768,-32768,   254,-32768,   355,-32768,
--32768,-32768,    28,     8,   182,   264,   299,-32768,   125,-32768,
--32768,-32768,-32768,-32768,-32768,-32768,-32768,    12,-32768,-32768,
--32768,-32768,   385,   389,-32768
+static const short yypact[] = {   174,
+-32768,-32768,   174,-32768,   -76,-32768,    35,   104,-32768,-32768,
+-32768,-32768,    45,-32768,   -49,   182,-32768,-32768,    70,    86,
+    62,    71,   119,   112,   196,   182,-32768,   115,-32768,-32768,
+-32768,-32768,-32768,   188,-32768,-32768,   431,-32768,   207,    23,
+-32768,-32768,-32768,   159,-32768,-32768,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,-32768,   185,   431,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,   192,   209,-32768,   129,-32768,   103,-32768,
+-32768,-32768,-32768,    40,-32768,    -5,-32768,-32768,-32768,-32768,
+-32768,    -6,   134,-32768,   146,-32768,   179,   194,-32768,-32768,
+-32768,-32768,-32768,   220,   201,-32768,-32768,-32768,   729,   272,
+-32768,-32768,-32768,   172,   286,-32768,-32768,-32768,   232,-32768,
+-32768,   174,   232,   187,    37,-32768,   592,-32768,   232,-32768,
+-32768,-32768,-32768,-32768,    32,-32768,   183,   184,   191,   216,
+    54,-32768,   -76,-32768,   216,-32768,-32768,   -31,   193,   270,
+   206,   240,    77,   102,-32768,-32768,    50,-32768,-32768,   208,
+-32768,-32768,   217,-32768,-32768,   308,   729,   305,   305,    74,
+-32768,-32768,   214,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,-32768,   215,-32768,-32768,    57,-32768,   515,
+-32768,   295,    21,   276,   222,    42,    74,   261,-32768,   224,
+    42,   264,-32768,    11,-32768,   370,   669,-32768,-32768,-32768,
+-32768,-32768,-32768,   -15,-32768,-32768,   304,   174,    74,   231,
+-32768,   164,   241,   233,   -15,-32768,-32768,   234,-32768,-32768,
+-32768,   216,   336,   305,   246,   216,   309,-32768,     5,     5,
+-32768,-32768,   305,   235,    83,-32768,-32768,   239,   669,-32768,
+    74,   275,    92,-32768,-32768,   669,   237,   669,    74,   133,
+   669,-32768,-32768,   142,-32768,-32768,   242,   143,-32768,-32768,
+-32768,-32768,   238,   249,    82,   243,   250,   251,-32768,-32768,
+-32768,-32768,-32768,   255,    74,    74,-32768,    74,    74,   155,
+   245,-32768,-32768,   356,-32768,   279,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,   277,   277,-32768,   269,-32768,    21,-32768,
+-32768,   256,   669,-32768,    42,     5,-32768,-32768,   257,-32768,
+-32768,-32768,    15,   269,-32768,   370,-32768,   258,-32768,-32768,
+    24,-32768,-32768,   259,-32768,-32768,-32768,   262,-32768,-32768,
+    10,   149,-32768,-32768,   266,   336,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,   268,   273,
+-32768,-32768,-32768,   161,-32768,    50,    74,-32768,   305,   265,
+-32768,-32768,   245,-32768,   356,-32768,-32768,-32768,    24,    80,
+   204,   265,   305,-32768,    96,-32768,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,    13,-32768,-32768,-32768,-32768,   373,   379,
+-32768
 };
 
 static const short yypgoto[] = {-32768,
--32768,   391,   263,-32768,-32768,   382,-32768,-32768,   374,-32768,
--32768,   345,-32768,-32768,-32768,   328,-32768,   290,-32768,-32768,
-   300,-32768,   346,-32768,-32768,-32768,   257,-32768,    95,   -67,
--32768,   115,-32768,   186,-32768,-32768,-32768,-32768,    37,   117,
-   -40,-32768,  -188,   -50,-32768,   196,  -179,   -91,-32768,-32768,
--32768,  -219,    84,   -56,   -52,-32768,    35,-32768,-32768,-32768,
--32768,-32768,  -142,-32768,-32768,  -165,    71,  -121,   204,-32768,
-  -141,-32768,-32768,    64,-32768,-32768,-32768,-32768,-32768,-32768,
-    69,    75,  -124,-32768,-32768,-32768,-32768,-32768,   118,  -120,
--32768,   191,     1,-32768,    -7,-32768
+-32768,   380,   254,-32768,-32768,   371,-32768,-32768,   363,-32768,
+-32768,   334,-32768,-32768,-32768,   317,-32768,   285,-32768,-32768,
+   290,-32768,   337,-32768,-32768,-32768,   244,-32768,    87,   213,
+   100,-32768,   108,-32768,   113,-32768,   186,-32768,-32768,-32768,
+-32768,    25,  -174,  -110,  -152,   -50,-32768,   189,  -177,   -94,
+-32768,-32768,-32768,  -220,    79,   -54,   -52,-32768,    19,-32768,
+-32768,-32768,  -143,-32768,-32768,  -102,    59,    47,   210,-32768,
+  -172,-32768,-32768,    52,-32768,-32768,-32768,-32768,-32768,-32768,
+    60,    63,  -161,-32768,-32768,-32768,-32768,-32768,   111,  -123,
+-32768,   200,     2,-32768,    -7,  -167
 };
 
 
-#define	YYLAST		781
+#define	YYLAST		820
 
 
 static const short yytable[] = {    15,
-     5,   194,   232,     5,   195,    15,    10,   102,   102,   261,
-   176,   103,   103,   101,   101,   377,   114,    10,    10,    11,
-     1,     2,   371,   245,   163,   164,    67,    10,    10,    65,
-     1,     2,    72,    10,    11,    10,    79,    64,   167,   158,
-    71,   112,   127,   159,    78,   269,   103,   229,    65,    10,
-   171,   172,   187,    10,   171,   172,    64,   168,   169,   170,
-    10,   171,   172,     1,     2,    10,    79,     7,     1,     2,
-   250,    63,     1,     2,    78,   255,   372,   304,   189,   337,
-   373,   308,   203,   230,    10,   171,   172,   293,   264,    16,
-    63,   115,    19,   343,   203,    28,    10,   171,   172,   128,
-   265,    72,   127,    73,   113,    79,   103,   297,    29,    71,
-   353,   157,   133,    78,   327,    12,   381,    68,    34,   156,
-   244,   204,   236,   178,   319,   248,   261,   110,   377,   347,
-    17,   177,   167,   204,   136,   242,   318,   163,   164,   329,
-   187,   231,    82,   251,   187,   137,   252,   251,   328,    30,
-    83,    84,   201,   202,   324,   325,   173,   326,   263,   128,
-    32,    85,   208,    86,   188,    87,   189,   227,   193,    37,
-   189,   228,   292,  -243,   208,    88,   103,   240,   338,    89,
-   240,   119,    31,    90,    33,   240,    91,    36,   256,   380,
-   262,   255,   344,   108,   109,   300,    66,    92,   380,   301,
-   303,    80,    93,   107,    94,   307,    95,   364,   310,   119,
-   268,   163,   164,    20,   120,    96,    97,   121,   286,   124,
-   203,    21,    10,   171,   172,    10,   122,   298,     1,     2,
-    98,   203,   305,    10,   171,   172,   301,   123,   271,   272,
-   273,   274,    22,    99,    23,    83,    84,    85,   309,    86,
-   275,    87,   301,    24,    10,   171,   172,     1,     2,   204,
-   205,    88,   311,   314,   356,    89,   312,   315,   357,    90,
-   204,   129,    91,   362,   131,   206,   130,   363,   271,   272,
-   273,   274,   135,    92,   160,   161,   162,  -244,    93,   184,
-    94,   178,    95,   240,   207,   185,   186,   196,   198,   177,
-   208,    96,    97,   199,   256,   178,    10,   262,   224,   209,
-   235,   208,   350,   177,   226,   243,    98,   246,   210,   247,
-   211,    10,   355,   249,   138,   139,   267,   270,   278,   291,
-   280,   140,   284,   282,   287,    85,    38,    86,   295,    87,
-   141,   299,   306,   115,   313,   355,   188,   193,   317,    88,
-   316,   322,   320,    89,   323,   350,   321,    90,   333,   376,
-    91,    41,    42,    43,   334,   340,   341,   330,   352,   142,
-   346,    92,    45,   351,   358,   367,    93,    46,    94,    47,
-    95,   360,    10,   361,   384,     1,     2,    48,   385,    96,
-    97,   257,   258,     6,    18,   179,    49,    38,    50,    35,
-    81,   111,   134,    51,    98,    52,    53,    54,   132,   345,
-   105,   336,    39,   290,   382,   200,    40,   339,   359,   283,
-   281,   365,    41,    42,    43,   368,   370,   366,    44,   342,
-   302,     0,     0,    45,     0,     0,     0,     0,    46,     0,
-    47,     0,     0,     0,     0,     0,     0,     0,    48,     0,
-     0,     0,     0,     0,     0,     0,     0,    49,     0,    50,
-     0,     0,     0,     0,    51,     0,    52,    53,    54,   138,
-   139,   163,   164,     0,     0,     0,   140,     0,     0,     0,
+   192,     5,   230,   193,     5,    15,   146,   174,   237,   102,
+   102,   103,   103,   101,   101,   239,   383,    10,    10,   169,
+   170,   114,    10,   169,   170,   161,   162,     7,    10,    65,
+    10,    10,    72,     1,     2,   165,    79,   227,    64,    67,
+   112,    71,    10,    11,   127,    78,   103,    10,    65,    10,
+     1,     2,    10,    11,   292,    63,    19,    64,   166,   167,
+   168,    10,   169,   170,     1,     2,    79,   294,   295,   229,
+   256,   242,  -246,   228,    63,    78,   340,   136,    28,   201,
+   119,    10,   169,   170,   247,   263,   262,   201,   137,    10,
+   169,   170,   320,   349,   377,   308,   115,   264,   311,   383,
+   128,    72,   127,   113,   103,    79,   268,   330,   161,   162,
+    71,   155,   252,   133,    78,   253,   252,   387,   202,   203,
+   154,   359,   234,   176,   237,   353,   202,   165,   301,   185,
+    68,   239,   175,   240,   204,   306,   156,    16,   302,    12,
+   157,   319,    29,   234,   346,    30,   309,   110,   378,    17,
+   199,   200,   379,   205,    31,   187,   185,   171,   128,   206,
+   201,   225,    10,   169,   170,   226,    10,   206,   207,     1,
+     2,    32,   291,   341,   103,   238,   328,   208,   238,   209,
+   186,   185,   187,   238,     1,     2,   257,   298,   261,   256,
+   350,   299,   344,    20,    82,    33,   304,   386,    34,   202,
+   305,    21,    83,    84,    73,   191,   386,   187,    37,   267,
+   108,   109,   370,    85,   329,    86,   285,    87,    66,    83,
+    84,    36,    22,    80,    23,   296,   120,    88,   161,   162,
+    85,    89,    86,    24,    87,    90,   107,   310,    91,    10,
+   206,   305,     1,     2,    88,   119,   312,   315,    89,    92,
+   313,   316,    90,   362,    93,    91,    94,   363,    95,   121,
+   270,   271,   272,   273,   122,   368,    92,    96,    97,   369,
+   123,    93,   274,    94,   129,    95,    10,   169,   170,     1,
+     2,   124,    98,   130,    96,    97,    83,    84,   131,   176,
+   135,   238,   158,   159,   160,    99,  -247,   238,   175,    98,
+   270,   271,   272,   273,   182,   257,   176,   184,   261,   183,
+   197,   194,    10,   356,   201,   175,    10,   169,   170,   233,
+   196,   325,   326,   361,   327,   222,   224,   241,   248,   249,
+    85,   251,    86,   266,    87,   269,   277,   281,   279,   283,
+   286,   115,   303,   307,    88,   297,   321,   314,    89,   318,
+   317,   361,    90,   202,   322,    91,   324,   323,   331,   334,
+   335,   356,   343,   347,   337,   382,    92,   357,   358,   364,
+   352,    93,   390,    94,   366,    95,   373,    10,   391,   367,
+   138,   139,     6,    18,    96,    97,   177,   140,    35,    81,
+   111,    85,    38,    86,   206,    87,   141,   134,   132,    98,
+   198,   105,   351,   250,   345,    88,   342,   339,   388,    89,
+   282,   289,   290,    90,   365,   371,    91,    41,    42,    43,
+   376,   372,   374,   348,   280,   142,     0,    92,    45,     0,
+     0,     0,    93,    46,    94,    47,    95,   300,    10,     0,
+     0,     1,     2,    48,     0,    96,    97,   143,   144,     0,
+     0,     0,    49,    38,    50,     0,     0,     0,     0,    51,
+    98,    52,    53,    54,     0,     0,     0,     0,    39,     0,
+     0,     0,    40,     0,     0,     0,     0,     0,    41,    42,
+    43,     0,     0,     0,    44,     0,     0,     0,     0,    45,
+     0,     0,     0,     0,    46,     0,    47,     0,     0,     0,
+     0,     0,     0,     0,    48,     0,     0,     0,     0,     0,
+     0,     0,     0,    49,     0,    50,     0,     0,     0,     0,
+    51,     0,    52,    53,    54,   138,   139,   161,   162,     0,
+     0,     0,   140,     0,     0,     0,    85,    38,    86,     0,
+    87,   141,     0,     0,     0,     0,     0,   227,     0,     0,
+    88,     0,     0,     0,    89,     0,     0,     0,    90,     0,
+     0,    91,    41,    42,    43,     0,     0,     0,     0,     0,
+   142,     0,    92,    45,     0,     0,     0,    93,    46,    94,
+    47,    95,     0,   228,     0,     0,     0,     0,    48,     0,
+    96,    97,   143,   144,     0,     0,     0,    49,     0,    50,
+     0,     0,   138,   139,    51,    98,    52,    53,    54,   140,
+     0,     0,     0,    85,    38,    86,     0,    87,   141,     0,
+     0,     0,     0,     0,     0,     0,     0,    88,     0,     0,
+     0,    89,     0,     0,     0,    90,     0,     0,    91,    41,
+    42,    43,     0,     0,     0,     0,     0,   142,     0,    92,
+    45,     0,     0,     0,    93,    46,    94,    47,    95,     0,
+     0,     0,     0,     0,     0,    48,     0,    96,    97,   143,
+   144,     0,     0,     0,    49,     0,    50,     0,   145,   138,
+   139,    51,    98,    52,    53,    54,   140,     0,     0,     0,
     85,    38,    86,     0,    87,   141,     0,     0,     0,     0,
-     0,   229,     0,     0,    88,     0,     0,     0,    89,     0,
+     0,     0,     0,     0,    88,     0,     0,     0,    89,     0,
      0,     0,    90,     0,     0,    91,    41,    42,    43,     0,
      0,     0,     0,     0,   142,     0,    92,    45,     0,     0,
-     0,    93,    46,    94,    47,    95,     0,   230,     0,     0,
-     0,     0,    48,     0,    96,    97,   143,   144,     0,     0,
-     0,    49,     0,    50,     0,     0,   138,   139,    51,    98,
-    52,    53,    54,   140,     0,     0,     0,    85,    38,    86,
-     0,    87,   141,     0,     0,     0,     0,     0,     0,     0,
-     0,    88,     0,     0,     0,    89,     0,     0,     0,    90,
-     0,     0,    91,    41,    42,    43,     0,     0,     0,     0,
-     0,   142,     0,    92,    45,     0,     0,     0,    93,    46,
-    94,    47,    95,     0,     0,     0,     0,     0,     0,    48,
-     0,    96,    97,   143,   144,     0,     0,     0,    49,     0,
-    50,     0,   145,   138,   139,    51,    98,    52,    53,    54,
-   140,     0,     0,     0,    85,    38,    86,     0,    87,   141,
-     0,     0,     0,     0,     0,     0,     0,     0,    88,     0,
-     0,     0,    89,     0,     0,     0,    90,     0,     0,    91,
-    41,    42,    43,     0,     0,     0,     0,     0,   142,     0,
-    92,    45,     0,     0,     0,    93,    46,    94,    47,    95,
-     0,     0,     0,    83,    84,     0,    48,     0,    96,    97,
-   143,   144,     0,     0,    85,    49,    86,    50,    87,     0,
-     1,     2,    51,    98,    52,    53,    54,     0,    88,     0,
-     0,    85,    89,    86,     0,    87,    90,     0,     0,    91,
-     0,     0,     0,     0,     0,    88,     0,     0,     0,    89,
-    92,     0,     0,    90,     0,    93,    91,    94,     0,    95,
-     0,     0,     0,     0,     0,     0,     0,    92,    96,    97,
-     0,     0,    93,     0,    94,     0,    95,     0,     0,     0,
-     0,     0,     0,    98,     0,    96,    97,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-    98
+     0,    93,    46,    94,    47,    95,     0,     0,     0,     1,
+     2,     0,    48,     0,    96,    97,   143,   144,     0,     0,
+    85,    49,    86,    50,    87,     0,     0,     0,    51,    98,
+    52,    53,    54,     0,    88,     0,     0,     0,    89,     0,
+     0,     0,    90,     0,     0,    91,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,    92,     0,     0,     0,
+     0,    93,     0,    94,     0,    95,     0,     0,     0,     0,
+     0,     0,     0,     0,    96,    97,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,    98
 };
 
 static const short yycheck[] = {     7,
-     0,   144,   182,     3,   147,    13,     8,    64,    65,   198,
-   131,    64,    65,    64,    65,     4,    28,     8,     8,     9,
-    11,    12,    15,   189,    13,    14,    17,     8,     8,    37,
-    11,    12,    40,     8,     9,     8,    44,    37,   130,   105,
-    40,    46,    99,   109,    44,   211,    99,    33,    56,     8,
-     9,    10,    80,     8,     9,    10,    56,     5,     6,     7,
-     8,     9,    10,    11,    12,     8,    74,   104,    11,    12,
-   195,    37,    11,    12,    74,   196,    69,   243,   106,   299,
-    73,   247,     6,    69,     8,     9,    10,   229,   101,    34,
-    56,   103,   106,   313,     6,     9,     8,     9,    10,    99,
-   113,   109,   159,    46,   109,   113,   159,   232,    57,   109,
-   112,   119,   112,   113,   280,   105,   105,   108,     3,   119,
-   188,    45,   102,   131,   266,   193,   315,   108,     4,   102,
-   105,   131,   224,    45,    41,   186,    60,    13,    14,   281,
-    80,   182,     3,   102,    80,    52,   105,   102,    60,    84,
-    11,    12,   160,   161,   276,   277,   104,   279,   199,   159,
-    53,    22,    86,    24,   104,    26,   106,   105,   104,    21,
-   106,   109,   229,   104,    86,    36,   229,   185,   299,    40,
-   188,   112,    84,    44,    84,   193,    47,   107,   196,   369,
-   198,   312,   313,   108,   109,   105,    12,    58,   378,   109,
-   241,    39,    63,   108,    65,   246,    67,   350,   249,   112,
-   210,    13,    14,    12,    81,    76,    77,    81,   226,    81,
-     6,    20,     8,     9,    10,     8,    71,   235,    11,    12,
-    91,     6,   105,     8,     9,    10,   109,    51,    97,    98,
-    99,   100,    41,   104,    43,    11,    12,    22,   105,    24,
-   109,    26,   109,    52,     8,     9,    10,    11,    12,    45,
-    46,    36,   105,   105,   105,    40,   109,   109,   109,    44,
-    45,     3,    47,   105,     3,    61,   112,   109,    97,    98,
-    99,   100,   104,    58,   110,   110,   104,   104,    63,    35,
-    65,   299,    67,   301,    80,   104,    68,   104,   104,   299,
-    86,    76,    77,     3,   312,   313,     8,   315,   112,    95,
-    25,    86,   320,   313,   112,   106,    91,    68,   104,   106,
-   106,     8,   330,    68,    11,    12,    30,   105,    96,   104,
-   106,    18,     4,   104,    95,    22,    23,    24,    88,    26,
-    27,   111,   107,   103,   106,   353,   104,   104,   101,    36,
-   113,   107,   104,    40,   102,   363,   105,    44,     4,   367,
-    47,    48,    49,    50,    82,   107,   107,   114,   107,    56,
-   113,    58,    59,   109,   104,   112,    63,    64,    65,    66,
-    67,   107,     8,   107,     0,    11,    12,    74,     0,    76,
-    77,    78,    79,     3,    13,   133,    83,    23,    85,    26,
-    56,    74,   113,    90,    91,    92,    93,    94,   109,   315,
-    65,   297,    38,   228,   378,   159,    42,   301,   335,   224,
-   217,   351,    48,    49,    50,   357,   363,   353,    54,   312,
-   240,    -1,    -1,    59,    -1,    -1,    -1,    -1,    64,    -1,
-    66,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    74,    -1,
-    -1,    -1,    -1,    -1,    -1,    -1,    -1,    83,    -1,    85,
-    -1,    -1,    -1,    -1,    90,    -1,    92,    93,    94,    11,
-    12,    13,    14,    -1,    -1,    -1,    18,    -1,    -1,    -1,
+   144,     0,   180,   147,     3,    13,   117,   131,   183,    64,
+    65,    64,    65,    64,    65,   183,     4,     8,     8,     9,
+    10,    28,     8,     9,    10,    13,    14,   104,     8,    37,
+     8,     8,    40,    11,    12,   130,    44,    33,    37,    17,
+    46,    40,     8,     9,    99,    44,    99,     8,    56,     8,
+    11,    12,     8,     9,   227,    37,   106,    56,     5,     6,
+     7,     8,     9,    10,    11,    12,    74,   229,   230,   180,
+   194,    30,   104,    69,    56,    74,   297,    41,     9,     6,
+   112,     8,     9,    10,   187,   101,   197,     6,    52,     8,
+     9,    10,   265,   314,    15,   248,   103,   113,   251,     4,
+    99,   109,   157,   109,   157,   113,   209,   280,    13,    14,
+   109,   119,   102,   112,   113,   105,   102,   105,    45,    46,
+   119,   112,   102,   131,   299,   102,    45,   222,   239,    80,
+   108,   299,   131,   184,    61,   246,   105,    34,   241,   105,
+   109,    60,    57,   102,   306,    84,   249,   108,    69,   105,
+   158,   159,    73,    80,    84,   106,    80,   104,   157,    86,
+     6,   105,     8,     9,    10,   109,     8,    86,    95,    11,
+    12,    53,   227,   297,   227,   183,   279,   104,   186,   106,
+   104,    80,   106,   191,    11,    12,   194,   105,   196,   313,
+   314,   109,   303,    12,     3,    84,   105,   375,     3,    45,
+   109,    20,    11,    12,    46,   104,   384,   106,    21,   208,
+   108,   109,   356,    22,    60,    24,   224,    26,    12,    11,
+    12,   107,    41,    39,    43,   233,    81,    36,    13,    14,
+    22,    40,    24,    52,    26,    44,   108,   105,    47,     8,
+    86,   109,    11,    12,    36,   112,   105,   105,    40,    58,
+   109,   109,    44,   105,    63,    47,    65,   109,    67,    81,
+    97,    98,    99,   100,    71,   105,    58,    76,    77,   109,
+    51,    63,   109,    65,     3,    67,     8,     9,    10,    11,
+    12,    81,    91,   112,    76,    77,    11,    12,     3,   297,
+   104,   299,   110,   110,   104,   104,   104,   305,   297,    91,
+    97,    98,    99,   100,    35,   313,   314,    68,   316,   104,
+     3,   104,     8,   321,     6,   314,     8,     9,    10,    25,
+   104,   275,   276,   331,   278,   112,   112,   106,    68,   106,
+    22,    68,    24,    30,    26,   105,    96,   104,   106,     4,
+    95,   103,    68,   107,    36,   111,   104,   106,    40,   101,
+   113,   359,    44,    45,   105,    47,   102,   107,   114,     4,
+    82,   369,   107,   107,    88,   373,    58,   109,   107,   104,
+   113,    63,     0,    65,   107,    67,   112,     8,     0,   107,
+    11,    12,     3,    13,    76,    77,   133,    18,    26,    56,
+    74,    22,    23,    24,    86,    26,    27,   113,   109,    91,
+   157,    65,   316,   191,   305,    36,   299,   295,   384,    40,
+   222,   226,   104,    44,   336,   357,    47,    48,    49,    50,
+   369,   359,   363,   313,   215,    56,    -1,    58,    59,    -1,
+    -1,    -1,    63,    64,    65,    66,    67,   238,     8,    -1,
+    -1,    11,    12,    74,    -1,    76,    77,    78,    79,    -1,
+    -1,    -1,    83,    23,    85,    -1,    -1,    -1,    -1,    90,
+    91,    92,    93,    94,    -1,    -1,    -1,    -1,    38,    -1,
+    -1,    -1,    42,    -1,    -1,    -1,    -1,    -1,    48,    49,
+    50,    -1,    -1,    -1,    54,    -1,    -1,    -1,    -1,    59,
+    -1,    -1,    -1,    -1,    64,    -1,    66,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    74,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    83,    -1,    85,    -1,    -1,    -1,    -1,
+    90,    -1,    92,    93,    94,    11,    12,    13,    14,    -1,
+    -1,    -1,    18,    -1,    -1,    -1,    22,    23,    24,    -1,
+    26,    27,    -1,    -1,    -1,    -1,    -1,    33,    -1,    -1,
+    36,    -1,    -1,    -1,    40,    -1,    -1,    -1,    44,    -1,
+    -1,    47,    48,    49,    50,    -1,    -1,    -1,    -1,    -1,
+    56,    -1,    58,    59,    -1,    -1,    -1,    63,    64,    65,
+    66,    67,    -1,    69,    -1,    -1,    -1,    -1,    74,    -1,
+    76,    77,    78,    79,    -1,    -1,    -1,    83,    -1,    85,
+    -1,    -1,    11,    12,    90,    91,    92,    93,    94,    18,
+    -1,    -1,    -1,    22,    23,    24,    -1,    26,    27,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    36,    -1,    -1,
+    -1,    40,    -1,    -1,    -1,    44,    -1,    -1,    47,    48,
+    49,    50,    -1,    -1,    -1,    -1,    -1,    56,    -1,    58,
+    59,    -1,    -1,    -1,    63,    64,    65,    66,    67,    -1,
+    -1,    -1,    -1,    -1,    -1,    74,    -1,    76,    77,    78,
+    79,    -1,    -1,    -1,    83,    -1,    85,    -1,    87,    11,
+    12,    90,    91,    92,    93,    94,    18,    -1,    -1,    -1,
     22,    23,    24,    -1,    26,    27,    -1,    -1,    -1,    -1,
-    -1,    33,    -1,    -1,    36,    -1,    -1,    -1,    40,    -1,
+    -1,    -1,    -1,    -1,    36,    -1,    -1,    -1,    40,    -1,
     -1,    -1,    44,    -1,    -1,    47,    48,    49,    50,    -1,
     -1,    -1,    -1,    -1,    56,    -1,    58,    59,    -1,    -1,
-    -1,    63,    64,    65,    66,    67,    -1,    69,    -1,    -1,
-    -1,    -1,    74,    -1,    76,    77,    78,    79,    -1,    -1,
-    -1,    83,    -1,    85,    -1,    -1,    11,    12,    90,    91,
-    92,    93,    94,    18,    -1,    -1,    -1,    22,    23,    24,
-    -1,    26,    27,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-    -1,    36,    -1,    -1,    -1,    40,    -1,    -1,    -1,    44,
-    -1,    -1,    47,    48,    49,    50,    -1,    -1,    -1,    -1,
-    -1,    56,    -1,    58,    59,    -1,    -1,    -1,    63,    64,
-    65,    66,    67,    -1,    -1,    -1,    -1,    -1,    -1,    74,
-    -1,    76,    77,    78,    79,    -1,    -1,    -1,    83,    -1,
-    85,    -1,    87,    11,    12,    90,    91,    92,    93,    94,
-    18,    -1,    -1,    -1,    22,    23,    24,    -1,    26,    27,
-    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    36,    -1,
-    -1,    -1,    40,    -1,    -1,    -1,    44,    -1,    -1,    47,
-    48,    49,    50,    -1,    -1,    -1,    -1,    -1,    56,    -1,
-    58,    59,    -1,    -1,    -1,    63,    64,    65,    66,    67,
-    -1,    -1,    -1,    11,    12,    -1,    74,    -1,    76,    77,
-    78,    79,    -1,    -1,    22,    83,    24,    85,    26,    -1,
-    11,    12,    90,    91,    92,    93,    94,    -1,    36,    -1,
-    -1,    22,    40,    24,    -1,    26,    44,    -1,    -1,    47,
-    -1,    -1,    -1,    -1,    -1,    36,    -1,    -1,    -1,    40,
-    58,    -1,    -1,    44,    -1,    63,    47,    65,    -1,    67,
-    -1,    -1,    -1,    -1,    -1,    -1,    -1,    58,    76,    77,
-    -1,    -1,    63,    -1,    65,    -1,    67,    -1,    -1,    -1,
-    -1,    -1,    -1,    91,    -1,    76,    77,    -1,    -1,    -1,
-    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-    91
+    -1,    63,    64,    65,    66,    67,    -1,    -1,    -1,    11,
+    12,    -1,    74,    -1,    76,    77,    78,    79,    -1,    -1,
+    22,    83,    24,    85,    26,    -1,    -1,    -1,    90,    91,
+    92,    93,    94,    -1,    36,    -1,    -1,    -1,    40,    -1,
+    -1,    -1,    44,    -1,    -1,    47,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    58,    -1,    -1,    -1,
+    -1,    63,    -1,    65,    -1,    67,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    76,    77,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    91
 };
 /* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
 #line 3 "/usr/share/bison.simple"
@@ -1778,7 +1790,7 @@
 	;
     break;}
 case 59:
-#line 745 "asn1p_y.y"
+#line 744 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[0].a_expr;
 		assert(yyval.a_expr->Identifier == 0);
@@ -1788,7 +1800,7 @@
 	;
     break;}
 case 60:
-#line 755 "asn1p_y.y"
+#line 754 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_plist = asn1p_paramlist_new(yylineno);
@@ -1800,7 +1812,7 @@
 	;
     break;}
 case 61:
-#line 764 "asn1p_y.y"
+#line 763 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_plist = yyvsp[-2].a_plist;
@@ -1811,14 +1823,14 @@
 	;
     break;}
 case 62:
-#line 775 "asn1p_y.y"
+#line 774 "asn1p_y.y"
 {
 		yyval.a_parg.governor = NULL;
 		yyval.a_parg.argument = yyvsp[0].tv_str;
 	;
     break;}
 case 63:
-#line 779 "asn1p_y.y"
+#line 778 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_parg.governor = asn1p_ref_new(yylineno);
@@ -1828,7 +1840,7 @@
 	;
     break;}
 case 64:
-#line 786 "asn1p_y.y"
+#line 785 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_parg.governor = asn1p_ref_new(yylineno);
@@ -1839,7 +1851,7 @@
 	;
     break;}
 case 65:
-#line 797 "asn1p_y.y"
+#line 796 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -1847,20 +1859,20 @@
 	;
     break;}
 case 66:
-#line 802 "asn1p_y.y"
+#line 801 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next);
 	;
     break;}
 case 67:
-#line 809 "asn1p_y.y"
+#line 808 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[0].a_expr;
 	;
     break;}
 case 68:
-#line 812 "asn1p_y.y"
+#line 811 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -1870,7 +1882,7 @@
 	;
     break;}
 case 69:
-#line 825 "asn1p_y.y"
+#line 824 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -1878,14 +1890,70 @@
 	;
     break;}
 case 70:
-#line 830 "asn1p_y.y"
+#line 829 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next);
 	;
     break;}
 case 71:
-#line 837 "asn1p_y.y"
+#line 836 "asn1p_y.y"
+{
+		yyval.a_expr = yyvsp[-1].a_expr;
+		assert(yyval.a_expr->Identifier == 0);
+		yyval.a_expr->Identifier = yyvsp[-2].tv_nametag.name;
+		yyval.a_expr->tag = yyvsp[-2].tv_nametag.tag;
+		yyval.a_expr->marker = yyvsp[0].a_marker;
+	;
+    break;}
+case 72:
+#line 843 "asn1p_y.y"
+{
+		yyval.a_expr = asn1p_expr_new(yylineno);
+		checkmem(yyval.a_expr);
+		yyval.a_expr->meta_type = yyvsp[0].a_expr->meta_type;
+		yyval.a_expr->expr_type = A1TC_COMPONENTS_OF;
+		TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next);
+	;
+    break;}
+case 73:
+#line 850 "asn1p_y.y"
+{
+		yyval.a_expr = yyvsp[0].a_expr;
+	;
+    break;}
+case 74:
+#line 856 "asn1p_y.y"
+{
+		yyval.a_expr = asn1p_expr_new(yylineno);
+		checkmem(yyval.a_expr);
+		TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next);
+	;
+    break;}
+case 75:
+#line 861 "asn1p_y.y"
+{
+		yyval.a_expr = yyvsp[-2].a_expr;
+		TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next);
+	;
+    break;}
+case 76:
+#line 868 "asn1p_y.y"
+{
+		yyval.a_expr = yyvsp[0].a_expr;
+		assert(yyval.a_expr->Identifier == 0);
+		yyval.a_expr->Identifier = yyvsp[-1].tv_nametag.name;
+		yyval.a_expr->tag = yyvsp[-1].tv_nametag.tag;
+	;
+    break;}
+case 77:
+#line 874 "asn1p_y.y"
+{
+		yyval.a_expr = yyvsp[0].a_expr;
+	;
+    break;}
+case 78:
+#line 880 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		checkmem(yyval.a_expr);
@@ -1894,16 +1962,16 @@
 		assert(yyval.a_expr->meta_type == AMT_OBJECT);
 	;
     break;}
-case 72:
-#line 847 "asn1p_y.y"
+case 79:
+#line 890 "asn1p_y.y"
 { yyval.a_int = 0; ;
     break;}
-case 73:
-#line 848 "asn1p_y.y"
+case 80:
+#line 891 "asn1p_y.y"
 { yyval.a_int = 1; ;
     break;}
-case 74:
-#line 852 "asn1p_y.y"
+case 81:
+#line 895 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -1912,15 +1980,15 @@
 		TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next);
 	;
     break;}
-case 75:
-#line 859 "asn1p_y.y"
+case 82:
+#line 902 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next);
 	;
     break;}
-case 76:
-#line 866 "asn1p_y.y"
+case 83:
+#line 909 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -1930,16 +1998,17 @@
 		yyval.a_expr->marker = yyvsp[0].a_marker;
 	;
     break;}
-case 77:
-#line 874 "asn1p_y.y"
+case 84:
+#line 917 "asn1p_y.y"
 {
-		yyval.a_expr = yyvsp[-1].a_expr;
-		yyval.a_expr->Identifier = yyvsp[-2].a_refcomp.name;
+		yyval.a_expr = yyvsp[-2].a_expr;
+		yyval.a_expr->Identifier = yyvsp[-3].a_refcomp.name;
+		yyval.a_expr->marker = yyvsp[-1].a_marker;
 		yyval.a_expr->unique = yyvsp[0].a_int;
 	;
     break;}
-case 78:
-#line 879 "asn1p_y.y"
+case 85:
+#line 923 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_expr = asn1p_expr_new(yylineno);
@@ -1956,48 +2025,48 @@
 		yyval.a_expr->unique = yyvsp[0].a_int;
 	;
     break;}
-case 79:
-#line 897 "asn1p_y.y"
+case 86:
+#line 941 "asn1p_y.y"
 { yyval.a_wsynt = 0; ;
     break;}
-case 80:
-#line 898 "asn1p_y.y"
+case 87:
+#line 942 "asn1p_y.y"
 {
 		yyval.a_wsynt = yyvsp[0].a_wsynt;
 	;
     break;}
-case 81:
-#line 905 "asn1p_y.y"
+case 88:
+#line 949 "asn1p_y.y"
 { asn1p_lexer_hack_enable_with_syntax(); ;
     break;}
-case 82:
-#line 907 "asn1p_y.y"
+case 89:
+#line 951 "asn1p_y.y"
 {
 		yyval.a_wsynt = yyvsp[-1].a_wsynt;
 	;
     break;}
-case 83:
-#line 913 "asn1p_y.y"
+case 90:
+#line 957 "asn1p_y.y"
 {
 		yyval.a_wsynt = asn1p_wsyntx_new();
 		TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next);
 	;
     break;}
-case 84:
-#line 917 "asn1p_y.y"
+case 91:
+#line 961 "asn1p_y.y"
 {
 		yyval.a_wsynt = yyvsp[-1].a_wsynt;
 		TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next);
 	;
     break;}
-case 85:
-#line 924 "asn1p_y.y"
+case 92:
+#line 968 "asn1p_y.y"
 {
 		yyval.a_wchunk = asn1p_wsyntx_chunk_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0);
 	;
     break;}
-case 86:
-#line 927 "asn1p_y.y"
+case 93:
+#line 971 "asn1p_y.y"
 {
 		asn1p_ref_t *ref;
 		int ret;
@@ -2008,43 +2077,7 @@
 		yyval.a_wchunk = asn1p_wsyntx_chunk_fromref(ref, 0);
 	;
     break;}
-case 87:
-#line 953 "asn1p_y.y"
-{
-		yyval.a_expr = yyvsp[0].a_expr;
-		assert(yyval.a_expr->Identifier == 0);
-		yyval.a_expr->Identifier = yyvsp[-1].tv_nametag.name;
-		yyval.a_expr->tag = yyvsp[-1].tv_nametag.tag;
-	;
-    break;}
-case 88:
-#line 959 "asn1p_y.y"
-{
-		yyval.a_expr = yyvsp[0].a_expr;
-	;
-    break;}
-case 89:
-#line 965 "asn1p_y.y"
-{
-		yyval.a_expr = yyvsp[-2].a_expr;
-		if(yyval.a_expr->constraints) {
-			assert(!yyvsp[-1].a_constr);
-		} else {
-			yyval.a_expr->constraints = yyvsp[-1].a_constr;
-		}
-		yyval.a_expr->marker = yyvsp[0].a_marker;
-	;
-    break;}
-case 90:
-#line 974 "asn1p_y.y"
-{
-		/* This type includes constraints on its own */
-		yyval.a_expr = yyvsp[0].a_expr;
-		checkmem(yyval.a_expr);
-		assert(yyval.a_expr->meta_type);
-	;
-    break;}
-case 91:
+case 94:
 #line 983 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(asn1p_lineno);
@@ -2055,7 +2088,7 @@
 		yyval.a_expr->meta_type = AMT_TYPE;
 	;
     break;}
-case 92:
+case 95:
 #line 991 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(asn1p_lineno);
@@ -2067,7 +2100,7 @@
 		yyval.a_expr->meta_type = AMT_TYPE;
 	;
     break;}
-case 93:
+case 96:
 #line 1000 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(asn1p_lineno);
@@ -2079,14 +2112,35 @@
 		yyval.a_expr->meta_type = AMT_TYPE;
 	;
     break;}
-case 94:
+case 97:
 #line 1012 "asn1p_y.y"
 {
+		yyval.a_expr = yyvsp[-1].a_expr;
+		/*
+		 * Outer constraint for SEQUENCE OF and SET OF applies
+		 * to the inner type.
+		 */
+		if(yyval.a_expr->expr_type == ASN_CONSTR_SEQUENCE_OF
+		|| yyval.a_expr->expr_type == ASN_CONSTR_SET_OF) {
+			assert(!TQ_FIRST(&(yyval.a_expr->members))->constraints);
+			TQ_FIRST(&(yyval.a_expr->members))->constraints = yyvsp[0].a_constr;
+		} else {
+			if(yyval.a_expr->constraints) {
+				assert(!yyvsp[0].a_constr);
+			} else {
+				yyval.a_expr->constraints = yyvsp[0].a_constr;
+			}
+		}
+	;
+    break;}
+case 98:
+#line 1033 "asn1p_y.y"
+{
 		yyval.a_expr = yyvsp[0].a_expr;
 	;
     break;}
-case 95:
-#line 1015 "asn1p_y.y"
+case 99:
+#line 1036 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2094,16 +2148,80 @@
 		yyval.a_expr->meta_type = AMT_TYPE;
 	;
     break;}
-case 96:
-#line 1021 "asn1p_y.y"
+case 100:
+#line 1042 "asn1p_y.y"
 {
-		yyval.a_expr = yyvsp[0].a_expr;
-		checkmem(yyval.a_expr);
-		assert(yyval.a_expr->meta_type);
+		yyval.a_expr = yyvsp[-1].a_expr;
+		assert(yyval.a_expr->expr_type == A1TC_INVALID);
+		yyval.a_expr->expr_type = ASN_CONSTR_CHOICE;
+		yyval.a_expr->meta_type = AMT_TYPE;
 	;
     break;}
-case 97:
-#line 1029 "asn1p_y.y"
+case 101:
+#line 1048 "asn1p_y.y"
+{
+		yyval.a_expr = yyvsp[-1].a_expr;
+		assert(yyval.a_expr->expr_type == A1TC_INVALID);
+		yyval.a_expr->expr_type = ASN_CONSTR_SEQUENCE;
+		yyval.a_expr->meta_type = AMT_TYPE;
+	;
+    break;}
+case 102:
+#line 1054 "asn1p_y.y"
+{
+		yyval.a_expr = yyvsp[-1].a_expr;
+		assert(yyval.a_expr->expr_type == A1TC_INVALID);
+		yyval.a_expr->expr_type = ASN_CONSTR_SET;
+		yyval.a_expr->meta_type = AMT_TYPE;
+	;
+    break;}
+case 103:
+#line 1060 "asn1p_y.y"
+{
+		yyval.a_expr = asn1p_expr_new(asn1p_lineno);
+		checkmem(yyval.a_expr);
+		yyval.a_expr->constraints = yyvsp[-2].a_constr;
+		yyval.a_expr->expr_type = ASN_CONSTR_SEQUENCE_OF;
+		yyval.a_expr->meta_type = AMT_TYPE;
+		TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next);
+	;
+    break;}
+case 104:
+#line 1068 "asn1p_y.y"
+{
+		yyval.a_expr = asn1p_expr_new(asn1p_lineno);
+		checkmem(yyval.a_expr);
+		yyval.a_expr->constraints = yyvsp[-2].a_constr;
+		yyval.a_expr->expr_type = ASN_CONSTR_SET_OF;
+		yyval.a_expr->meta_type = AMT_TYPE;
+		TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next);
+	;
+    break;}
+case 105:
+#line 1076 "asn1p_y.y"
+{
+		yyval.a_expr = asn1p_expr_new(asn1p_lineno);
+		checkmem(yyval.a_expr);
+		yyval.a_expr->expr_type = ASN_CONSTR_ANY;
+		yyval.a_expr->meta_type = AMT_TYPE;
+	;
+    break;}
+case 106:
+#line 1082 "asn1p_y.y"
+{
+		int ret;
+		yyval.a_expr = asn1p_expr_new(asn1p_lineno);
+		checkmem(yyval.a_expr);
+		yyval.a_expr->reference = asn1p_ref_new(yylineno);
+		ret = asn1p_ref_add_component(yyval.a_expr->reference,
+			yyvsp[0].tv_str, RLT_lowercase);
+		checkmem(ret == 0);
+		yyval.a_expr->expr_type = ASN_CONSTR_ANY;
+		yyval.a_expr->meta_type = AMT_TYPE;
+	;
+    break;}
+case 107:
+#line 1097 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_expr = yyvsp[-1].a_expr;
@@ -2119,8 +2237,8 @@
 		yyval.a_expr->meta_type = AMT_TYPE;
 	;
     break;}
-case 98:
-#line 1053 "asn1p_y.y"
+case 108:
+#line 1121 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2129,8 +2247,8 @@
 		yyval.a_expr->meta_type = AMT_TYPEREF;
 	;
     break;}
-case 99:
-#line 1060 "asn1p_y.y"
+case 109:
+#line 1128 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2139,8 +2257,8 @@
 		yyval.a_expr->meta_type = AMT_TYPE;
 	;
     break;}
-case 100:
-#line 1075 "asn1p_y.y"
+case 110:
+#line 1143 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_ref = asn1p_ref_new(yylineno);
@@ -2150,8 +2268,8 @@
 		free(yyvsp[0].tv_str);
 	;
     break;}
-case 101:
-#line 1083 "asn1p_y.y"
+case 111:
+#line 1151 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_ref = asn1p_ref_new(yylineno);
@@ -2163,8 +2281,8 @@
 		free(yyvsp[-2].tv_str);
 	;
     break;}
-case 102:
-#line 1093 "asn1p_y.y"
+case 112:
+#line 1161 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_ref = asn1p_ref_new(yylineno);
@@ -2176,8 +2294,8 @@
 		free(yyvsp[-2].tv_str);
 	;
     break;}
-case 103:
-#line 1103 "asn1p_y.y"
+case 113:
+#line 1171 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_ref = asn1p_ref_new(yylineno);
@@ -2187,8 +2305,8 @@
 		checkmem(ret == 0);
 	;
     break;}
-case 104:
-#line 1111 "asn1p_y.y"
+case 114:
+#line 1179 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_ref = yyvsp[0].a_ref;
@@ -2209,8 +2327,8 @@
 		}
 	;
     break;}
-case 105:
-#line 1133 "asn1p_y.y"
+case 115:
+#line 1201 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_ref = asn1p_ref_new(yylineno);
@@ -2220,8 +2338,8 @@
 		checkmem(ret == 0);
 	;
     break;}
-case 106:
-#line 1141 "asn1p_y.y"
+case 116:
+#line 1209 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_ref = yyvsp[-2].a_ref;
@@ -2230,22 +2348,22 @@
 		checkmem(ret == 0);
 	;
     break;}
-case 109:
-#line 1155 "asn1p_y.y"
+case 119:
+#line 1223 "asn1p_y.y"
 {
 		yyval.a_refcomp.lex_type = RLT_AmpUppercase;
 		yyval.a_refcomp.name = yyvsp[0].tv_str;
 	;
     break;}
-case 110:
-#line 1160 "asn1p_y.y"
+case 120:
+#line 1228 "asn1p_y.y"
 {
 		yyval.a_refcomp.lex_type = RLT_Amplowercase;
 		yyval.a_refcomp.name = yyvsp[0].tv_str;
 	;
     break;}
-case 111:
-#line 1173 "asn1p_y.y"
+case 121:
+#line 1241 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		assert(yyval.a_expr->Identifier == NULL);
@@ -2254,53 +2372,53 @@
 		yyval.a_expr->value = yyvsp[0].a_value;
 	;
     break;}
-case 112:
-#line 1183 "asn1p_y.y"
+case 122:
+#line 1251 "asn1p_y.y"
 { asn1p_lexer_hack_push_opaque_state(); ;
     break;}
-case 113:
-#line 1184 "asn1p_y.y"
+case 123:
+#line 1252 "asn1p_y.y"
 {
 		yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0);
 		checkmem(yyval.a_value);
 		yyval.a_value->type = ATV_UNPARSED;
 	;
     break;}
-case 114:
-#line 1189 "asn1p_y.y"
+case 124:
+#line 1257 "asn1p_y.y"
 {
 		yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'B');
 		checkmem(yyval.a_value);
 	;
     break;}
-case 115:
-#line 1193 "asn1p_y.y"
+case 125:
+#line 1261 "asn1p_y.y"
 {
 		yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'H');
 		checkmem(yyval.a_value);
 	;
     break;}
-case 116:
-#line 1197 "asn1p_y.y"
+case 126:
+#line 1265 "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 117:
-#line 1201 "asn1p_y.y"
+case 127:
+#line 1269 "asn1p_y.y"
 {
 		yyval.a_value = yyvsp[0].a_value;
 	;
     break;}
-case 118:
-#line 1204 "asn1p_y.y"
+case 128:
+#line 1272 "asn1p_y.y"
 {
 		yyval.a_value = yyvsp[0].a_value;
 	;
     break;}
-case 119:
-#line 1210 "asn1p_y.y"
+case 129:
+#line 1278 "asn1p_y.y"
 {
 		asn1p_ref_t *ref;
 		int ret;
@@ -2313,8 +2431,8 @@
 		free(yyvsp[0].tv_str);
 	;
     break;}
-case 120:
-#line 1221 "asn1p_y.y"
+case 130:
+#line 1289 "asn1p_y.y"
 {
 		asn1p_ref_t *ref;
 		int ret;
@@ -2330,8 +2448,8 @@
 		free(yyvsp[0].tv_str);
 	;
     break;}
-case 121:
-#line 1238 "asn1p_y.y"
+case 131:
+#line 1306 "asn1p_y.y"
 {
 		yyval.tv_opaque.len = yyvsp[0].tv_opaque.len + 2;
 		yyval.tv_opaque.buf = malloc(yyval.tv_opaque.len + 1);
@@ -2343,8 +2461,8 @@
 		free(yyvsp[0].tv_opaque.buf);
 	;
     break;}
-case 122:
-#line 1248 "asn1p_y.y"
+case 132:
+#line 1316 "asn1p_y.y"
 {
 		int newsize = yyvsp[-1].tv_opaque.len + yyvsp[0].tv_opaque.len;
 		char *p = malloc(newsize + 1);
@@ -2358,68 +2476,68 @@
 		yyval.tv_opaque.len = newsize;
 	;
     break;}
-case 123:
-#line 1263 "asn1p_y.y"
+case 133:
+#line 1331 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_BOOLEAN; ;
     break;}
-case 124:
-#line 1264 "asn1p_y.y"
+case 134:
+#line 1332 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_NULL; ;
     break;}
-case 125:
-#line 1265 "asn1p_y.y"
+case 135:
+#line 1333 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_REAL; ;
     break;}
-case 126:
-#line 1266 "asn1p_y.y"
+case 136:
+#line 1334 "asn1p_y.y"
 { yyval.a_type = yyvsp[0].a_type; ;
     break;}
-case 127:
-#line 1267 "asn1p_y.y"
+case 137:
+#line 1335 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_OCTET_STRING; ;
     break;}
-case 128:
-#line 1268 "asn1p_y.y"
+case 138:
+#line 1336 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; ;
     break;}
-case 129:
-#line 1269 "asn1p_y.y"
+case 139:
+#line 1337 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_RELATIVE_OID; ;
     break;}
-case 130:
-#line 1270 "asn1p_y.y"
+case 140:
+#line 1338 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_EXTERNAL; ;
     break;}
-case 131:
-#line 1271 "asn1p_y.y"
+case 141:
+#line 1339 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_EMBEDDED_PDV; ;
     break;}
-case 132:
-#line 1272 "asn1p_y.y"
+case 142:
+#line 1340 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_CHARACTER_STRING; ;
     break;}
-case 133:
-#line 1273 "asn1p_y.y"
+case 143:
+#line 1341 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_UTCTime; ;
     break;}
-case 134:
-#line 1274 "asn1p_y.y"
+case 144:
+#line 1342 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_GeneralizedTime; ;
     break;}
-case 135:
-#line 1281 "asn1p_y.y"
+case 145:
+#line 1349 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_INTEGER; ;
     break;}
-case 136:
-#line 1282 "asn1p_y.y"
+case 146:
+#line 1350 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_ENUMERATED; ;
     break;}
-case 137:
-#line 1283 "asn1p_y.y"
+case 147:
+#line 1351 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_BIT_STRING; ;
     break;}
-case 138:
-#line 1287 "asn1p_y.y"
+case 148:
+#line 1355 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(asn1p_lineno);
 		checkmem(yyval.a_expr);
@@ -2427,8 +2545,8 @@
 		yyval.a_expr->meta_type = AMT_TYPE;
 	;
     break;}
-case 139:
-#line 1293 "asn1p_y.y"
+case 149:
+#line 1361 "asn1p_y.y"
 {
 		if(yyvsp[0].a_expr) {
 			yyval.a_expr = yyvsp[0].a_expr;
@@ -2440,164 +2558,92 @@
 		yyval.a_expr->meta_type = AMT_TYPE;
 	;
     break;}
-case 140:
-#line 1306 "asn1p_y.y"
+case 150:
+#line 1374 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_BMPString; ;
     break;}
-case 141:
-#line 1307 "asn1p_y.y"
+case 151:
+#line 1375 "asn1p_y.y"
 {
 		yyval.a_type = ASN_STRING_GeneralString;
 		return yyerror("GeneralString is not supported");
 	;
     break;}
-case 142:
-#line 1311 "asn1p_y.y"
+case 152:
+#line 1379 "asn1p_y.y"
 {
 		yyval.a_type = ASN_STRING_GraphicString;
 		return yyerror("GraphicString is not supported");
 	;
     break;}
-case 143:
-#line 1315 "asn1p_y.y"
+case 153:
+#line 1383 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_IA5String; ;
     break;}
-case 144:
-#line 1316 "asn1p_y.y"
+case 154:
+#line 1384 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_ISO646String; ;
     break;}
-case 145:
-#line 1317 "asn1p_y.y"
+case 155:
+#line 1385 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_NumericString; ;
     break;}
-case 146:
-#line 1318 "asn1p_y.y"
+case 156:
+#line 1386 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_PrintableString; ;
     break;}
-case 147:
-#line 1319 "asn1p_y.y"
+case 157:
+#line 1387 "asn1p_y.y"
 {
 		yyval.a_type = ASN_STRING_T61String;
 		return yyerror("T61String not implemented yet");
 	;
     break;}
-case 148:
-#line 1323 "asn1p_y.y"
+case 158:
+#line 1391 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_TeletexString; ;
     break;}
-case 149:
-#line 1324 "asn1p_y.y"
+case 159:
+#line 1392 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_UniversalString; ;
     break;}
-case 150:
-#line 1325 "asn1p_y.y"
+case 160:
+#line 1393 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_UTF8String; ;
     break;}
-case 151:
-#line 1326 "asn1p_y.y"
+case 161:
+#line 1394 "asn1p_y.y"
 {
 		yyval.a_type = ASN_STRING_VideotexString;
 		return yyerror("VideotexString is no longer supported");
 	;
     break;}
-case 152:
-#line 1330 "asn1p_y.y"
+case 162:
+#line 1398 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_VisibleString; ;
     break;}
-case 153:
-#line 1331 "asn1p_y.y"
+case 163:
+#line 1399 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_ObjectDescriptor; ;
     break;}
-case 154:
-#line 1336 "asn1p_y.y"
-{
-		yyval.a_expr = asn1p_expr_new(asn1p_lineno);
-		checkmem(yyval.a_expr);
-		yyval.a_expr->constraints = yyvsp[-2].a_constr;
-		yyval.a_expr->expr_type = ASN_CONSTR_SEQUENCE_OF;
-		yyval.a_expr->meta_type = AMT_TYPE;
-		TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next);
-	;
-    break;}
-case 155:
-#line 1344 "asn1p_y.y"
-{
-		yyval.a_expr = asn1p_expr_new(asn1p_lineno);
-		checkmem(yyval.a_expr);
-		yyval.a_expr->constraints = yyvsp[-2].a_constr;
-		yyval.a_expr->expr_type = ASN_CONSTR_SET_OF;
-		yyval.a_expr->meta_type = AMT_TYPE;
-		TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next);
-	;
-    break;}
-case 156:
-#line 1355 "asn1p_y.y"
-{
-		yyval.a_expr = yyvsp[-1].a_expr;
-		assert(yyval.a_expr->expr_type == A1TC_INVALID);
-		yyval.a_expr->expr_type = ASN_CONSTR_CHOICE;
-		yyval.a_expr->meta_type = AMT_TYPE;
-	;
-    break;}
-case 157:
-#line 1361 "asn1p_y.y"
-{
-		yyval.a_expr = yyvsp[-1].a_expr;
-		assert(yyval.a_expr->expr_type == A1TC_INVALID);
-		yyval.a_expr->expr_type = ASN_CONSTR_SEQUENCE;
-		yyval.a_expr->meta_type = AMT_TYPE;
-	;
-    break;}
-case 158:
-#line 1367 "asn1p_y.y"
-{
-		yyval.a_expr = yyvsp[-1].a_expr;
-		assert(yyval.a_expr->expr_type == A1TC_INVALID);
-		yyval.a_expr->expr_type = ASN_CONSTR_SET;
-		yyval.a_expr->meta_type = AMT_TYPE;
-	;
-    break;}
-case 159:
-#line 1373 "asn1p_y.y"
-{
-		yyval.a_expr = asn1p_expr_new(asn1p_lineno);
-		checkmem(yyval.a_expr);
-		yyval.a_expr->expr_type = ASN_CONSTR_ANY;
-		yyval.a_expr->meta_type = AMT_TYPE;
-	;
-    break;}
-case 160:
-#line 1379 "asn1p_y.y"
-{
-		int ret;
-		yyval.a_expr = asn1p_expr_new(asn1p_lineno);
-		checkmem(yyval.a_expr);
-		yyval.a_expr->reference = asn1p_ref_new(yylineno);
-		ret = asn1p_ref_add_component(yyval.a_expr->reference,
-			yyvsp[0].tv_str, RLT_lowercase);
-		checkmem(ret == 0);
-		yyval.a_expr->expr_type = ASN_CONSTR_ANY;
-		yyval.a_expr->meta_type = AMT_TYPE;
-	;
-    break;}
-case 166:
-#line 1400 "asn1p_y.y"
+case 169:
+#line 1411 "asn1p_y.y"
 { yyval.a_constr = 0; ;
     break;}
-case 167:
-#line 1401 "asn1p_y.y"
+case 170:
+#line 1412 "asn1p_y.y"
 {
 		yyval.a_constr = yyvsp[0].a_constr;
 	;
     break;}
-case 168:
-#line 1407 "asn1p_y.y"
+case 171:
+#line 1418 "asn1p_y.y"
 {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[0].a_constr, 0);
 	;
     break;}
-case 169:
-#line 1410 "asn1p_y.y"
+case 172:
+#line 1421 "asn1p_y.y"
 {
 		/*
 		 * This is a special case, for compatibility purposes.
@@ -2606,26 +2652,26 @@
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_SIZE, yyvsp[-1].a_constr, 0);
 	;
     break;}
-case 170:
-#line 1420 "asn1p_y.y"
+case 173:
+#line 1431 "asn1p_y.y"
 {
 		yyval.a_constr = yyvsp[-1].a_constr;
 	;
     break;}
-case 171:
-#line 1423 "asn1p_y.y"
+case 174:
+#line 1434 "asn1p_y.y"
 {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[-3].a_constr, yyvsp[-1].a_constr);
 	;
     break;}
-case 172:
-#line 1429 "asn1p_y.y"
+case 175:
+#line 1440 "asn1p_y.y"
 {
 		yyval.a_constr = yyvsp[0].a_constr;
 	;
     break;}
-case 173:
-#line 1432 "asn1p_y.y"
+case 176:
+#line 1443 "asn1p_y.y"
 {
 		asn1p_constraint_t *ct;
 		ct = asn1p_constraint_new(yylineno);
@@ -2633,8 +2679,8 @@
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct);
 	;
     break;}
-case 174:
-#line 1438 "asn1p_y.y"
+case 177:
+#line 1449 "asn1p_y.y"
 {
 		asn1p_constraint_t *ct;
 		ct = asn1p_constraint_new(yylineno);
@@ -2644,32 +2690,32 @@
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, ct, yyvsp[0].a_constr);
 	;
     break;}
-case 175:
-#line 1449 "asn1p_y.y"
+case 178:
+#line 1460 "asn1p_y.y"
 {
 		yyval.a_constr = yyvsp[0].a_constr;
 	;
     break;}
-case 176:
-#line 1452 "asn1p_y.y"
+case 179:
+#line 1463 "asn1p_y.y"
 {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_UNI, yyvsp[-2].a_constr, yyvsp[0].a_constr);
 	;
     break;}
-case 177:
-#line 1455 "asn1p_y.y"
+case 180:
+#line 1466 "asn1p_y.y"
 {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_INT, yyvsp[-2].a_constr, yyvsp[0].a_constr);
 	;
     break;}
-case 178:
-#line 1458 "asn1p_y.y"
+case 181:
+#line 1469 "asn1p_y.y"
 {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_EXC, yyvsp[-2].a_constr, yyvsp[0].a_constr);
 	;
     break;}
-case 179:
-#line 1464 "asn1p_y.y"
+case 182:
+#line 1475 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_constr = asn1p_constraint_new(yylineno);
@@ -2679,8 +2725,8 @@
 		checkmem(ret == 0);
 	;
     break;}
-case 180:
-#line 1472 "asn1p_y.y"
+case 183:
+#line 1483 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_constr = asn1p_constraint_new(yylineno);
@@ -2690,8 +2736,8 @@
 		checkmem(ret == 0);
 	;
     break;}
-case 181:
-#line 1480 "asn1p_y.y"
+case 184:
+#line 1491 "asn1p_y.y"
 {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
@@ -2699,98 +2745,98 @@
 		yyval.a_constr->value = yyvsp[0].a_value;
 	;
     break;}
-case 182:
-#line 1486 "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 183:
-#line 1493 "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 184:
-#line 1501 "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 185:
-#line 1509 "asn1p_y.y"
+#line 1497 "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 186:
-#line 1518 "asn1p_y.y"
+#line 1504 "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 187:
-#line 1521 "asn1p_y.y"
+#line 1512 "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 188:
+#line 1520 "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 189:
+#line 1529 "asn1p_y.y"
 {
 		yyval.a_constr = yyvsp[0].a_constr;
 	;
     break;}
-case 188:
-#line 1527 "asn1p_y.y"
-{ yyval.a_ctype = ACT_EL_RANGE; ;
-    break;}
-case 189:
-#line 1528 "asn1p_y.y"
-{ yyval.a_ctype = ACT_EL_RLRANGE; ;
-    break;}
 case 190:
-#line 1529 "asn1p_y.y"
-{ yyval.a_ctype = ACT_EL_LLRANGE; ;
+#line 1532 "asn1p_y.y"
+{
+		yyval.a_constr = yyvsp[0].a_constr;
+	;
     break;}
 case 191:
-#line 1530 "asn1p_y.y"
-{ yyval.a_ctype = ACT_EL_ULRANGE; ;
+#line 1538 "asn1p_y.y"
+{ yyval.a_ctype = ACT_EL_RANGE; ;
     break;}
 case 192:
-#line 1534 "asn1p_y.y"
+#line 1539 "asn1p_y.y"
+{ yyval.a_ctype = ACT_EL_RLRANGE; ;
+    break;}
+case 193:
+#line 1540 "asn1p_y.y"
+{ yyval.a_ctype = ACT_EL_LLRANGE; ;
+    break;}
+case 194:
+#line 1541 "asn1p_y.y"
+{ yyval.a_ctype = ACT_EL_ULRANGE; ;
+    break;}
+case 195:
+#line 1545 "asn1p_y.y"
 {
 		yyval.a_ctype = ACT_CT_SIZE;
 	;
     break;}
-case 193:
-#line 1537 "asn1p_y.y"
+case 196:
+#line 1548 "asn1p_y.y"
 {
 		yyval.a_ctype = ACT_CT_FROM;
 	;
     break;}
-case 194:
-#line 1543 "asn1p_y.y"
+case 197:
+#line 1554 "asn1p_y.y"
 {
 		yyval.a_value = yyvsp[0].a_value;
 	;
     break;}
-case 195:
-#line 1546 "asn1p_y.y"
+case 198:
+#line 1557 "asn1p_y.y"
 {
 		asn1p_ref_t *ref;
 		int ret;
@@ -2803,57 +2849,57 @@
 		free(yyvsp[0].tv_str);
 	;
     break;}
-case 196:
-#line 1557 "asn1p_y.y"
+case 199:
+#line 1568 "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 197:
-#line 1562 "asn1p_y.y"
+case 200:
+#line 1573 "asn1p_y.y"
 {
 		yyval.a_value = asn1p_value_fromint(0);
 		checkmem(yyval.a_value);
 		yyval.a_value->type = ATV_FALSE;
 	;
     break;}
-case 198:
-#line 1567 "asn1p_y.y"
+case 201:
+#line 1578 "asn1p_y.y"
 {
 		yyval.a_value = asn1p_value_fromint(1);
 		checkmem(yyval.a_value);
 		yyval.a_value->type = ATV_TRUE;
 	;
     break;}
-case 199:
-#line 1575 "asn1p_y.y"
+case 202:
+#line 1586 "asn1p_y.y"
 {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-1].a_constr, 0);
 	;
     break;}
-case 200:
-#line 1581 "asn1p_y.y"
+case 203:
+#line 1592 "asn1p_y.y"
 {
 		yyval.a_constr = yyvsp[0].a_constr;
 	;
     break;}
-case 201:
-#line 1584 "asn1p_y.y"
+case 204:
+#line 1595 "asn1p_y.y"
 {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-2].a_constr, yyvsp[0].a_constr);
 	;
     break;}
-case 202:
-#line 1590 "asn1p_y.y"
+case 205:
+#line 1601 "asn1p_y.y"
 {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
 		yyval.a_constr->type = ACT_EL_EXT;
 	;
     break;}
-case 203:
-#line 1595 "asn1p_y.y"
+case 206:
+#line 1606 "asn1p_y.y"
 {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
@@ -2862,46 +2908,46 @@
 		yyval.a_constr->presence = yyvsp[0].a_pres;
 	;
     break;}
-case 204:
-#line 1608 "asn1p_y.y"
+case 207:
+#line 1619 "asn1p_y.y"
 { yyval.a_pres = ACPRES_DEFAULT; ;
     break;}
-case 205:
-#line 1609 "asn1p_y.y"
+case 208:
+#line 1620 "asn1p_y.y"
 { yyval.a_pres = yyvsp[0].a_pres; ;
     break;}
-case 206:
-#line 1613 "asn1p_y.y"
+case 209:
+#line 1624 "asn1p_y.y"
 {
 		yyval.a_pres = ACPRES_PRESENT;
 	;
     break;}
-case 207:
-#line 1616 "asn1p_y.y"
+case 210:
+#line 1627 "asn1p_y.y"
 {
 		yyval.a_pres = ACPRES_ABSENT;
 	;
     break;}
-case 208:
-#line 1619 "asn1p_y.y"
+case 211:
+#line 1630 "asn1p_y.y"
 {
 		yyval.a_pres = ACPRES_OPTIONAL;
 	;
     break;}
-case 209:
-#line 1625 "asn1p_y.y"
+case 212:
+#line 1636 "asn1p_y.y"
 {
 		yyval.a_constr = yyvsp[0].a_constr;
 	;
     break;}
-case 210:
-#line 1628 "asn1p_y.y"
+case 213:
+#line 1639 "asn1p_y.y"
 {
 		yyval.a_constr = yyvsp[0].a_constr;
 	;
     break;}
-case 211:
-#line 1637 "asn1p_y.y"
+case 214:
+#line 1648 "asn1p_y.y"
 {
 		asn1p_ref_t *ref = asn1p_ref_new(yylineno);
 		asn1p_constraint_t *ct;
@@ -2915,14 +2961,14 @@
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, ct, 0);
 	;
     break;}
-case 212:
-#line 1652 "asn1p_y.y"
+case 215:
+#line 1663 "asn1p_y.y"
 {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, yyvsp[-3].a_constr, yyvsp[-1].a_constr);
 	;
     break;}
-case 213:
-#line 1658 "asn1p_y.y"
+case 216:
+#line 1669 "asn1p_y.y"
 {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
@@ -2930,8 +2976,8 @@
 		yyval.a_constr->value = asn1p_value_fromref(yyvsp[0].a_ref, 0);
 	;
     break;}
-case 214:
-#line 1664 "asn1p_y.y"
+case 217:
+#line 1675 "asn1p_y.y"
 {
 		asn1p_constraint_t *ct;
 		ct = asn1p_constraint_new(yylineno);
@@ -2941,8 +2987,8 @@
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct);
 	;
     break;}
-case 215:
-#line 1678 "asn1p_y.y"
+case 218:
+#line 1689 "asn1p_y.y"
 {
 		char *p = malloc(strlen(yyvsp[0].tv_str) + 2);
 		int ret;
@@ -2955,8 +3001,8 @@
 		free(yyvsp[0].tv_str);
 	;
     break;}
-case 216:
-#line 1689 "asn1p_y.y"
+case 219:
+#line 1700 "asn1p_y.y"
 {
 		char *p = malloc(strlen(yyvsp[0].tv_str) + 3);
 		int ret;
@@ -2970,14 +3016,14 @@
 		free(yyvsp[0].tv_str);
 	;
     break;}
-case 217:
-#line 1705 "asn1p_y.y"
+case 220:
+#line 1716 "asn1p_y.y"
 {
 		yyval.tv_str = yyvsp[0].tv_str;
 	;
     break;}
-case 218:
-#line 1708 "asn1p_y.y"
+case 221:
+#line 1719 "asn1p_y.y"
 {
 		int l1 = strlen(yyvsp[-2].tv_str);
 		int l3 = strlen(yyvsp[0].tv_str);
@@ -2988,76 +3034,76 @@
 		yyval.tv_str[l1 + 1 + l3] = '\0';
 	;
     break;}
-case 219:
-#line 1726 "asn1p_y.y"
+case 222:
+#line 1737 "asn1p_y.y"
 { yyval.a_marker = EM_NOMARK; ;
     break;}
-case 220:
-#line 1727 "asn1p_y.y"
+case 223:
+#line 1738 "asn1p_y.y"
 { yyval.a_marker = yyvsp[0].a_marker; ;
     break;}
-case 221:
-#line 1731 "asn1p_y.y"
+case 224:
+#line 1742 "asn1p_y.y"
 {
 		yyval.a_marker = EM_OPTIONAL;
 	;
     break;}
-case 222:
-#line 1734 "asn1p_y.y"
+case 225:
+#line 1745 "asn1p_y.y"
 {
 		yyval.a_marker = EM_DEFAULT;
 		/* FIXME: store DefaultValue somewhere */
 	;
     break;}
-case 223:
-#line 1741 "asn1p_y.y"
-{
-	;
-    break;}
-case 224:
-#line 1743 "asn1p_y.y"
-{
-	;
-    break;}
-case 225:
-#line 1745 "asn1p_y.y"
-{ asn1p_lexer_hack_push_opaque_state(); ;
-    break;}
 case 226:
-#line 1745 "asn1p_y.y"
+#line 1752 "asn1p_y.y"
 {
 	;
     break;}
 case 227:
-#line 1766 "asn1p_y.y"
+#line 1754 "asn1p_y.y"
+{
+	;
+    break;}
+case 228:
+#line 1756 "asn1p_y.y"
+{ asn1p_lexer_hack_push_opaque_state(); ;
+    break;}
+case 229:
+#line 1756 "asn1p_y.y"
+{
+	;
+    break;}
+case 230:
+#line 1777 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(asn1p_lineno);
 		checkmem(yyval.a_expr);
 	;
     break;}
-case 228:
-#line 1770 "asn1p_y.y"
+case 231:
+#line 1781 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-1].a_expr;
 	;
     break;}
-case 229:
-#line 1776 "asn1p_y.y"
+case 232:
+#line 1787 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(asn1p_lineno);
 		checkmem(yyval.a_expr);
 		TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next);
 	;
     break;}
-case 230:
-#line 1781 "asn1p_y.y"
+case 233:
+#line 1792 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next);
 	;
     break;}
-case 231:
-#line 1788 "asn1p_y.y"
+case 234:
+#line 1799 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(asn1p_lineno);
 		checkmem(yyval.a_expr);
@@ -3066,8 +3112,8 @@
 		yyval.a_expr->Identifier = yyvsp[0].tv_str;
 	;
     break;}
-case 232:
-#line 1795 "asn1p_y.y"
+case 235:
+#line 1806 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(asn1p_lineno);
 		checkmem(yyval.a_expr);
@@ -3077,8 +3123,8 @@
 		yyval.a_expr->value = yyvsp[-1].a_value;
 	;
     break;}
-case 233:
-#line 1803 "asn1p_y.y"
+case 236:
+#line 1814 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(asn1p_lineno);
 		checkmem(yyval.a_expr);
@@ -3088,8 +3134,8 @@
 		yyval.a_expr->value = yyvsp[-1].a_value;
 	;
     break;}
-case 234:
-#line 1811 "asn1p_y.y"
+case 237:
+#line 1822 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(asn1p_lineno);
 		checkmem(yyval.a_expr);
@@ -3098,8 +3144,8 @@
 		yyval.a_expr->value = yyvsp[0].a_value;
 	;
     break;}
-case 235:
-#line 1818 "asn1p_y.y"
+case 238:
+#line 1829 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(asn1p_lineno);
 		checkmem(yyval.a_expr);
@@ -3109,86 +3155,86 @@
 		yyval.a_expr->meta_type = AMT_VALUE;
 	;
     break;}
-case 236:
-#line 1829 "asn1p_y.y"
-{
-		yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int);
-		checkmem(yyval.a_value);
-	;
-    break;}
-case 237:
-#line 1833 "asn1p_y.y"
-{
-		yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int);
-		checkmem(yyval.a_value);
-	;
-    break;}
-case 238:
-#line 1864 "asn1p_y.y"
-{ memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); ;
-    break;}
 case 239:
-#line 1865 "asn1p_y.y"
-{ yyval.a_tag = yyvsp[0].a_tag; ;
+#line 1840 "asn1p_y.y"
+{
+		yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int);
+		checkmem(yyval.a_value);
+	;
     break;}
 case 240:
-#line 1869 "asn1p_y.y"
+#line 1844 "asn1p_y.y"
+{
+		yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int);
+		checkmem(yyval.a_value);
+	;
+    break;}
+case 241:
+#line 1875 "asn1p_y.y"
+{ memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); ;
+    break;}
+case 242:
+#line 1876 "asn1p_y.y"
+{ yyval.a_tag = yyvsp[0].a_tag; ;
+    break;}
+case 243:
+#line 1880 "asn1p_y.y"
 {
 		yyval.a_tag = yyvsp[0].a_tag;
 		yyval.a_tag.tag_mode = TM_DEFAULT;
 	;
     break;}
-case 241:
-#line 1873 "asn1p_y.y"
+case 244:
+#line 1884 "asn1p_y.y"
 {
 		yyval.a_tag = yyvsp[-1].a_tag;
 		yyval.a_tag.tag_mode = TM_IMPLICIT;
 	;
     break;}
-case 242:
-#line 1877 "asn1p_y.y"
+case 245:
+#line 1888 "asn1p_y.y"
 {
 		yyval.a_tag = yyvsp[-1].a_tag;
 		yyval.a_tag.tag_mode = TM_EXPLICIT;
 	;
     break;}
-case 243:
-#line 1884 "asn1p_y.y"
-{
-		checkmem(yyvsp[0].tv_str);
-		yyval.tv_str = yyvsp[0].tv_str;
-	;
-    break;}
-case 244:
-#line 1888 "asn1p_y.y"
-{
-		checkmem(yyvsp[0].tv_str);
-		yyval.tv_str = yyvsp[0].tv_str;
-	;
-    break;}
-case 245:
-#line 1896 "asn1p_y.y"
-{
-		checkmem(yyvsp[0].tv_str);
-		yyval.tv_str = yyvsp[0].tv_str;
-	;
-    break;}
 case 246:
-#line 1903 "asn1p_y.y"
+#line 1895 "asn1p_y.y"
 {
 		checkmem(yyvsp[0].tv_str);
 		yyval.tv_str = yyvsp[0].tv_str;
 	;
     break;}
 case 247:
-#line 1910 "asn1p_y.y"
+#line 1899 "asn1p_y.y"
+{
+		checkmem(yyvsp[0].tv_str);
+		yyval.tv_str = yyvsp[0].tv_str;
+	;
+    break;}
+case 248:
+#line 1907 "asn1p_y.y"
+{
+		checkmem(yyvsp[0].tv_str);
+		yyval.tv_str = yyvsp[0].tv_str;
+	;
+    break;}
+case 249:
+#line 1914 "asn1p_y.y"
+{
+		checkmem(yyvsp[0].tv_str);
+		yyval.tv_str = yyvsp[0].tv_str;
+	;
+    break;}
+case 250:
+#line 1921 "asn1p_y.y"
 {
 		memset(&yyval.tv_nametag, 0, sizeof(yyval.tv_nametag));
 		yyval.tv_nametag.name = yyvsp[0].tv_str;
 	;
     break;}
-case 248:
-#line 1914 "asn1p_y.y"
+case 251:
+#line 1925 "asn1p_y.y"
 {
 		yyval.tv_nametag.name = yyvsp[-1].tv_str;
 		yyval.tv_nametag.tag = yyvsp[0].a_tag;
@@ -3416,7 +3462,7 @@
     }
   return 1;
 }
-#line 1921 "asn1p_y.y"
+#line 1932 "asn1p_y.y"
 
 
 
diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y
index a77b5fd..3e71250 100644
--- a/libasn1parser/asn1p_y.y
+++ b/libasn1parser/asn1p_y.y
@@ -218,9 +218,8 @@
 %type	<a_xports>		ExportsBody
 %type	<a_expr>		ImportsElement
 %type	<a_expr>		ExportsElement
-%type	<a_expr>		DataTypeMember
 %type	<a_expr>		ExtensionAndException
-%type	<a_expr>		UnconstrainedTypeDeclaration
+%type	<a_expr>		TypeDeclaration
 %type	<a_ref>			ComplexTypeReference
 %type	<a_ref>			ComplexTypeReferenceAmpList
 %type	<a_refcomp>		ComplexTypeReferenceElement
@@ -229,7 +228,7 @@
 %type	<a_expr>		ClassFieldList
 %type	<a_expr>		ClassField
 %type	<a_expr>		ClassDeclaration
-%type	<a_expr>		ConstrainedTypeDeclaration
+%type	<a_expr>		Type
 %type	<a_expr>		DataTypeReference	/* Type1 ::= Type2 */
 %type	<a_expr>		DefinedTypeRef
 %type	<a_expr>		ValueSetDefinition  /* Val INTEGER ::= {1|2} */
@@ -238,9 +237,10 @@
 %type	<a_value>		InlineOrDefinedValue
 %type	<a_value>		DefinedValue
 %type	<a_value>		SignedNumber
-%type	<a_expr>		ConstructedType
-%type	<a_expr>		ConstructedTypeConstrained
-%type	<a_expr>		ConstructedDataTypeDefinition
+%type	<a_expr>		ComponentTypeLists
+%type	<a_expr>		ComponentType
+%type	<a_expr>		AlternativeTypeLists
+%type	<a_expr>		AlternativeType
 //%type	<a_expr>		optUniverationDefinition
 %type	<a_expr>		UniverationDefinition
 %type	<a_expr>		UniverationList
@@ -718,7 +718,7 @@
 		$$->expr_type = A1TC_TYPEID;
 		$$->meta_type = AMT_TYPE;
 	}
-	| TypeRefName TOK_PPEQ optTag ConstrainedTypeDeclaration {
+	| TypeRefName TOK_PPEQ optTag Type {
 		$$ = $4;
 		$$->Identifier = $1;
 		$$->tag = $3;
@@ -741,8 +741,7 @@
 	 *   }
 	 * === EOF ===
 	 */
-	| TypeRefName '{' ParameterArgumentList '}'
-		TOK_PPEQ ConstrainedTypeDeclaration {
+	| TypeRefName '{' ParameterArgumentList '}' TOK_PPEQ Type {
 		$$ = $6;
 		assert($$->Identifier == 0);
 		$$->Identifier = $1;
@@ -806,7 +805,7 @@
 	;
 
 ActualParameter:
-	UnconstrainedTypeDeclaration {
+	Type {
 		$$ = $1;
 	}
 	| Identifier {
@@ -821,18 +820,62 @@
 /*
  * A collection of constructed data type members.
  */
-ConstructedDataTypeDefinition:
-	DataTypeMember {
+ComponentTypeLists:
+	ComponentType {
 		$$ = asn1p_expr_new(yylineno);
 		checkmem($$);
 		TQ_ADD(&($$->members), $1, next);
 	}
-	| ConstructedDataTypeDefinition ',' DataTypeMember {
+	| ComponentTypeLists ',' ComponentType {
 		$$ = $1;
 		TQ_ADD(&($$->members), $3, next);
 	}
 	;
 
+ComponentType:
+	TaggedIdentifier Type optMarker {
+		$$ = $2;
+		assert($$->Identifier == 0);
+		$$->Identifier = $1.name;
+		$$->tag = $1.tag;
+		$$->marker = $3;
+	}
+	| TOK_COMPONENTS TOK_OF Type {
+		$$ = asn1p_expr_new(yylineno);
+		checkmem($$);
+		$$->meta_type = $3->meta_type;
+		$$->expr_type = A1TC_COMPONENTS_OF;
+		TQ_ADD(&($$->members), $3, next);
+	}
+	| ExtensionAndException {
+		$$ = $1;
+	}
+	;
+
+AlternativeTypeLists:
+	AlternativeType {
+		$$ = asn1p_expr_new(yylineno);
+		checkmem($$);
+		TQ_ADD(&($$->members), $1, next);
+	}
+	| AlternativeTypeLists ',' AlternativeType {
+		$$ = $1;
+		TQ_ADD(&($$->members), $3, next);
+	}
+	;
+
+AlternativeType:
+	TaggedIdentifier Type {
+		$$ = $2;
+		assert($$->Identifier == 0);
+		$$->Identifier = $1.name;
+		$$->tag = $1.tag;
+	}
+	| ExtensionAndException {
+		$$ = $1;
+	}
+	;
+
 ClassDeclaration:
 	TOK_CLASS '{' ClassFieldList '}' optWithSyntax {
 		$$ = $3;
@@ -871,10 +914,11 @@
 		$$->meta_type = AMT_OBJECTFIELD;
 		$$->marker = $2;
 	}
-	| ClassFieldIdentifier ConstrainedTypeDeclaration optUnique {
+	| ClassFieldIdentifier Type optMarker optUnique {
 		$$ = $2;
 		$$->Identifier = $1.name;
-		$$->unique = $3;
+		$$->marker = $3;
+		$$->unique = $4;
 	}
 	| ClassFieldIdentifier ClassFieldIdentifier optMarker optUnique {
 		int ret;
@@ -935,50 +979,6 @@
 	}
 	;
 
-/*
- * A data type member goes like this
- * ===
- * memb1 [0] Type1 { a(1), b(2) } (2)
- * ===
- * Therefore, we propose a split.
- * ^^^^^^^^^ ^^^^^^^^^^
- * ^TaggedIdentifier  ^TypeDeclaration
- * 				^ConstrainedTypeDeclaration
- */
-
-/*
- * A member of a constructed data type ("a" or "b" in above example).
- */
-DataTypeMember:
-	TaggedIdentifier ConstrainedTypeDeclaration {
-		$$ = $2;
-		assert($$->Identifier == 0);
-		$$->Identifier = $1.name;
-		$$->tag = $1.tag;
-	}
-	| ExtensionAndException {
-		$$ = $1;
-	}
-	;
-
-ConstrainedTypeDeclaration:
-	UnconstrainedTypeDeclaration optConstraints optMarker {
-		$$ = $1;
-		if($$->constraints) {
-			assert(!$2);
-		} else {
-			$$->constraints = $2;
-		}
-		$$->marker = $3;
-	}
-	| ConstructedTypeConstrained {
-		/* This type includes constraints on its own */
-		$$ = $1;
-		checkmem($$);
-		assert($$->meta_type);
-	}
-	;
-
 ExtensionAndException:
 	TOK_ThreeDots {
 		$$ = asn1p_expr_new(asn1p_lineno);
@@ -1008,7 +1008,28 @@
 	}
 	;
 
-UnconstrainedTypeDeclaration:
+Type:
+	TypeDeclaration optConstraints {
+		$$ = $1;
+		/*
+		 * Outer constraint for SEQUENCE OF and SET OF applies
+		 * to the inner type.
+		 */
+		if($$->expr_type == ASN_CONSTR_SEQUENCE_OF
+		|| $$->expr_type == ASN_CONSTR_SET_OF) {
+			assert(!TQ_FIRST(&($$->members))->constraints);
+			TQ_FIRST(&($$->members))->constraints = $2;
+		} else {
+			if($$->constraints) {
+				assert(!$2);
+			} else {
+				$$->constraints = $2;
+			}
+		}
+	}
+	;
+
+TypeDeclaration:
 	BasicType {
 		$$ = $1;
 	}
@@ -1018,11 +1039,58 @@
 		$$->expr_type = $1;
 		$$->meta_type = AMT_TYPE;
 	}
-	| ConstructedType {
-		$$ = $1;
-		checkmem($$);
-		assert($$->meta_type);
+	| TOK_CHOICE '{' AlternativeTypeLists '}'	{
+		$$ = $3;
+		assert($$->expr_type == A1TC_INVALID);
+		$$->expr_type = ASN_CONSTR_CHOICE;
+		$$->meta_type = AMT_TYPE;
 	}
+	| TOK_SEQUENCE '{' ComponentTypeLists '}'	{
+		$$ = $3;
+		assert($$->expr_type == A1TC_INVALID);
+		$$->expr_type = ASN_CONSTR_SEQUENCE;
+		$$->meta_type = AMT_TYPE;
+	}
+	| TOK_SET '{' ComponentTypeLists '}'		{
+		$$ = $3;
+		assert($$->expr_type == A1TC_INVALID);
+		$$->expr_type = ASN_CONSTR_SET;
+		$$->meta_type = AMT_TYPE;
+	}
+	| TOK_SEQUENCE optConstraints TOK_OF TypeDeclaration {
+		$$ = asn1p_expr_new(asn1p_lineno);
+		checkmem($$);
+		$$->constraints = $2;
+		$$->expr_type = ASN_CONSTR_SEQUENCE_OF;
+		$$->meta_type = AMT_TYPE;
+		TQ_ADD(&($$->members), $4, next);
+	}
+	| TOK_SET optConstraints TOK_OF TypeDeclaration {
+		$$ = asn1p_expr_new(asn1p_lineno);
+		checkmem($$);
+		$$->constraints = $2;
+		$$->expr_type = ASN_CONSTR_SET_OF;
+		$$->meta_type = AMT_TYPE;
+		TQ_ADD(&($$->members), $4, next);
+	}
+	| TOK_ANY 					{
+		$$ = asn1p_expr_new(asn1p_lineno);
+		checkmem($$);
+		$$->expr_type = ASN_CONSTR_ANY;
+		$$->meta_type = AMT_TYPE;
+	}
+	| TOK_ANY TOK_DEFINED TOK_BY Identifier		{
+		int ret;
+		$$ = asn1p_expr_new(asn1p_lineno);
+		checkmem($$);
+		$$->reference = asn1p_ref_new(yylineno);
+		ret = asn1p_ref_add_component($$->reference,
+			$4, RLT_lowercase);
+		checkmem(ret == 0);
+		$$->expr_type = ASN_CONSTR_ANY;
+		$$->meta_type = AMT_TYPE;
+	}
+	;
 	/*
 	 * A parametrized assignment.
 	 */
@@ -1332,63 +1400,6 @@
 	;
 
 
-ConstructedTypeConstrained:
-	TOK_SEQUENCE optConstraints TOK_OF ConstrainedTypeDeclaration {
-		$$ = asn1p_expr_new(asn1p_lineno);
-		checkmem($$);
-		$$->constraints = $2;
-		$$->expr_type = ASN_CONSTR_SEQUENCE_OF;
-		$$->meta_type = AMT_TYPE;
-		TQ_ADD(&($$->members), $4, next);
-	}
-	| TOK_SET optConstraints TOK_OF ConstrainedTypeDeclaration {
-		$$ = asn1p_expr_new(asn1p_lineno);
-		checkmem($$);
-		$$->constraints = $2;
-		$$->expr_type = ASN_CONSTR_SET_OF;
-		$$->meta_type = AMT_TYPE;
-		TQ_ADD(&($$->members), $4, next);
-	}
-	;
-
-ConstructedType:
-	TOK_CHOICE '{' ConstructedDataTypeDefinition '}'	{
-		$$ = $3;
-		assert($$->expr_type == A1TC_INVALID);
-		$$->expr_type = ASN_CONSTR_CHOICE;
-		$$->meta_type = AMT_TYPE;
-	}
-	| TOK_SEQUENCE '{' ConstructedDataTypeDefinition '}'	{
-		$$ = $3;
-		assert($$->expr_type == A1TC_INVALID);
-		$$->expr_type = ASN_CONSTR_SEQUENCE;
-		$$->meta_type = AMT_TYPE;
-	}
-	| TOK_SET '{' ConstructedDataTypeDefinition '}'		{
-		$$ = $3;
-		assert($$->expr_type == A1TC_INVALID);
-		$$->expr_type = ASN_CONSTR_SET;
-		$$->meta_type = AMT_TYPE;
-	}
-	| TOK_ANY 						{
-		$$ = asn1p_expr_new(asn1p_lineno);
-		checkmem($$);
-		$$->expr_type = ASN_CONSTR_ANY;
-		$$->meta_type = AMT_TYPE;
-	}
-	| TOK_ANY TOK_DEFINED TOK_BY Identifier			{
-		int ret;
-		$$ = asn1p_expr_new(asn1p_lineno);
-		checkmem($$);
-		$$->reference = asn1p_ref_new(yylineno);
-		ret = asn1p_ref_add_component($$->reference,
-			$4, RLT_lowercase);
-		checkmem(ret == 0);
-		$$->expr_type = ASN_CONSTR_ANY;
-		$$->meta_type = AMT_TYPE;
-	}
-	;
-
 /*
  * Data type constraints.
  */
diff --git a/libasn1parser/asn1parser.c b/libasn1parser/asn1parser.c
index b5d9e1e..6a3477d 100644
--- a/libasn1parser/asn1parser.c
+++ b/libasn1parser/asn1parser.c
@@ -17,7 +17,7 @@
 extern int asn1p_lineno;
 
 static int _asn1p_set_flags(enum asn1p_flags flags);
-static int _asn1p_assign_filename(asn1p_t *a, const char *fname);
+static int _asn1p_fix_modules(asn1p_t *a, const char *fname);
 
 /*
  * Parse the given buffer.
@@ -52,7 +52,7 @@
 
 	if(ret == 0) {
 		assert(a);
-		if(_asn1p_assign_filename(a, "-"))
+		if(_asn1p_fix_modules(a, "-"))
 			return NULL;	/* FIXME: destroy (a) */
 	} else {
 		assert(a == NULL);
@@ -104,7 +104,7 @@
 
 	if(ret == 0) {
 		assert(a);
-		if(_asn1p_assign_filename(a, filename))
+		if(_asn1p_fix_modules(a, filename))
 			return NULL;	/* FIXME: destroy (a) */
 	} else {
 		assert(a == NULL);
@@ -159,13 +159,38 @@
 	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);
+	}
+}
+
 static int
-_asn1p_assign_filename(asn1p_t *a, const char *fname) {
+_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);
+		}
 	}
 	return 0;
 }
+
+