parsing WITH SYNTAX clauses

diff --git a/ChangeLog b/ChangeLog
index b140053..4766cb7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,9 +2,9 @@
 0.9.21:	2006-Mar-14
 
 	* skeletons/standard-modules directory is now used for standard types.
-	* Refactored system for parsing Information Object Classes.
 	* Fixed class field access problem (Test case 98)
 	  (Severity: medim; Security impact: none)
+	* Refactored system for parsing Information Object Classes.
 
 0.9.20:	2006-Mar-06
 
diff --git a/asn1c/asn1c.c b/asn1c/asn1c.c
index c097d55..cf1ecb9 100644
--- a/asn1c/asn1c.c
+++ b/asn1c/asn1c.c
@@ -129,8 +129,10 @@
 				exit(EX_USAGE);
 			}
 			asn1_compiler_flags |= A1C_PDU_AUTO;
+		} else if(strcmp(optarg, "rint-class-matrix") == 0) {
+			asn1_printer_flags |= APF_PRINT_CLASS_MATRIX;
 		} else if(strcmp(optarg, "rint-constraints") == 0) {
-			asn1_printer_flags |= APF_DEBUG_CONSTRAINTS;
+			asn1_printer_flags |= APF_PRINT_CONSTRAINTS;
 		} else if(strcmp(optarg, "rint-lines") == 0) {
 			asn1_printer_flags |= APF_LINE_COMMENTS;
 		} else {
@@ -459,6 +461,7 @@
 "\n"
 
 "  -print-constraints    Explain subtype constraints (debug)\n"
+"  -print-class-matrix   Print out the collected object class matrix (debug)\n"
 "  -print-lines          Generate \"-- #line\" comments in -E output\n"
 
 	,
diff --git a/libasn1fix/asn1fix.c b/libasn1fix/asn1fix.c
index dbe18c2..21a5621 100644
--- a/libasn1fix/asn1fix.c
+++ b/libasn1fix/asn1fix.c
@@ -188,8 +188,9 @@
 			/* Do not process the parametrized type just yet */
 			continue;
 
-		DEBUG("=== Now processing \"%s\" at line %d ===",
-			expr->Identifier, expr->_lineno);
+		DEBUG("=== Now processing \"%s\" (%d/0x%x) at line %d ===",
+			expr->Identifier, expr->meta_type, expr->expr_type,
+			expr->_lineno);
 		assert(expr->meta_type != AMT_INVALID);
 
 		/*
@@ -223,9 +224,10 @@
 		RET2RVAL(ret, rvalue);
 
 		/*
-		 * Parse WITH SYNTAX in CLASSes.
+		 * Parse class objects and fill up the object class with data.
 		 */
-		ret = asn1f_parse_class_with_syntax(arg);
+		ret = asn1f_parse_class_object(arg);
+		RET2RVAL(ret, rvalue);
 
 		/*
 		 * Resolve references in constraints.
@@ -294,6 +296,9 @@
 	int ret;
 
 	TQ_FOR(expr, &(arg->mod->members), next) {
+	}
+
+	TQ_FOR(expr, &(arg->mod->members), next) {
 		arg->expr = expr;
 
 		if(expr->meta_type == AMT_PARAMTYPE)
diff --git a/libasn1fix/asn1fix_cws.c b/libasn1fix/asn1fix_cws.c
index a605c24..3d7b8aa 100644
--- a/libasn1fix/asn1fix_cws.c
+++ b/libasn1fix/asn1fix_cws.c
@@ -1,15 +1,226 @@
 #include "asn1fix_internal.h"
 #include "asn1fix_cws.h"
 
-int
-asn1f_parse_class_with_syntax(arg_t *arg) {
-	asn1p_expr_t *expr = arg->expr;
+static int _asn1f_parse_class_object_data(arg_t *, asn1p_expr_t *eclass,
+		struct asn1p_ioc_row_s *row, asn1p_wsyntx_t *syntax,
+		uint8_t *buf, const uint8_t *bend,
+		int optional_mode, uint8_t **newpos);
+static int _asn1f_assign_cell_value(arg_t *arg, struct asn1p_ioc_row_s *row, struct asn1p_ioc_cell_s *cell, uint8_t *buf, const uint8_t *bend);
 
-	if(expr->expr_type != A1TC_CLASSDEF
-	|| expr->with_syntax == NULL)
+int
+asn1f_parse_class_object(arg_t *arg) {
+	asn1p_expr_t *expr = arg->expr;
+	asn1p_expr_t *eclass;
+	asn1p_ioc_row_t *row;
+	void *new_rows_ptr;
+	int ret;
+
+	if(expr->meta_type != AMT_VALUE
+	|| expr->expr_type != A1TC_REFERENCE
+	|| !expr->value
+	|| expr->value->type != ATV_UNPARSED)
 		return 0;
 
-	DEBUG("Class %s: checking WITH SYNTAX", expr->Identifier);
+	/*
+	 * Find the governing class.
+	 */
+	eclass = asn1f_find_terminal_type(arg, expr);
+	if(!eclass
+	|| eclass->meta_type != AMT_OBJECTCLASS
+	|| eclass->expr_type != A1TC_CLASSDEF) {
+		return 0;
+	}
+
+	DEBUG("Value %s of CLASS %s found at line %d",
+		expr->Identifier, eclass->Identifier, expr->_lineno);
+
+	if(!eclass->with_syntax) {
+		DEBUG("Can't process classes without WITH SYNTAX just yet");
+		return 0;
+	}
+
+	row = asn1p_ioc_row_new(eclass);
+	assert(row);
+
+	ret = _asn1f_parse_class_object_data(arg, eclass, row,
+		eclass->with_syntax,
+		expr->value->value.string.buf + 1,
+		expr->value->value.string.buf
+			+ expr->value->value.string.size - 1,
+		0, 0);
+	if(ret) {
+		LOG((ret < 0),
+			"Cannot parse %s of CLASS %s found at line %d",
+			expr->Identifier, eclass->Identifier, expr->_lineno);
+		asn1p_ioc_row_delete(row);
+		return ret;
+	}
+
+	new_rows_ptr = realloc(eclass->object_class_matrix.row,
+			(eclass->object_class_matrix.rows + 1)
+			* sizeof(eclass->object_class_matrix.row[0]));
+	assert(new_rows_ptr);
+	eclass->object_class_matrix.row = new_rows_ptr;
+	eclass->object_class_matrix.row[eclass->object_class_matrix.rows] = row;
+	eclass->object_class_matrix.rows++;
+	/* Propagate max identifier length */
+	if(eclass->object_class_matrix.max_identifier_length
+			< row->max_identifier_length)
+		eclass->object_class_matrix.max_identifier_length
+			= row->max_identifier_length;
 
 	return 0;
 }
+
+#define	SKIPSPACES	for(; buf < bend && isspace(*buf); buf++)
+
+static int
+_asn1f_parse_class_object_data(arg_t *arg, asn1p_expr_t *eclass,
+		struct asn1p_ioc_row_s *row, asn1p_wsyntx_t *syntax,
+		uint8_t *buf, const uint8_t *bend,
+		int optional_mode, uint8_t **newpos) {
+	struct asn1p_wsyntx_chunk_s *chunk;
+	int ret;
+
+	TQ_FOR(chunk, (&syntax->chunks), next) {
+		switch(chunk->type) {
+		case WC_LITERAL: {
+			int token_len = strlen(chunk->content.token);
+			SKIPSPACES;
+			if(bend - buf < token_len
+			|| memcmp(buf, chunk->content.token, token_len)) {
+				if(!optional_mode) {
+					FATAL("While parsing object class value %s at line %d: Expected: \"%s\", found: \"%s\"",
+					arg->expr->Identifier, arg->expr->_lineno, chunk->content.token, buf);
+				}
+				if(newpos) *newpos = buf;
+				return -1;
+			}
+			buf += token_len;
+		    } break;
+		case WC_WHITESPACE: break;	/* Ignore whitespace */
+		case WC_FIELD: {
+			struct asn1p_ioc_cell_s *cell;
+			uint8_t *p;
+			SKIPSPACES;
+			int lbraces = 0;
+			p = buf;
+			if(p < bend && *p == '{')
+				lbraces = 1, p++;
+			for(; p < bend; p++) {
+				if(lbraces) {
+					/* Search the terminating brace */
+					switch(*p) {
+					case '}': lbraces--; break;
+					case '{': lbraces++; break;
+					}
+				} else if(isspace(*p)) {
+					break;
+				}
+			}
+			if(lbraces) {
+				FATAL("Field reference %s found in class value definition for %s at line %d can not be satisfied by broken value \"%s\"",
+				chunk->content.token,
+				arg->expr->Identifier, arg->expr->_lineno, buf);
+				if(newpos) *newpos = buf;
+				return -1;
+			}
+			cell = asn1p_ioc_row_cell_fetch(row,
+					chunk->content.token);
+			if(cell == NULL) {
+				FATAL("Field reference %s found in WITH SYNAX {} clause does not match actual field in Object Class %s",
+					chunk->content.token,
+					eclass->Identifier, eclass->_lineno);
+				if(newpos) *newpos = buf;
+				return -1;
+			}
+			DEBUG("Reference %s satisfied by %s (%d)",
+				chunk->content.token,
+				buf, p - buf);
+			ret = _asn1f_assign_cell_value(arg, row, cell, buf, p);
+			if(ret) {
+				if(newpos) *newpos = buf;
+				return ret;
+			}
+			buf = p;
+		    } break;
+		case WC_OPTIONALGROUP: {
+			uint8_t *np = 0;
+			SKIPSPACES;
+			ret = _asn1f_parse_class_object_data(arg, eclass, row,
+				chunk->content.syntax, buf, bend, 1, &np);
+			if(newpos) *newpos = np;
+			if(ret && np != buf)
+				return ret;
+		    } break;
+		}
+	}
+
+
+	if(newpos) *newpos = buf;
+	return 0;
+}
+
+
+static int
+_asn1f_assign_cell_value(arg_t *arg, struct asn1p_ioc_row_s *row, struct asn1p_ioc_cell_s *cell,
+		uint8_t *buf, const uint8_t *bend) {
+	asn1p_expr_t *expr;
+	asn1p_ref_t *ref;
+	char *p;
+
+	if((bend - buf) <= 0) {
+		FATAL("Assignment warning: empty string is being assigned into %s for %s at line %d",
+			cell->field->Identifier,
+			arg->expr->Identifier, arg->expr->_lineno);
+		return -1;
+	}
+
+	p = malloc(bend - buf + 1);
+	assert(p);
+	memcpy(p, buf, bend - buf);
+	p[bend - buf] = '\0';
+
+	if(!isalpha(*p)) {
+
+		if(isdigit(*p)) {
+			asn1c_integer_t value;
+			if(asn1p_atoi(p, &value)) {
+				FATAL("Value %s at line %d is too large for this compiler! Please contact the asn1c author.\n", p, arg->expr->_lineno);
+				return -1;
+			}
+			expr = asn1p_expr_new(arg->expr->_lineno);
+			expr->Identifier = p;
+			expr->meta_type = AMT_VALUE; 
+			expr->expr_type = ASN_BASIC_INTEGER;
+			expr->value = asn1p_value_fromint(value);
+		} else {
+			WARNING("asn1c is not yet able to parse arbitrary direct values; please convert %s at line %d to a reference.", p, arg->expr->_lineno);
+			free(p);
+			return 1;
+		}
+	} else {
+		ref = asn1p_ref_new(arg->expr->_lineno);
+		asn1p_ref_add_component(ref, p, RLT_UNKNOWN);
+		assert(ref);
+	
+		expr = asn1f_lookup_symbol(arg, arg->mod, ref);
+		if(!expr) {
+			FATAL("Cannot find %s referenced by %s at line %d",
+				p, arg->expr->Identifier,
+				arg->expr->_lineno);
+			return -1;
+		}
+	}
+
+	DEBUG("Field %s assignment of %s got %s",
+		cell->field->Identifier, p, expr->Identifier);
+
+	cell->value = expr;
+
+	if(row->max_identifier_length < strlen(expr->Identifier))
+		row->max_identifier_length = strlen(expr->Identifier);
+
+	return 0;
+}
+
diff --git a/libasn1fix/asn1fix_cws.h b/libasn1fix/asn1fix_cws.h
index 25fd208..aa76b49 100644
--- a/libasn1fix/asn1fix_cws.h
+++ b/libasn1fix/asn1fix_cws.h
@@ -2,9 +2,8 @@
 #define	_ASN1FIX_CLASS_WITH_SYNTAX_H_
 
 /*
- * CLASS may contain the "WITH SYNTAX" clause, in which case we are
- * going to parse it.
+ * Parse class objects
  */
-int asn1f_parse_class_with_syntax(arg_t *arg);
+int asn1f_parse_class_object(arg_t *arg);
 
 #endif	/* _ASN1FIX_CLASS_WITH_SYNTAX_H_ */
diff --git a/libasn1parser/asn1p_class.c b/libasn1parser/asn1p_class.c
index c9065f6..585ec93 100644
--- a/libasn1parser/asn1p_class.c
+++ b/libasn1parser/asn1p_class.c
@@ -6,6 +6,61 @@
 
 #include "asn1parser.h"
 
+asn1p_ioc_row_t *
+asn1p_ioc_row_new(asn1p_expr_t *oclass) {
+	asn1p_ioc_row_t *row;
+	asn1p_expr_t *field;
+	int columns = 0;
+
+	assert(oclass->expr_type == A1TC_CLASSDEF);
+
+	row = calloc(1, sizeof *row);
+	if(!row) return NULL;
+
+	TQ_FOR(field, &oclass->members, next)
+		columns++;
+
+	row->column = calloc(columns, sizeof *row->column);
+	if(!row->column) {
+		free(row);
+		return NULL;
+	}
+	row->columns = columns;
+
+	columns = 0;
+	TQ_FOR(field, &oclass->members, next) {
+		int fieldIdLen = strlen(field->Identifier);
+		if(fieldIdLen > row->max_identifier_length)
+			row->max_identifier_length = fieldIdLen;
+		row->column[columns].field = field;
+		row->column[columns].value = NULL;
+		columns++;
+	}
+
+	return row;
+}
+
+void
+asn1p_ioc_row_delete(asn1p_ioc_row_t *row) {
+	if(row) {
+		if(row->column) {
+			free(row->column);
+		}
+		free(row);
+	}
+}
+
+struct asn1p_ioc_cell_s *
+asn1p_ioc_row_cell_fetch(asn1p_ioc_row_t *row, const char *fieldname) {
+	int i;
+	for(i = 0; i < row->columns; i++) {
+		if(strcmp(row->column[i].field->Identifier, fieldname) == 0)
+			return &row->column[i];
+	}
+	errno = ESRCH;
+	return NULL;
+}
+
 asn1p_wsyntx_chunk_t *
 asn1p_wsyntx_chunk_new() {
 	asn1p_wsyntx_chunk_t *wc;
@@ -21,8 +76,8 @@
 		switch(wc->type) {
 		case WC_LITERAL:
 		case WC_WHITESPACE:
+		case WC_FIELD:
 			free(wc->content.token); break;
-		case WC_REFERENCE: asn1p_ref_free(wc->content.ref); break;
 		case WC_OPTIONALGROUP:
 			asn1p_wsyntx_free(wc->content.syntax);
 			break;
@@ -41,12 +96,10 @@
 		switch(wc->type) {
 		case WC_LITERAL:
 		case WC_WHITESPACE:
+		case WC_FIELD:
 			nc->content.token = malloc(strlen(wc->content.token)+1);
 			strcpy(nc->content.token, wc->content.token);
 			break;
-		case WC_REFERENCE:
-			nc->content.ref = asn1p_ref_clone(wc->content.ref);
-			break;
 		case WC_OPTIONALGROUP:
 			nc->content.syntax = asn1p_wsyntx_clone(wc->content.syntax);
 			break;
@@ -101,26 +154,6 @@
 }
 
 asn1p_wsyntx_chunk_t *
-asn1p_wsyntx_chunk_fromref(asn1p_ref_t *ref, int do_copy) {
-	asn1p_wsyntx_chunk_t *wc;
-
-	if(do_copy) {
-		static asn1p_wsyntx_chunk_t tmp;
-		tmp.type = WC_REFERENCE;
-		tmp.content.ref = ref;
-		wc = asn1p_wsyntx_chunk_clone(&tmp);
-	} else {
-		wc = asn1p_wsyntx_chunk_new();
-		if(wc) {
-			wc->type = WC_REFERENCE;
-			wc->content.ref = ref;
-		}
-	}
-
-	return wc;
-}
-
-asn1p_wsyntx_chunk_t *
 asn1p_wsyntx_chunk_frombuf(char *buf, int len, int do_copy) {
 	asn1p_wsyntx_chunk_t *wc;
 
diff --git a/libasn1parser/asn1p_class.h b/libasn1parser/asn1p_class.h
index 06db2d1..5d55a73 100644
--- a/libasn1parser/asn1p_class.h
+++ b/libasn1parser/asn1p_class.h
@@ -6,6 +6,22 @@
 
 #include "asn1p_ref.h"
 
+struct asn1p_expr_s;	/* Forward declaration */
+
+typedef struct asn1p_ioc_row_s {
+	struct asn1p_ioc_cell_s {
+		struct asn1p_expr_s *field;	/* may never be NULL */
+		struct asn1p_expr_s *value;	/* may be left uninitialized */
+	} *column;
+	int columns;
+	int max_identifier_length;
+} asn1p_ioc_row_t;
+
+asn1p_ioc_row_t *asn1p_ioc_row_new(struct asn1p_expr_s *oclass);
+void asn1p_ioc_row_delete(asn1p_ioc_row_t *);
+struct asn1p_ioc_cell_s *asn1p_ioc_row_cell_fetch(asn1p_ioc_row_t *,
+		const char *fieldname);
+
 /*
  * WITH SYNTAX free-form chunks.
  */
@@ -13,18 +29,17 @@
 	enum {
 		WC_LITERAL,
 		WC_WHITESPACE,
-		WC_REFERENCE,
+		WC_FIELD,
 		WC_OPTIONALGROUP
 	} type;
 	/*
 	 * WC_LITERAL -> {token}
 	 * WC_WHITESPACE -> {token}
-	 * WC_REFERENCE -> {ref}
+	 * WC_FIELD -> {token}
 	 * WC_OPTIONALGROUP -> {syntax}
 	 */
 	union {
-		char	*token;
-		asn1p_ref_t *ref;
+		char *token;
 		struct asn1p_wsyntx_s *syntax;
 	} content;
 
@@ -54,7 +69,6 @@
  * 	 0:	Component has been added
  * 	-1:	Failure to add component (refer to errno)
  */
-asn1p_wsyntx_chunk_t *asn1p_wsyntx_chunk_fromref(asn1p_ref_t *ref, int do_copy);
 asn1p_wsyntx_chunk_t *asn1p_wsyntx_chunk_frombuf(char *buf, int len, int _copy);
 asn1p_wsyntx_chunk_t *asn1p_wsyntx_chunk_fromsyntax(asn1p_wsyntx_t *syntax);
 
diff --git a/libasn1parser/asn1p_expr.h b/libasn1parser/asn1p_expr.h
index 6bcaa58..bc5abf7 100644
--- a/libasn1parser/asn1p_expr.h
+++ b/libasn1parser/asn1p_expr.h
@@ -163,6 +163,13 @@
 	 */
 	asn1p_wsyntx_t *with_syntax;
 
+	/* Information Object Class matrix, specific for this class */
+	struct asn1p_ioc_matrix_s {
+		asn1p_ioc_row_t **row;
+		int rows;
+		int max_identifier_length;
+	} object_class_matrix;
+
 	/*
 	 * A tag.
 	 */
diff --git a/libasn1parser/asn1p_l.c b/libasn1parser/asn1p_l.c
index 569bc73..d4f152f 100644
--- a/libasn1parser/asn1p_l.c
+++ b/libasn1parser/asn1p_l.c
@@ -1763,21 +1763,21 @@
 
 static yyconst short int yy_rule_linenum[137] =
     {   0,
-       94,   95,   97,  100,  102,  105,  107,  108,  109,  112,
-      114,  115,  116,  128,  135,  142,  148,  157,  165,  173,
-      174,  176,  195,  201,  202,  203,  204,  205,  208,  214,
-      221,  228,  235,  242,  243,  244,  252,  253,  254,  255,
-      256,  261,  262,  263,  264,  265,  266,  267,  268,  269,
-      270,  271,  280,  281,  282,  283,  284,  285,  286,  287,
-      288,  289,  290,  291,  292,  293,  294,  295,  296,  297,
-      298,  299,  300,  301,  302,  303,  304,  305,  306,  307,
-      308,  309,  310,  311,  312,  313,  314,  315,  316,  317,
-      318,  319,  320,  321,  322,  323,  324,  325,  326,  327,
+       95,   96,   98,  101,  103,  106,  108,  109,  110,  113,
+      115,  116,  117,  129,  136,  143,  149,  158,  166,  174,
+      175,  177,  196,  202,  203,  204,  205,  206,  209,  215,
+      222,  229,  236,  243,  244,  245,  253,  254,  255,  256,
+      257,  262,  263,  264,  265,  266,  267,  268,  269,  270,
+      271,  272,  281,  282,  283,  284,  285,  286,  287,  288,
+      289,  290,  291,  292,  293,  294,  295,  296,  297,  298,
+      299,  300,  301,  302,  303,  304,  305,  306,  307,  308,
+      309,  310,  311,  312,  313,  314,  315,  316,  317,  318,
+      319,  320,  321,  322,  323,  324,  325,  326,  327,  328,
 
-      328,  329,  330,  331,  332,  333,  334,  335,  336,  337,
-      342,  343,  348,  349,  350,  353,  358,  364,  372,  382,
-      387,  389,  390,  394,  399,  404,  410,  411,  413,  419,
-      432,  435,  460,  504,  506,  517
+      329,  330,  331,  332,  333,  334,  335,  336,  337,  338,
+      343,  344,  349,  350,  351,  354,  359,  365,  373,  383,
+      388,  390,  391,  395,  400,  405,  411,  412,  414,  420,
+      433,  436,  461,  505,  507,  518
     } ;
 
 static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr;
@@ -1821,10 +1821,11 @@
 int asn1p_lexer_pedantic_1990 = 0;
 int asn1p_lexer_types_year = 0;
 int asn1p_lexer_constructs_year = 0;
-static asn1c_integer_t asn1p_atoi(char *ptr); /* errno is either 0 or ERANGE */
 
 int asn1p_as_pointer;
 
+static asn1c_integer_t _lex_atoi(const char *ptr);
+
 /*
  * Check that the type is defined in the year of the standard choosen.
  */
@@ -1883,7 +1884,7 @@
 
 /* Newline */
 /* White-space */
-#line 1887 "asn1p_l.c"
+#line 1888 "asn1p_l.c"
 
 /* Macros after this point can all be overridden by user definitions in
  * section 1.
@@ -2034,10 +2035,10 @@
 	register char *yy_cp, *yy_bp;
 	register int yy_act;
 
-#line 92 "asn1p_l.l"
+#line 93 "asn1p_l.l"
 
 
-#line 2041 "asn1p_l.c"
+#line 2042 "asn1p_l.c"
 
 	if ( yy_init )
 		{
@@ -2148,7 +2149,7 @@
 yy_c_buf_p = yy_cp -= 1;
 YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
-#line 94 "asn1p_l.l"
+#line 95 "asn1p_l.l"
 /* Immediately terminated long comment */
 	YY_BREAK
 case 2:
@@ -2156,67 +2157,67 @@
 yy_c_buf_p = yy_cp -= 1;
 YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
-#line 95 "asn1p_l.l"
+#line 96 "asn1p_l.l"
 yy_push_state(idash_comment);	/* Incorrect, but acceptable */
 	YY_BREAK
 
 case 3:
 YY_RULE_SETUP
-#line 97 "asn1p_l.l"
+#line 98 "asn1p_l.l"
 yy_pop_state(); /* Acceptable end of comment */
 	YY_BREAK
 
 case 4:
 YY_RULE_SETUP
-#line 100 "asn1p_l.l"
+#line 101 "asn1p_l.l"
 asn1p_as_pointer = 1;
 	YY_BREAK
 case 5:
 YY_RULE_SETUP
-#line 102 "asn1p_l.l"
+#line 103 "asn1p_l.l"
 yy_push_state(dash_comment);
 	YY_BREAK
 
 case 6:
 YY_RULE_SETUP
-#line 105 "asn1p_l.l"
+#line 106 "asn1p_l.l"
 yy_pop_state();
 	YY_BREAK
 case 7:
 YY_RULE_SETUP
-#line 107 "asn1p_l.l"
+#line 108 "asn1p_l.l"
 yy_pop_state();	/* End of comment */
 	YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 108 "asn1p_l.l"
+#line 109 "asn1p_l.l"
 /* Eat single dash */
 	YY_BREAK
 case 9:
 YY_RULE_SETUP
-#line 109 "asn1p_l.l"
+#line 110 "asn1p_l.l"
 /* Eat */
 	YY_BREAK
 
 case 10:
 YY_RULE_SETUP
-#line 112 "asn1p_l.l"
+#line 113 "asn1p_l.l"
 yy_push_state(cpp_comment);
 	YY_BREAK
 
 case 11:
 YY_RULE_SETUP
-#line 114 "asn1p_l.l"
+#line 115 "asn1p_l.l"
 /* Eat */
 	YY_BREAK
 case 12:
 YY_RULE_SETUP
-#line 115 "asn1p_l.l"
+#line 116 "asn1p_l.l"
 yy_pop_state();
 	YY_BREAK
 case 13:
 YY_RULE_SETUP
-#line 116 "asn1p_l.l"
+#line 117 "asn1p_l.l"
 /* Eat */
 	YY_BREAK
 
@@ -2229,7 +2230,7 @@
 
 case 14:
 YY_RULE_SETUP
-#line 128 "asn1p_l.l"
+#line 129 "asn1p_l.l"
 {
 			yy_push_state(opaque);
 			asn1p_lval.tv_opaque.buf = strdup(yytext);
@@ -2239,7 +2240,7 @@
 	YY_BREAK
 case 15:
 YY_RULE_SETUP
-#line 135 "asn1p_l.l"
+#line 136 "asn1p_l.l"
 {
 			yy_pop_state();
 			asn1p_lval.tv_opaque.buf = strdup(yytext);
@@ -2249,7 +2250,7 @@
 	YY_BREAK
 case 16:
 YY_RULE_SETUP
-#line 142 "asn1p_l.l"
+#line 143 "asn1p_l.l"
 {
 			asn1p_lval.tv_opaque.buf = strdup(yytext);
 			asn1p_lval.tv_opaque.len = yyleng;
@@ -2258,7 +2259,7 @@
 	YY_BREAK
 case 17:
 YY_RULE_SETUP
-#line 148 "asn1p_l.l"
+#line 149 "asn1p_l.l"
 {
 			fprintf(stderr,
 				"ASN.1 Parser syncronization failure: "
@@ -2270,7 +2271,7 @@
 	YY_BREAK
 case 18:
 YY_RULE_SETUP
-#line 157 "asn1p_l.l"
+#line 158 "asn1p_l.l"
 {
 			asn1p_lval.tv_opaque.buf = strdup(yytext);
 			asn1p_lval.tv_opaque.len = yyleng;
@@ -2280,7 +2281,7 @@
 
 case 19:
 YY_RULE_SETUP
-#line 165 "asn1p_l.l"
+#line 166 "asn1p_l.l"
 {
 			asn1p_lval.tv_opaque.buf = 0;
 			asn1p_lval.tv_opaque.len = 0;
@@ -2291,17 +2292,17 @@
 
 case 20:
 YY_RULE_SETUP
-#line 173 "asn1p_l.l"
+#line 174 "asn1p_l.l"
 { QAPPEND(yytext, yyleng-1); }	/* Add a single quote */
 	YY_BREAK
 case 21:
 YY_RULE_SETUP
-#line 174 "asn1p_l.l"
+#line 175 "asn1p_l.l"
 { QAPPEND(yytext, yyleng); }
 	YY_BREAK
 case 22:
 YY_RULE_SETUP
-#line 176 "asn1p_l.l"
+#line 177 "asn1p_l.l"
 {
 			yy_pop_state();
 			/* Do not append last quote:
@@ -2322,7 +2323,7 @@
 
 case 23:
 YY_RULE_SETUP
-#line 195 "asn1p_l.l"
+#line 196 "asn1p_l.l"
 {
 			const char *s = "ENCODING-CONTROL";
 			const char *p = s + sizeof("ENCODING-CONTROL") - 2;
@@ -2332,33 +2333,33 @@
 	YY_BREAK
 case 24:
 YY_RULE_SETUP
-#line 201 "asn1p_l.l"
+#line 202 "asn1p_l.l"
 unput('D'); unput('N'); unput('E'); yy_pop_state();
 	YY_BREAK
 case 25:
 YY_RULE_SETUP
-#line 202 "asn1p_l.l"
+#line 203 "asn1p_l.l"
 
 	YY_BREAK
 case 26:
 YY_RULE_SETUP
-#line 203 "asn1p_l.l"
+#line 204 "asn1p_l.l"
 
 	YY_BREAK
 case 27:
 YY_RULE_SETUP
-#line 204 "asn1p_l.l"
+#line 205 "asn1p_l.l"
 /* Eat everything else */
 	YY_BREAK
 case 28:
 YY_RULE_SETUP
-#line 205 "asn1p_l.l"
+#line 206 "asn1p_l.l"
 
 	YY_BREAK
 
 case 29:
 YY_RULE_SETUP
-#line 208 "asn1p_l.l"
+#line 209 "asn1p_l.l"
 {
 		/* " \t\r\n" weren't allowed in ASN.1:1990. */
 		asn1p_lval.tv_str = yytext;
@@ -2367,7 +2368,7 @@
 	YY_BREAK
 case 30:
 YY_RULE_SETUP
-#line 214 "asn1p_l.l"
+#line 215 "asn1p_l.l"
 {
 		/* " \t\r\n" weren't allowed in ASN.1:1990. */
 		asn1p_lval.tv_str = strdup(yytext);
@@ -2376,9 +2377,9 @@
 	YY_BREAK
 case 31:
 YY_RULE_SETUP
-#line 221 "asn1p_l.l"
+#line 222 "asn1p_l.l"
 {
-		asn1p_lval.a_int = asn1p_atoi(yytext);
+		asn1p_lval.a_int = _lex_atoi(yytext);
 		if(errno == ERANGE)
 			return -1;
 		return TOK_number_negative;
@@ -2386,9 +2387,9 @@
 	YY_BREAK
 case 32:
 YY_RULE_SETUP
-#line 228 "asn1p_l.l"
+#line 229 "asn1p_l.l"
 {
-		asn1p_lval.a_int = asn1p_atoi(yytext);
+		asn1p_lval.a_int = _lex_atoi(yytext);
 		if(errno == ERANGE)
 			return -1;
 		return TOK_number;
@@ -2396,9 +2397,9 @@
 	YY_BREAK
 case 33:
 YY_RULE_SETUP
-#line 235 "asn1p_l.l"
+#line 236 "asn1p_l.l"
 {
-		asn1p_lval.a_int = asn1p_atoi(yytext);
+		asn1p_lval.a_int = _lex_atoi(yytext);
 		if(errno == ERANGE)
 			return -1;
 		return TOK_number;
@@ -2406,17 +2407,17 @@
 	YY_BREAK
 case 34:
 YY_RULE_SETUP
-#line 242 "asn1p_l.l"
+#line 243 "asn1p_l.l"
 return TOK_ABSENT;
 	YY_BREAK
 case 35:
 YY_RULE_SETUP
-#line 243 "asn1p_l.l"
+#line 244 "asn1p_l.l"
 return TOK_ALL;
 	YY_BREAK
 case 36:
 YY_RULE_SETUP
-#line 244 "asn1p_l.l"
+#line 245 "asn1p_l.l"
 {
 				/* Appeared in 1990, removed in 1997 */
 				if(TYPE_LIFETIME(1990, 1997))
@@ -2428,27 +2429,27 @@
 	YY_BREAK
 case 37:
 YY_RULE_SETUP
-#line 252 "asn1p_l.l"
+#line 253 "asn1p_l.l"
 return TOK_APPLICATION;
 	YY_BREAK
 case 38:
 YY_RULE_SETUP
-#line 253 "asn1p_l.l"
+#line 254 "asn1p_l.l"
 return TOK_AUTOMATIC;
 	YY_BREAK
 case 39:
 YY_RULE_SETUP
-#line 254 "asn1p_l.l"
+#line 255 "asn1p_l.l"
 return TOK_BEGIN;
 	YY_BREAK
 case 40:
 YY_RULE_SETUP
-#line 255 "asn1p_l.l"
+#line 256 "asn1p_l.l"
 return TOK_BIT;
 	YY_BREAK
 case 41:
 YY_RULE_SETUP
-#line 256 "asn1p_l.l"
+#line 257 "asn1p_l.l"
 {
 				if(TYPE_LIFETIME(1994, 0))
 					return TOK_BMPString;
@@ -2457,57 +2458,57 @@
 	YY_BREAK
 case 42:
 YY_RULE_SETUP
-#line 261 "asn1p_l.l"
+#line 262 "asn1p_l.l"
 return TOK_BOOLEAN;
 	YY_BREAK
 case 43:
 YY_RULE_SETUP
-#line 262 "asn1p_l.l"
+#line 263 "asn1p_l.l"
 return TOK_BY;
 	YY_BREAK
 case 44:
 YY_RULE_SETUP
-#line 263 "asn1p_l.l"
+#line 264 "asn1p_l.l"
 return TOK_CHARACTER;
 	YY_BREAK
 case 45:
 YY_RULE_SETUP
-#line 264 "asn1p_l.l"
+#line 265 "asn1p_l.l"
 return TOK_CHOICE;
 	YY_BREAK
 case 46:
 YY_RULE_SETUP
-#line 265 "asn1p_l.l"
+#line 266 "asn1p_l.l"
 return TOK_CLASS;
 	YY_BREAK
 case 47:
 YY_RULE_SETUP
-#line 266 "asn1p_l.l"
+#line 267 "asn1p_l.l"
 return TOK_COMPONENT;
 	YY_BREAK
 case 48:
 YY_RULE_SETUP
-#line 267 "asn1p_l.l"
+#line 268 "asn1p_l.l"
 return TOK_COMPONENTS;
 	YY_BREAK
 case 49:
 YY_RULE_SETUP
-#line 268 "asn1p_l.l"
+#line 269 "asn1p_l.l"
 return TOK_CONSTRAINED;
 	YY_BREAK
 case 50:
 YY_RULE_SETUP
-#line 269 "asn1p_l.l"
+#line 270 "asn1p_l.l"
 return TOK_CONTAINING;
 	YY_BREAK
 case 51:
 YY_RULE_SETUP
-#line 270 "asn1p_l.l"
+#line 271 "asn1p_l.l"
 return TOK_DEFAULT;
 	YY_BREAK
 case 52:
 YY_RULE_SETUP
-#line 271 "asn1p_l.l"
+#line 272 "asn1p_l.l"
 {
 				/* Appeared in 1990, removed in 1997 */
 				if(TYPE_LIFETIME(1990, 1997))
@@ -2520,292 +2521,292 @@
 	YY_BREAK
 case 53:
 YY_RULE_SETUP
-#line 280 "asn1p_l.l"
+#line 281 "asn1p_l.l"
 return TOK_DEFINITIONS;
 	YY_BREAK
 case 54:
 YY_RULE_SETUP
-#line 281 "asn1p_l.l"
+#line 282 "asn1p_l.l"
 return TOK_EMBEDDED;
 	YY_BREAK
 case 55:
 YY_RULE_SETUP
-#line 282 "asn1p_l.l"
+#line 283 "asn1p_l.l"
 return TOK_ENCODED;
 	YY_BREAK
 case 56:
 YY_RULE_SETUP
-#line 283 "asn1p_l.l"
+#line 284 "asn1p_l.l"
 return TOK_ENCODING_CONTROL;
 	YY_BREAK
 case 57:
 YY_RULE_SETUP
-#line 284 "asn1p_l.l"
+#line 285 "asn1p_l.l"
 return TOK_END;
 	YY_BREAK
 case 58:
 YY_RULE_SETUP
-#line 285 "asn1p_l.l"
+#line 286 "asn1p_l.l"
 return TOK_ENUMERATED;
 	YY_BREAK
 case 59:
 YY_RULE_SETUP
-#line 286 "asn1p_l.l"
+#line 287 "asn1p_l.l"
 return TOK_EXCEPT;
 	YY_BREAK
 case 60:
 YY_RULE_SETUP
-#line 287 "asn1p_l.l"
+#line 288 "asn1p_l.l"
 return TOK_EXPLICIT;
 	YY_BREAK
 case 61:
 YY_RULE_SETUP
-#line 288 "asn1p_l.l"
+#line 289 "asn1p_l.l"
 return TOK_EXPORTS;
 	YY_BREAK
 case 62:
 YY_RULE_SETUP
-#line 289 "asn1p_l.l"
+#line 290 "asn1p_l.l"
 return TOK_EXTENSIBILITY;
 	YY_BREAK
 case 63:
 YY_RULE_SETUP
-#line 290 "asn1p_l.l"
+#line 291 "asn1p_l.l"
 return TOK_EXTERNAL;
 	YY_BREAK
 case 64:
 YY_RULE_SETUP
-#line 291 "asn1p_l.l"
+#line 292 "asn1p_l.l"
 return TOK_FALSE;
 	YY_BREAK
 case 65:
 YY_RULE_SETUP
-#line 292 "asn1p_l.l"
+#line 293 "asn1p_l.l"
 return TOK_FROM;
 	YY_BREAK
 case 66:
 YY_RULE_SETUP
-#line 293 "asn1p_l.l"
+#line 294 "asn1p_l.l"
 return TOK_GeneralizedTime;
 	YY_BREAK
 case 67:
 YY_RULE_SETUP
-#line 294 "asn1p_l.l"
+#line 295 "asn1p_l.l"
 return TOK_GeneralString;
 	YY_BREAK
 case 68:
 YY_RULE_SETUP
-#line 295 "asn1p_l.l"
+#line 296 "asn1p_l.l"
 return TOK_GraphicString;
 	YY_BREAK
 case 69:
 YY_RULE_SETUP
-#line 296 "asn1p_l.l"
+#line 297 "asn1p_l.l"
 return TOK_IA5String;
 	YY_BREAK
 case 70:
 YY_RULE_SETUP
-#line 297 "asn1p_l.l"
+#line 298 "asn1p_l.l"
 return TOK_IDENTIFIER;
 	YY_BREAK
 case 71:
 YY_RULE_SETUP
-#line 298 "asn1p_l.l"
+#line 299 "asn1p_l.l"
 return TOK_IMPLICIT;
 	YY_BREAK
 case 72:
 YY_RULE_SETUP
-#line 299 "asn1p_l.l"
+#line 300 "asn1p_l.l"
 return TOK_IMPLIED;
 	YY_BREAK
 case 73:
 YY_RULE_SETUP
-#line 300 "asn1p_l.l"
+#line 301 "asn1p_l.l"
 return TOK_IMPORTS;
 	YY_BREAK
 case 74:
 YY_RULE_SETUP
-#line 301 "asn1p_l.l"
+#line 302 "asn1p_l.l"
 return TOK_INCLUDES;
 	YY_BREAK
 case 75:
 YY_RULE_SETUP
-#line 302 "asn1p_l.l"
+#line 303 "asn1p_l.l"
 return TOK_INSTANCE;
 	YY_BREAK
 case 76:
 YY_RULE_SETUP
-#line 303 "asn1p_l.l"
+#line 304 "asn1p_l.l"
 return TOK_INSTRUCTIONS;
 	YY_BREAK
 case 77:
 YY_RULE_SETUP
-#line 304 "asn1p_l.l"
+#line 305 "asn1p_l.l"
 return TOK_INTEGER;
 	YY_BREAK
 case 78:
 YY_RULE_SETUP
-#line 305 "asn1p_l.l"
+#line 306 "asn1p_l.l"
 return TOK_INTERSECTION;
 	YY_BREAK
 case 79:
 YY_RULE_SETUP
-#line 306 "asn1p_l.l"
+#line 307 "asn1p_l.l"
 return TOK_ISO646String;
 	YY_BREAK
 case 80:
 YY_RULE_SETUP
-#line 307 "asn1p_l.l"
+#line 308 "asn1p_l.l"
 return TOK_MAX;
 	YY_BREAK
 case 81:
 YY_RULE_SETUP
-#line 308 "asn1p_l.l"
+#line 309 "asn1p_l.l"
 return TOK_MIN;
 	YY_BREAK
 case 82:
 YY_RULE_SETUP
-#line 309 "asn1p_l.l"
+#line 310 "asn1p_l.l"
 return TOK_MINUS_INFINITY;
 	YY_BREAK
 case 83:
 YY_RULE_SETUP
-#line 310 "asn1p_l.l"
+#line 311 "asn1p_l.l"
 return TOK_NULL;
 	YY_BREAK
 case 84:
 YY_RULE_SETUP
-#line 311 "asn1p_l.l"
+#line 312 "asn1p_l.l"
 return TOK_NumericString;
 	YY_BREAK
 case 85:
 YY_RULE_SETUP
-#line 312 "asn1p_l.l"
+#line 313 "asn1p_l.l"
 return TOK_OBJECT;
 	YY_BREAK
 case 86:
 YY_RULE_SETUP
-#line 313 "asn1p_l.l"
+#line 314 "asn1p_l.l"
 return TOK_ObjectDescriptor;
 	YY_BREAK
 case 87:
 YY_RULE_SETUP
-#line 314 "asn1p_l.l"
+#line 315 "asn1p_l.l"
 return TOK_OCTET;
 	YY_BREAK
 case 88:
 YY_RULE_SETUP
-#line 315 "asn1p_l.l"
+#line 316 "asn1p_l.l"
 return TOK_OF;
 	YY_BREAK
 case 89:
 YY_RULE_SETUP
-#line 316 "asn1p_l.l"
+#line 317 "asn1p_l.l"
 return TOK_OPTIONAL;
 	YY_BREAK
 case 90:
 YY_RULE_SETUP
-#line 317 "asn1p_l.l"
+#line 318 "asn1p_l.l"
 return TOK_PATTERN;
 	YY_BREAK
 case 91:
 YY_RULE_SETUP
-#line 318 "asn1p_l.l"
+#line 319 "asn1p_l.l"
 return TOK_PDV;
 	YY_BREAK
 case 92:
 YY_RULE_SETUP
-#line 319 "asn1p_l.l"
+#line 320 "asn1p_l.l"
 return TOK_PLUS_INFINITY;
 	YY_BREAK
 case 93:
 YY_RULE_SETUP
-#line 320 "asn1p_l.l"
+#line 321 "asn1p_l.l"
 return TOK_PRESENT;
 	YY_BREAK
 case 94:
 YY_RULE_SETUP
-#line 321 "asn1p_l.l"
+#line 322 "asn1p_l.l"
 return TOK_PrintableString;
 	YY_BREAK
 case 95:
 YY_RULE_SETUP
-#line 322 "asn1p_l.l"
+#line 323 "asn1p_l.l"
 return TOK_PRIVATE;
 	YY_BREAK
 case 96:
 YY_RULE_SETUP
-#line 323 "asn1p_l.l"
+#line 324 "asn1p_l.l"
 return TOK_REAL;
 	YY_BREAK
 case 97:
 YY_RULE_SETUP
-#line 324 "asn1p_l.l"
+#line 325 "asn1p_l.l"
 return TOK_RELATIVE_OID;
 	YY_BREAK
 case 98:
 YY_RULE_SETUP
-#line 325 "asn1p_l.l"
+#line 326 "asn1p_l.l"
 return TOK_SEQUENCE;
 	YY_BREAK
 case 99:
 YY_RULE_SETUP
-#line 326 "asn1p_l.l"
+#line 327 "asn1p_l.l"
 return TOK_SET;
 	YY_BREAK
 case 100:
 YY_RULE_SETUP
-#line 327 "asn1p_l.l"
+#line 328 "asn1p_l.l"
 return TOK_SIZE;
 	YY_BREAK
 case 101:
 YY_RULE_SETUP
-#line 328 "asn1p_l.l"
+#line 329 "asn1p_l.l"
 return TOK_STRING;
 	YY_BREAK
 case 102:
 YY_RULE_SETUP
-#line 329 "asn1p_l.l"
+#line 330 "asn1p_l.l"
 return TOK_SYNTAX;
 	YY_BREAK
 case 103:
 YY_RULE_SETUP
-#line 330 "asn1p_l.l"
+#line 331 "asn1p_l.l"
 return TOK_T61String;
 	YY_BREAK
 case 104:
 YY_RULE_SETUP
-#line 331 "asn1p_l.l"
+#line 332 "asn1p_l.l"
 return TOK_TAGS;
 	YY_BREAK
 case 105:
 YY_RULE_SETUP
-#line 332 "asn1p_l.l"
+#line 333 "asn1p_l.l"
 return TOK_TeletexString;
 	YY_BREAK
 case 106:
 YY_RULE_SETUP
-#line 333 "asn1p_l.l"
+#line 334 "asn1p_l.l"
 return TOK_TRUE;
 	YY_BREAK
 case 107:
 YY_RULE_SETUP
-#line 334 "asn1p_l.l"
+#line 335 "asn1p_l.l"
 return TOK_UNION;
 	YY_BREAK
 case 108:
 YY_RULE_SETUP
-#line 335 "asn1p_l.l"
+#line 336 "asn1p_l.l"
 return TOK_UNIQUE;
 	YY_BREAK
 case 109:
 YY_RULE_SETUP
-#line 336 "asn1p_l.l"
+#line 337 "asn1p_l.l"
 return TOK_UNIVERSAL;
 	YY_BREAK
 case 110:
 YY_RULE_SETUP
-#line 337 "asn1p_l.l"
+#line 338 "asn1p_l.l"
 {
 				if(TYPE_LIFETIME(1994, 0))
 					return TOK_UniversalString;
@@ -2814,12 +2815,12 @@
 	YY_BREAK
 case 111:
 YY_RULE_SETUP
-#line 342 "asn1p_l.l"
+#line 343 "asn1p_l.l"
 return TOK_UTCTime;
 	YY_BREAK
 case 112:
 YY_RULE_SETUP
-#line 343 "asn1p_l.l"
+#line 344 "asn1p_l.l"
 {
 				if(TYPE_LIFETIME(1994, 0))
 					return TOK_UTF8String;
@@ -2828,22 +2829,22 @@
 	YY_BREAK
 case 113:
 YY_RULE_SETUP
-#line 348 "asn1p_l.l"
+#line 349 "asn1p_l.l"
 return TOK_VideotexString;
 	YY_BREAK
 case 114:
 YY_RULE_SETUP
-#line 349 "asn1p_l.l"
+#line 350 "asn1p_l.l"
 return TOK_VisibleString;
 	YY_BREAK
 case 115:
 YY_RULE_SETUP
-#line 350 "asn1p_l.l"
+#line 351 "asn1p_l.l"
 return TOK_WITH;
 	YY_BREAK
 case 116:
 YY_RULE_SETUP
-#line 353 "asn1p_l.l"
+#line 354 "asn1p_l.l"
 {
 		asn1p_lval.tv_str = strdup(yytext);
 		return TOK_typefieldreference;
@@ -2851,7 +2852,7 @@
 	YY_BREAK
 case 117:
 YY_RULE_SETUP
-#line 358 "asn1p_l.l"
+#line 359 "asn1p_l.l"
 {
 		asn1p_lval.tv_str = strdup(yytext);
 		return TOK_valuefieldreference;
@@ -2859,7 +2860,7 @@
 	YY_BREAK
 case 118:
 YY_RULE_SETUP
-#line 364 "asn1p_l.l"
+#line 365 "asn1p_l.l"
 {
 		asn1p_lval.tv_str = strdup(yytext);
 		return TOK_identifier;
@@ -2870,7 +2871,7 @@
 	 */
 case 119:
 YY_RULE_SETUP
-#line 372 "asn1p_l.l"
+#line 373 "asn1p_l.l"
 {
 		asn1p_lval.tv_str = strdup(yytext);
 		return TOK_capitalreference;
@@ -2883,7 +2884,7 @@
 	 */
 case 120:
 YY_RULE_SETUP
-#line 382 "asn1p_l.l"
+#line 383 "asn1p_l.l"
 {
 		asn1p_lval.tv_str = strdup(yytext);
 		return TOK_typereference;
@@ -2891,23 +2892,23 @@
 	YY_BREAK
 case 121:
 YY_RULE_SETUP
-#line 387 "asn1p_l.l"
+#line 388 "asn1p_l.l"
 return TOK_PPEQ;
 	YY_BREAK
 case 122:
 YY_RULE_SETUP
-#line 389 "asn1p_l.l"
+#line 390 "asn1p_l.l"
 return TOK_ThreeDots;
 	YY_BREAK
 case 123:
 YY_RULE_SETUP
-#line 390 "asn1p_l.l"
+#line 391 "asn1p_l.l"
 return TOK_TwoDots;
 	YY_BREAK
 
 case 124:
 YY_RULE_SETUP
-#line 394 "asn1p_l.l"
+#line 395 "asn1p_l.l"
 {
 				asn1p_lval.tv_str = strdup(yytext);
 				return TOK_Literal;
@@ -2915,7 +2916,7 @@
 	YY_BREAK
 case 125:
 YY_RULE_SETUP
-#line 399 "asn1p_l.l"
+#line 400 "asn1p_l.l"
 {
 				asn1p_lval.tv_str = strdup(yytext);
 				return TOK_Literal;
@@ -2923,7 +2924,7 @@
 	YY_BREAK
 case 126:
 YY_RULE_SETUP
-#line 404 "asn1p_l.l"
+#line 405 "asn1p_l.l"
 {
 				yy_push_state(with_syntax);
 				asn1p_lval.tv_str = strdup(yytext);
@@ -2932,17 +2933,17 @@
 	YY_BREAK
 case 127:
 YY_RULE_SETUP
-#line 410 "asn1p_l.l"
+#line 411 "asn1p_l.l"
 return '[';
 	YY_BREAK
 case 128:
 YY_RULE_SETUP
-#line 411 "asn1p_l.l"
+#line 412 "asn1p_l.l"
 return ']';
 	YY_BREAK
 case 129:
 YY_RULE_SETUP
-#line 413 "asn1p_l.l"
+#line 414 "asn1p_l.l"
 {
 			asn1p_lval.tv_opaque.buf = strdup(yytext);
 			asn1p_lval.tv_opaque.len = yyleng;
@@ -2951,7 +2952,7 @@
 	YY_BREAK
 case 130:
 YY_RULE_SETUP
-#line 419 "asn1p_l.l"
+#line 420 "asn1p_l.l"
 {
 				yy_pop_state();
 				if(YYSTATE == with_syntax) {
@@ -2965,21 +2966,21 @@
 
 case 131:
 YY_RULE_SETUP
-#line 432 "asn1p_l.l"
+#line 433 "asn1p_l.l"
 /* Ignore whitespace */
 	YY_BREAK
 case 132:
 YY_RULE_SETUP
-#line 435 "asn1p_l.l"
+#line 436 "asn1p_l.l"
 {
 		asn1c_integer_t v1 = -1, v2 = -1;
 		char *p;
 		for(p = yytext; *p; p++)
 			if(*p >= '0' && *p <= '9')
-			{ v1 = asn1p_atoi(p); break; }
+			{ v1 = _lex_atoi(p); break; }
 		while(*p >= '0' && *p <= '9') p++;	/* Skip digits */
 		for(; *p; p++) if(*p >= '0' && *p <= '9')
-			{ v2 = asn1p_atoi(p); break; }
+			{ v2 = _lex_atoi(p); break; }
 		if(v1 < 0 || v1 > 7) {
 			fprintf(stderr, "%s at line %d: X.680:2003, #37.14 "
 				"mandates 0..7 range for Tuple's TableColumn\n",
@@ -2998,22 +2999,22 @@
 	YY_BREAK
 case 133:
 YY_RULE_SETUP
-#line 460 "asn1p_l.l"
+#line 461 "asn1p_l.l"
 {
 		asn1c_integer_t v1 = -1, v2 = -1, v3 = -1, v4 = -1;
 		char *p;
 		for(p = yytext; *p; p++)
 			if(*p >= '0' && *p <= '9')
-			{ v1 = asn1p_atoi(p); break; }
+			{ v1 = _lex_atoi(p); break; }
 		while(*p >= '0' && *p <= '9') p++;	/* Skip digits */
 		for(; *p; p++) if(*p >= '0' && *p <= '9')
-			{ v2 = asn1p_atoi(p); break; }
+			{ v2 = _lex_atoi(p); break; }
 		while(*p >= '0' && *p <= '9') p++;
 		for(; *p; p++) if(*p >= '0' && *p <= '9')
-			{ v3 = asn1p_atoi(p); break; }
+			{ v3 = _lex_atoi(p); break; }
 		while(*p >= '0' && *p <= '9') p++;
 		for(; *p; p++) if(*p >= '0' && *p <= '9')
-			{ v4 = asn1p_atoi(p); break; }
+			{ v4 = _lex_atoi(p); break; }
 		if(v1 < 0 || v1 > 127) {
 			fprintf(stderr, "%s at line %d: X.680:2003, #37.12 "
 				"mandates 0..127 range for Quadruple's Group\n",
@@ -3044,12 +3045,12 @@
 	YY_BREAK
 case 134:
 YY_RULE_SETUP
-#line 504 "asn1p_l.l"
+#line 505 "asn1p_l.l"
 return yytext[0];
 	YY_BREAK
 case 135:
 YY_RULE_SETUP
-#line 506 "asn1p_l.l"
+#line 507 "asn1p_l.l"
 {
 		if(TYPE_LIFETIME(1994, 0))
 			fprintf(stderr, "ERROR: ");
@@ -3063,7 +3064,7 @@
 	YY_BREAK
 case 136:
 YY_RULE_SETUP
-#line 517 "asn1p_l.l"
+#line 518 "asn1p_l.l"
 {
 		fprintf(stderr,
 			"Unexpected token at line %d: \"%s\"\n",
@@ -3085,7 +3086,7 @@
 case YY_STATE_EOF(opaque):
 case YY_STATE_EOF(encoding_control):
 case YY_STATE_EOF(with_syntax):
-#line 530 "asn1p_l.l"
+#line 531 "asn1p_l.l"
 {
 		while(YYSTATE != INITIAL)
 			yy_pop_state();
@@ -3094,10 +3095,10 @@
 	YY_BREAK
 case 137:
 YY_RULE_SETUP
-#line 537 "asn1p_l.l"
+#line 538 "asn1p_l.l"
 YY_FATAL_ERROR( "flex scanner jammed" );
 	YY_BREAK
-#line 3101 "asn1p_l.c"
+#line 3102 "asn1p_l.c"
 
 	case YY_END_OF_BUFFER:
 		{
@@ -3979,7 +3980,7 @@
 	return 0;
 	}
 #endif
-#line 537 "asn1p_l.l"
+#line 538 "asn1p_l.l"
 
 
 /*
@@ -3998,30 +3999,14 @@
 }
 
 static asn1c_integer_t
-asn1p_atoi(char *ptr) {
+_lex_atoi(const char *ptr) {
 	asn1c_integer_t value;
-	errno = 0;	/* Clear the error code */
-
-	if(sizeof(value) <= sizeof(int)) {
-		value = strtol(ptr, 0, 10);
-	} else {
-#ifdef	HAVE_STRTOIMAX
-		value = strtoimax(ptr, 0, 10);
-#elif	HAVE_STRTOLL
-		value = strtoll(ptr, 0, 10);
-#else
-		value = strtol(ptr, 0, 10);
-#endif
-	}
-
-	if(errno == ERANGE) {
+	if(asn1p_atoi(ptr, &value)) {
 		fprintf(stderr,
 			"Value \"%s\" at line %d is too large "
 			"for this compiler! Please contact the asn1c author.\n",
 			ptr, yylineno);
-		errno = ERANGE;	/* Restore potentially clobbered errno */
+		errno = ERANGE;
 	}
-
 	return value;
 }
-
diff --git a/libasn1parser/asn1p_l.l b/libasn1parser/asn1p_l.l
index e440d42..2594b55 100644
--- a/libasn1parser/asn1p_l.l
+++ b/libasn1parser/asn1p_l.l
@@ -23,10 +23,11 @@
 int asn1p_lexer_pedantic_1990 = 0;
 int asn1p_lexer_types_year = 0;
 int asn1p_lexer_constructs_year = 0;
-static asn1c_integer_t asn1p_atoi(char *ptr); /* errno is either 0 or ERANGE */
 
 int asn1p_as_pointer;
 
+static asn1c_integer_t _lex_atoi(const char *ptr);
+
 /*
  * Check that the type is defined in the year of the standard choosen.
  */
@@ -219,21 +220,21 @@
 
 
 -[1-9][0-9]*	{
-		asn1p_lval.a_int = asn1p_atoi(yytext);
+		asn1p_lval.a_int = _lex_atoi(yytext);
 		if(errno == ERANGE)
 			return -1;
 		return TOK_number_negative;
 	}
 
 [1-9][0-9]*	{
-		asn1p_lval.a_int = asn1p_atoi(yytext);
+		asn1p_lval.a_int = _lex_atoi(yytext);
 		if(errno == ERANGE)
 			return -1;
 		return TOK_number;
 	}
 
 "0"	{
-		asn1p_lval.a_int = asn1p_atoi(yytext);
+		asn1p_lval.a_int = _lex_atoi(yytext);
 		if(errno == ERANGE)
 			return -1;
 		return TOK_number;
@@ -437,10 +438,10 @@
 		char *p;
 		for(p = yytext; *p; p++)
 			if(*p >= '0' && *p <= '9')
-			{ v1 = asn1p_atoi(p); break; }
+			{ v1 = _lex_atoi(p); break; }
 		while(*p >= '0' && *p <= '9') p++;	/* Skip digits */
 		for(; *p; p++) if(*p >= '0' && *p <= '9')
-			{ v2 = asn1p_atoi(p); break; }
+			{ v2 = _lex_atoi(p); break; }
 		if(v1 < 0 || v1 > 7) {
 			fprintf(stderr, "%s at line %d: X.680:2003, #37.14 "
 				"mandates 0..7 range for Tuple's TableColumn\n",
@@ -462,16 +463,16 @@
 		char *p;
 		for(p = yytext; *p; p++)
 			if(*p >= '0' && *p <= '9')
-			{ v1 = asn1p_atoi(p); break; }
+			{ v1 = _lex_atoi(p); break; }
 		while(*p >= '0' && *p <= '9') p++;	/* Skip digits */
 		for(; *p; p++) if(*p >= '0' && *p <= '9')
-			{ v2 = asn1p_atoi(p); break; }
+			{ v2 = _lex_atoi(p); break; }
 		while(*p >= '0' && *p <= '9') p++;
 		for(; *p; p++) if(*p >= '0' && *p <= '9')
-			{ v3 = asn1p_atoi(p); break; }
+			{ v3 = _lex_atoi(p); break; }
 		while(*p >= '0' && *p <= '9') p++;
 		for(; *p; p++) if(*p >= '0' && *p <= '9')
-			{ v4 = asn1p_atoi(p); break; }
+			{ v4 = _lex_atoi(p); break; }
 		if(v1 < 0 || v1 > 127) {
 			fprintf(stderr, "%s at line %d: X.680:2003, #37.12 "
 				"mandates 0..127 range for Quadruple's Group\n",
@@ -552,30 +553,14 @@
 }
 
 static asn1c_integer_t
-asn1p_atoi(char *ptr) {
+_lex_atoi(const char *ptr) {
 	asn1c_integer_t value;
-	errno = 0;	/* Clear the error code */
-
-	if(sizeof(value) <= sizeof(int)) {
-		value = strtol(ptr, 0, 10);
-	} else {
-#ifdef	HAVE_STRTOIMAX
-		value = strtoimax(ptr, 0, 10);
-#elif	HAVE_STRTOLL
-		value = strtoll(ptr, 0, 10);
-#else
-		value = strtol(ptr, 0, 10);
-#endif
-	}
-
-	if(errno == ERANGE) {
+	if(asn1p_atoi(ptr, &value)) {
 		fprintf(stderr,
 			"Value \"%s\" at line %d is too large "
 			"for this compiler! Please contact the asn1c author.\n",
 			ptr, yylineno);
-		errno = ERANGE;	/* Restore potentially clobbered errno */
+		errno = ERANGE;
 	}
-
 	return value;
 }
-
diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c
index b00f051..02e0ba9 100644
--- a/libasn1parser/asn1p_y.c
+++ b/libasn1parser/asn1p_y.c
@@ -223,11 +223,11 @@
 
 
 
-#define	YYFINAL		446
+#define	YYFINAL		445
 #define	YYFLAG		-32768
 #define	YYNTBASE	120
 
-#define YYTRANSLATE(x) ((unsigned)(x) <= 358 ? yytranslate[x] : 227)
+#define YYTRANSLATE(x) ((unsigned)(x) <= 358 ? yytranslate[x] : 226)
 
 static const char yytranslate[] = {     0,
      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -283,141 +283,140 @@
    293,   295,   298,   300,   302,   304,   308,   310,   314,   318,
    322,   323,   326,   328,   333,   338,   343,   350,   357,   359,
    364,   369,   371,   375,   377,   381,   385,   389,   391,   395,
-   397,   401,   403,   405,   407,   409,   411,   415,   419,   421,
-   426,   430,   431,   435,   437,   439,   441,   443,   445,   447,
-   449,   451,   453,   457,   459,   461,   463,   465,   468,   470,
-   472,   474,   476,   479,   482,   484,   486,   489,   492,   494,
-   496,   498,   500,   502,   505,   507,   510,   512,   514,   516,
+   397,   401,   403,   405,   407,   409,   413,   417,   419,   424,
+   428,   429,   433,   435,   437,   439,   441,   443,   445,   447,
+   449,   451,   455,   457,   459,   461,   463,   466,   468,   470,
+   472,   474,   477,   480,   482,   484,   487,   490,   492,   494,
+   496,   498,   500,   503,   505,   508,   510,   512,   514,   516,
    518,   520,   522,   524,   526,   528,   530,   532,   534,   536,
-   538,   540,   542,   544,   546,   548,   549,   551,   553,   558,
-   562,   567,   569,   573,   579,   581,   585,   589,   593,   597,
-   602,   606,   608,   610,   614,   618,   622,   626,   628,   630,
-   631,   637,   639,   642,   645,   649,   651,   653,   655,   657,
-   659,   661,   663,   665,   669,   675,   677,   681,   683,   687,
-   688,   690,   692,   694,   696,   698,   700,   704,   709,   711,
-   715,   718,   722,   724,   728,   729,   731,   733,   736,   739,
-   743,   745,   749,   751,   756,   761,   763,   765,   767,   769,
-   770,   772,   775,   780,   781,   783,   785,   787,   788,   790,
-   792,   794,   796,   798,   799,   801
+   538,   540,   542,   544,   546,   547,   549,   551,   556,   560,
+   565,   567,   571,   577,   579,   583,   587,   591,   595,   600,
+   604,   606,   608,   612,   616,   620,   624,   626,   628,   629,
+   635,   637,   640,   643,   647,   649,   651,   653,   655,   657,
+   659,   661,   663,   667,   673,   675,   679,   681,   685,   686,
+   688,   690,   692,   694,   696,   698,   702,   707,   709,   713,
+   716,   720,   722,   726,   727,   729,   731,   734,   737,   741,
+   743,   747,   749,   754,   759,   761,   763,   765,   767,   768,
+   770,   773,   778,   779,   781,   783,   785,   786,   788,   790,
+   792,   794,   796,   797,   799
 };
 
 static const short yyrhs[] = {   121,
-     0,   122,     0,   121,   122,     0,   223,   123,    38,   127,
+     0,   122,     0,   121,   122,     0,   222,   123,    38,   127,
      3,    25,   130,    43,     0,     0,   124,     0,   107,   125,
    108,     0,   107,   108,     0,   126,     0,   125,   126,     0,
-   226,     0,   226,   109,    10,   110,     0,    10,     0,     0,
+   225,     0,   225,   109,    10,   110,     0,    10,     0,     0,
    128,     0,   129,     0,   128,   129,     0,    45,    88,     0,
     56,    88,     0,    24,    88,     0,    47,    57,     0,    15,
     61,     0,     0,   131,     0,   132,     0,   131,   132,     0,
-   134,     0,   140,     0,   146,     0,   177,     0,   143,     0,
-     0,    42,    15,   133,     0,   186,     0,    58,   135,   111,
+   134,     0,   140,     0,   146,     0,   176,     0,   143,     0,
+     0,    42,    15,   133,     0,   185,     0,    58,   135,   111,
      0,    58,    50,     0,   137,     0,   135,   137,     0,     0,
-   124,     0,   138,    50,   223,   136,     0,   139,     0,   138,
-   112,   139,     0,   223,     0,   223,   107,   108,     0,   226,
+   124,     0,   138,    50,   222,   136,     0,   139,     0,   138,
+   112,   139,     0,   222,     0,   222,   107,   108,     0,   225,
      0,    46,   141,   111,     0,    46,    21,   111,     0,    46,
-   111,     0,   142,     0,   141,   112,   142,     0,   223,     0,
-   223,   107,   108,     0,   226,     0,     0,   223,   145,     3,
-   107,   144,   182,     0,   170,     0,   183,     0,   223,     3,
-   166,     0,   223,     3,   156,     0,   223,   107,   147,   108,
-     3,   166,     0,   148,     0,   147,   112,   148,     0,   223,
-     0,   223,   113,   226,     0,   223,   113,   223,     0,   183,
-   113,   226,     0,   150,     0,   149,   112,   150,     0,   166,
-     0,   226,     0,     0,   152,     0,   153,     0,   152,   112,
-   153,     0,   226,   166,   212,     0,   166,   212,     0,    34,
+   111,     0,   142,     0,   141,   112,   142,     0,   222,     0,
+   222,   107,   108,     0,   225,     0,     0,   222,   145,     3,
+   107,   144,   181,     0,   170,     0,   182,     0,   222,     3,
+   166,     0,   222,     3,   156,     0,   222,   107,   147,   108,
+     3,   166,     0,   148,     0,   147,   112,   148,     0,   222,
+     0,   222,   113,   225,     0,   222,   113,   222,     0,   182,
+   113,   225,     0,   150,     0,   149,   112,   150,     0,   166,
+     0,   225,     0,     0,   152,     0,   153,     0,   152,   112,
+   153,     0,   225,   166,   211,     0,   166,   211,     0,    34,
     72,   166,     0,   165,     0,   155,     0,   154,   112,   155,
-     0,   226,   166,     0,   165,     0,   166,     0,    32,   107,
+     0,   225,   166,     0,   165,     0,   166,     0,    32,   107,
    158,   108,   160,     0,     0,    92,     0,   159,     0,   158,
-   112,   159,     0,    16,   212,     0,    17,   166,   157,   212,
-     0,    17,   175,   212,     0,    17,   176,   212,     0,    16,
-   175,   212,     0,    16,   166,   212,     0,    16,   176,   212,
+   112,   159,     0,    16,   211,     0,    17,   166,   157,   211,
+     0,    17,   174,   211,     0,    17,   175,   211,     0,    16,
+   174,   211,     0,    16,   166,   211,     0,    16,   175,   211,
      0,     0,   161,     0,     0,    99,    86,   107,   162,   163,
    108,     0,   164,     0,   163,   164,     0,     4,     0,    18,
      0,   173,     0,   114,   163,   115,     0,   106,     0,   106,
-   116,   180,     0,   106,   116,   217,     0,   218,   168,   190,
-     0,     0,   167,   169,     0,   185,     0,    31,   107,   154,
+   116,   179,     0,   106,   116,   216,     0,   217,   168,   189,
+     0,     0,   167,   169,     0,   184,     0,    31,   107,   154,
    108,     0,    82,   107,   151,   108,     0,    83,   107,   151,
-   108,     0,    82,   190,    72,   225,   218,   168,     0,    83,
-   190,    72,   225,   218,   168,     0,    22,     0,    22,    39,
-    29,   226,     0,   223,   107,   149,   108,     0,   170,     0,
-    60,    72,   170,     0,    14,     0,    14,   117,   223,     0,
-   224,   117,   223,     0,    14,   117,   226,     0,   224,     0,
-   224,   117,   171,     0,   172,     0,   171,   117,   172,     0,
-   174,     0,   174,     0,    16,     0,    17,     0,    16,     0,
-   175,   117,    16,     0,   175,   117,    17,     0,    15,     0,
-   226,   145,     3,   178,     0,   226,   113,   178,     0,     0,
-   107,   179,   182,     0,    67,     0,    49,     0,    90,     0,
-     6,     0,     8,     0,   181,     0,   217,     0,   180,     0,
-   226,     0,   223,   117,   226,     0,     7,     0,    11,     0,
-    12,     0,     5,     0,   182,     5,     0,    28,     0,    67,
-     0,    80,     0,   184,     0,    71,    85,     0,    69,    55,
-     0,    81,     0,    48,     0,    40,    75,     0,    30,    85,
-     0,    95,     0,    51,     0,   186,     0,    62,     0,    44,
-     0,    26,    85,     0,   183,     0,   184,   214,     0,    27,
-     0,    52,     0,    53,     0,    54,     0,    63,     0,    68,
-     0,    78,     0,    87,     0,    89,     0,    94,     0,    96,
-     0,    97,     0,    98,     0,    70,     0,   103,     0,   104,
-     0,   101,     0,   102,     0,   100,     0,     0,   191,     0,
-   192,     0,    84,   109,   193,   110,     0,   109,   193,   110,
-     0,   192,   109,   193,   110,     0,   194,     0,   194,   112,
-   106,     0,   194,   112,   106,   112,   194,     0,   195,     0,
-    21,   100,   195,     0,   194,   187,   195,     0,   194,   188,
-   195,     0,   195,   189,   195,     0,   198,   109,   193,   110,
-     0,   109,   193,   110,     0,   199,     0,   200,     0,   199,
-   197,   199,     0,    65,   197,   199,     0,   199,   197,    64,
-     0,    65,   197,    64,     0,   206,     0,   201,     0,     0,
-    35,    29,   107,   196,   182,     0,   105,     0,   105,   118,
-     0,   118,   105,     0,   118,   105,   118,     0,    84,     0,
-    50,     0,    49,     0,    90,     0,   217,     0,   181,     0,
-   226,     0,   223,     0,    99,    33,   192,     0,    99,    34,
-   107,   202,   108,     0,   203,     0,   202,   112,   203,     0,
-   106,     0,   226,   190,   204,     0,     0,   205,     0,    77,
-     0,    19,     0,    73,     0,   207,     0,   208,     0,   107,
-   223,   108,     0,   207,   107,   209,   108,     0,   210,     0,
-   209,   112,   210,     0,   119,   211,     0,   119,   117,   211,
-     0,   226,     0,   211,   117,   226,     0,     0,   213,     0,
-    73,     0,    37,   178,     0,   107,   108,     0,   107,   215,
-   108,     0,   216,     0,   215,   112,   216,     0,   226,     0,
-   226,   109,   217,   110,     0,   226,   109,   180,   110,     0,
-   217,     0,   106,     0,    10,     0,    13,     0,     0,   219,
-     0,   220,   222,     0,   114,   221,    10,   115,     0,     0,
-    93,     0,    23,     0,    79,     0,     0,    56,     0,    45,
-     0,    14,     0,    15,     0,    15,     0,     0,   226,     0,
-     9,     0
+   108,     0,    82,   189,    72,   224,   217,   168,     0,    83,
+   189,    72,   224,   217,   168,     0,    22,     0,    22,    39,
+    29,   225,     0,   222,   107,   149,   108,     0,   170,     0,
+    60,    72,   170,     0,    14,     0,    14,   117,   222,     0,
+   223,   117,   222,     0,    14,   117,   225,     0,   223,     0,
+   223,   117,   171,     0,   172,     0,   171,   117,   172,     0,
+   173,     0,    16,     0,    17,     0,    16,     0,   174,   117,
+    16,     0,   174,   117,    17,     0,    15,     0,   225,   145,
+     3,   177,     0,   225,   113,   177,     0,     0,   107,   178,
+   181,     0,    67,     0,    49,     0,    90,     0,     6,     0,
+     8,     0,   180,     0,   216,     0,   179,     0,   225,     0,
+   222,   117,   225,     0,     7,     0,    11,     0,    12,     0,
+     5,     0,   181,     5,     0,    28,     0,    67,     0,    80,
+     0,   183,     0,    71,    85,     0,    69,    55,     0,    81,
+     0,    48,     0,    40,    75,     0,    30,    85,     0,    95,
+     0,    51,     0,   185,     0,    62,     0,    44,     0,    26,
+    85,     0,   182,     0,   183,   213,     0,    27,     0,    52,
+     0,    53,     0,    54,     0,    63,     0,    68,     0,    78,
+     0,    87,     0,    89,     0,    94,     0,    96,     0,    97,
+     0,    98,     0,    70,     0,   103,     0,   104,     0,   101,
+     0,   102,     0,   100,     0,     0,   190,     0,   191,     0,
+    84,   109,   192,   110,     0,   109,   192,   110,     0,   191,
+   109,   192,   110,     0,   193,     0,   193,   112,   106,     0,
+   193,   112,   106,   112,   193,     0,   194,     0,    21,   100,
+   194,     0,   193,   186,   194,     0,   193,   187,   194,     0,
+   194,   188,   194,     0,   197,   109,   192,   110,     0,   109,
+   192,   110,     0,   198,     0,   199,     0,   198,   196,   198,
+     0,    65,   196,   198,     0,   198,   196,    64,     0,    65,
+   196,    64,     0,   205,     0,   200,     0,     0,    35,    29,
+   107,   195,   181,     0,   105,     0,   105,   118,     0,   118,
+   105,     0,   118,   105,   118,     0,    84,     0,    50,     0,
+    49,     0,    90,     0,   216,     0,   180,     0,   225,     0,
+   222,     0,    99,    33,   191,     0,    99,    34,   107,   201,
+   108,     0,   202,     0,   201,   112,   202,     0,   106,     0,
+   225,   189,   203,     0,     0,   204,     0,    77,     0,    19,
+     0,    73,     0,   206,     0,   207,     0,   107,   222,   108,
+     0,   206,   107,   208,   108,     0,   209,     0,   208,   112,
+   209,     0,   119,   210,     0,   119,   117,   210,     0,   225,
+     0,   210,   117,   225,     0,     0,   212,     0,    73,     0,
+    37,   177,     0,   107,   108,     0,   107,   214,   108,     0,
+   215,     0,   214,   112,   215,     0,   225,     0,   225,   109,
+   216,   110,     0,   225,   109,   179,   110,     0,   216,     0,
+   106,     0,    10,     0,    13,     0,     0,   218,     0,   219,
+   221,     0,   114,   220,    10,   115,     0,     0,    93,     0,
+    23,     0,    79,     0,     0,    56,     0,    45,     0,    14,
+     0,    15,     0,    15,     0,     0,   225,     0,     9,     0
 };
 
 #endif
 
 #if YYDEBUG != 0
 static const short yyrline[] = { 0,
-   324,   330,   336,   352,   377,   379,   382,   386,   391,   398,
-   406,   411,   415,   424,   426,   434,   438,   446,   450,   453,
-   456,   460,   480,   482,   490,   494,   526,   530,   539,   546,
-   559,   566,   568,   580,   592,   603,   608,   614,   620,   622,
-   625,   636,   642,   648,   655,   661,   669,   673,   676,   683,
-   689,   695,   702,   708,   717,   719,   728,   736,   750,   760,
-   776,   785,   795,   805,   810,   817,   824,   834,   840,   846,
-   850,   873,   875,   877,   883,   889,   897,   903,   910,   915,
-   921,   927,   933,   936,   942,   952,   954,   957,   965,   972,
-   985,   996,  1006,  1017,  1027,  1038,  1049,  1051,  1056,  1060,
-  1065,  1070,  1076,  1081,  1084,  1093,  1098,  1107,  1116,  1127,
-  1149,  1156,  1175,  1179,  1185,  1191,  1197,  1207,  1217,  1223,
-  1237,  1261,  1268,  1282,  1291,  1301,  1311,  1321,  1329,  1350,
-  1359,  1368,  1369,  1371,  1378,  1385,  1391,  1395,  1401,  1421,
-  1431,  1439,  1439,  1444,  1449,  1454,  1459,  1463,  1467,  1470,
-  1473,  1478,  1490,  1507,  1512,  1517,  1550,  1560,  1574,  1576,
-  1577,  1578,  1579,  1580,  1581,  1582,  1583,  1584,  1585,  1586,
-  1587,  1593,  1595,  1596,  1599,  1606,  1618,  1620,  1624,  1628,
-  1629,  1630,  1631,  1632,  1636,  1637,  1638,  1639,  1643,  1644,
-  1651,  1651,  1652,  1652,  1653,  1655,  1657,  1662,  1666,  1675,
-  1679,  1684,  1688,  1694,  1704,  1708,  1711,  1714,  1717,  1722,
-  1731,  1739,  1745,  1751,  1758,  1766,  1774,  1783,  1786,  1789,
-  1790,  1800,  1802,  1803,  1804,  1807,  1811,  1816,  1822,  1827,
-  1830,  1833,  1846,  1860,  1864,  1869,  1873,  1878,  1885,  1898,
-  1900,  1903,  1907,  1910,  1915,  1919,  1927,  1942,  1948,  1955,
-  1968,  1980,  1995,  1999,  2016,  2021,  2024,  2029,  2051,  2056,
-  2061,  2067,  2073,  2081,  2089,  2097,  2104,  2114,  2119,  2149,
-  2151,  2154,  2161,  2167,  2169,  2170,  2171,  2174,  2176,  2177,
-  2180,  2185,  2192,  2199,  2201,  2206
+   323,   329,   335,   351,   376,   378,   381,   385,   390,   397,
+   405,   410,   414,   423,   425,   433,   437,   445,   449,   452,
+   455,   459,   479,   481,   489,   493,   525,   529,   538,   545,
+   558,   565,   567,   579,   591,   602,   607,   613,   619,   621,
+   624,   635,   641,   647,   654,   660,   668,   672,   675,   682,
+   688,   694,   701,   707,   716,   718,   727,   735,   749,   759,
+   775,   784,   794,   804,   809,   816,   823,   833,   839,   845,
+   849,   872,   874,   876,   882,   888,   896,   902,   909,   914,
+   920,   926,   932,   935,   941,   951,   953,   956,   964,   971,
+   984,   995,  1005,  1016,  1026,  1037,  1048,  1050,  1055,  1059,
+  1064,  1069,  1075,  1080,  1083,  1087,  1092,  1101,  1110,  1121,
+  1143,  1150,  1169,  1173,  1179,  1185,  1191,  1201,  1211,  1217,
+  1231,  1255,  1262,  1276,  1285,  1295,  1305,  1315,  1323,  1344,
+  1353,  1362,  1364,  1371,  1378,  1384,  1388,  1394,  1414,  1424,
+  1432,  1432,  1437,  1442,  1447,  1452,  1456,  1460,  1463,  1466,
+  1471,  1483,  1500,  1505,  1510,  1543,  1553,  1567,  1569,  1570,
+  1571,  1572,  1573,  1574,  1575,  1576,  1577,  1578,  1579,  1580,
+  1586,  1588,  1589,  1592,  1599,  1611,  1613,  1617,  1621,  1622,
+  1623,  1624,  1625,  1629,  1630,  1631,  1632,  1636,  1637,  1644,
+  1644,  1645,  1645,  1646,  1648,  1650,  1655,  1659,  1668,  1672,
+  1677,  1681,  1687,  1697,  1701,  1704,  1707,  1710,  1715,  1724,
+  1732,  1738,  1744,  1751,  1759,  1767,  1776,  1779,  1782,  1783,
+  1793,  1795,  1796,  1797,  1800,  1804,  1809,  1815,  1820,  1823,
+  1826,  1839,  1853,  1857,  1862,  1866,  1871,  1878,  1891,  1893,
+  1896,  1900,  1903,  1908,  1912,  1920,  1935,  1941,  1948,  1961,
+  1973,  1988,  1992,  2009,  2014,  2017,  2022,  2044,  2049,  2054,
+  2060,  2066,  2074,  2082,  2090,  2097,  2107,  2112,  2142,  2144,
+  2147,  2154,  2160,  2162,  2163,  2164,  2167,  2169,  2170,  2173,
+  2178,  2185,  2192,  2194,  2199
 };
 #endif
 
@@ -457,7 +456,7 @@
 "FieldSpec","ClassField","optWithSyntax","WithSyntax","@3","WithSyntaxList",
 "WithSyntaxToken","ExtensionAndException","Type","NSTD_IndirectMarker","TypeDeclaration",
 "TypeDeclarationSet","ComplexTypeReference","ComplexTypeReferenceAmpList","ComplexTypeReferenceElement",
-"ClassFieldIdentifier","ClassFieldName","FieldName","DefinedObjectClass","ValueDefinition",
+"PrimitiveFieldReference","FieldName","DefinedObjectClass","ValueDefinition",
 "Value","@4","DefinedValue","RestrictedCharacterStringValue","Opaque","BasicTypeId",
 "BasicTypeId_UniverationCompatible","BasicType","BasicString","Union","Intersection",
 "Except","optConstraints","Constraints","SetOfConstraints","ElementSetSpecs",
@@ -485,22 +484,22 @@
    163,   163,   164,   164,   164,   164,   165,   165,   165,   166,
    167,   168,   169,   169,   169,   169,   169,   169,   169,   169,
    169,   169,   169,   170,   170,   170,   170,   170,   170,   171,
-   171,   172,   173,   174,   174,   175,   175,   175,   176,   177,
-   178,   179,   178,   178,   178,   178,   178,   178,   178,   178,
-   178,   180,   180,   181,   181,   181,   182,   182,   183,   183,
-   183,   183,   183,   183,   183,   183,   183,   183,   183,   183,
-   183,   184,   184,   184,   185,   185,   186,   186,   186,   186,
-   186,   186,   186,   186,   186,   186,   186,   186,   186,   186,
-   187,   187,   188,   188,   189,   190,   190,   191,   191,   192,
-   192,   193,   193,   193,   194,   194,   194,   194,   194,   195,
-   195,   195,   195,   195,   195,   195,   195,   195,   195,   196,
-   195,   197,   197,   197,   197,   198,   198,   199,   199,   199,
-   199,   199,   200,   201,   201,   202,   202,   203,   203,   204,
-   204,   205,   205,   205,   206,   206,   207,   208,   209,   209,
-   210,   210,   211,   211,   212,   212,   213,   213,   214,   214,
-   215,   215,   216,   216,   216,   216,   216,   217,   217,   218,
-   218,   219,   220,   221,   221,   221,   221,   222,   222,   222,
-   223,   223,   224,   225,   225,   226
+   171,   172,   173,   173,   174,   174,   174,   175,   176,   177,
+   178,   177,   177,   177,   177,   177,   177,   177,   177,   177,
+   179,   179,   180,   180,   180,   181,   181,   182,   182,   182,
+   182,   182,   182,   182,   182,   182,   182,   182,   182,   182,
+   183,   183,   183,   184,   184,   185,   185,   185,   185,   185,
+   185,   185,   185,   185,   185,   185,   185,   185,   185,   186,
+   186,   187,   187,   188,   189,   189,   190,   190,   191,   191,
+   192,   192,   192,   193,   193,   193,   193,   193,   194,   194,
+   194,   194,   194,   194,   194,   194,   194,   194,   195,   194,
+   196,   196,   196,   196,   197,   197,   198,   198,   198,   198,
+   198,   199,   200,   200,   201,   201,   202,   202,   203,   203,
+   204,   204,   204,   205,   205,   206,   207,   208,   208,   209,
+   209,   210,   210,   211,   211,   212,   212,   213,   213,   214,
+   214,   215,   215,   215,   215,   215,   216,   216,   217,   217,
+   218,   219,   220,   220,   220,   220,   221,   221,   221,   222,
+   222,   223,   224,   224,   225
 };
 
 static const short yyr2[] = {     0,
@@ -517,146 +516,146 @@
      1,     2,     1,     1,     1,     3,     1,     3,     3,     3,
      0,     2,     1,     4,     4,     4,     6,     6,     1,     4,
      4,     1,     3,     1,     3,     3,     3,     1,     3,     1,
-     3,     1,     1,     1,     1,     1,     3,     3,     1,     4,
-     3,     0,     3,     1,     1,     1,     1,     1,     1,     1,
-     1,     1,     3,     1,     1,     1,     1,     2,     1,     1,
-     1,     1,     2,     2,     1,     1,     2,     2,     1,     1,
-     1,     1,     1,     2,     1,     2,     1,     1,     1,     1,
+     3,     1,     1,     1,     1,     3,     3,     1,     4,     3,
+     0,     3,     1,     1,     1,     1,     1,     1,     1,     1,
+     1,     3,     1,     1,     1,     1,     2,     1,     1,     1,
+     1,     2,     2,     1,     1,     2,     2,     1,     1,     1,
+     1,     1,     2,     1,     2,     1,     1,     1,     1,     1,
      1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-     1,     1,     1,     1,     1,     0,     1,     1,     4,     3,
-     4,     1,     3,     5,     1,     3,     3,     3,     3,     4,
-     3,     1,     1,     3,     3,     3,     3,     1,     1,     0,
-     5,     1,     2,     2,     3,     1,     1,     1,     1,     1,
-     1,     1,     1,     3,     5,     1,     3,     1,     3,     0,
-     1,     1,     1,     1,     1,     1,     3,     4,     1,     3,
-     2,     3,     1,     3,     0,     1,     1,     2,     2,     3,
-     1,     3,     1,     4,     4,     1,     1,     1,     1,     0,
-     1,     2,     4,     0,     1,     1,     1,     0,     1,     1,
-     1,     1,     1,     0,     1,     1
+     1,     1,     1,     1,     0,     1,     1,     4,     3,     4,
+     1,     3,     5,     1,     3,     3,     3,     3,     4,     3,
+     1,     1,     3,     3,     3,     3,     1,     1,     0,     5,
+     1,     2,     2,     3,     1,     1,     1,     1,     1,     1,
+     1,     1,     3,     5,     1,     3,     1,     3,     0,     1,
+     1,     1,     1,     1,     1,     3,     4,     1,     3,     2,
+     3,     1,     3,     0,     1,     1,     2,     2,     3,     1,
+     3,     1,     4,     4,     1,     1,     1,     1,     0,     1,
+     2,     4,     0,     1,     1,     1,     0,     1,     1,     1,
+     1,     1,     0,     1,     1
 };
 
 static const short yydefact[] = {     0,
-   281,   282,     1,     2,     5,     3,     0,     0,     6,   286,
+   280,   281,     1,     2,     5,     3,     0,     0,     6,   285,
     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,   177,     0,     0,
-   178,   179,   180,     0,   181,   182,   190,   183,   184,   185,
-   186,   187,   188,   189,     0,    24,    25,    27,    28,    31,
+    18,    21,    19,     0,    17,    12,    23,   176,     0,     0,
+   177,   178,   179,     0,   180,   181,   189,   182,   183,   184,
+   185,   186,   187,   188,     0,    24,    25,    27,    28,    31,
     29,    30,    34,     0,     0,    32,     0,    49,     0,    50,
     52,    54,    36,     0,    37,     0,    42,    44,    46,     4,
-    26,   270,   124,   283,     0,   159,     0,     0,   173,   166,
-   170,   172,   160,     0,     0,   161,   165,   169,     0,     0,
-    57,    58,   162,   171,   128,     0,    33,    48,    47,     0,
-     0,    35,    38,     0,     0,     0,     0,   274,    60,    59,
-   111,   271,   278,     0,   174,   168,   167,   164,   163,     0,
+    26,   269,   124,   282,     0,   158,     0,     0,   172,   165,
+   169,   171,   159,     0,     0,   160,   164,   168,     0,     0,
+    57,    58,   161,   170,   128,     0,    33,    48,    47,     0,
+     0,    35,    38,     0,     0,     0,     0,   273,    60,    59,
+   111,   270,   277,     0,   173,   167,   166,   163,   162,     0,
     62,     0,    64,     0,     0,     0,    51,    53,    39,    43,
-    45,     0,   276,   277,   275,     0,     0,   196,   280,   279,
-   272,   125,   127,     0,     0,     0,     0,    55,   134,   135,
-   129,   130,   132,   126,   147,   154,   148,   268,   155,   156,
-   269,   145,   144,   146,   142,   140,   151,   149,   150,     0,
-   152,    40,    41,   270,   270,     0,    88,     0,   124,   283,
-   119,     0,     0,   196,   196,   112,   122,   175,   162,   113,
-     0,     0,     0,   110,   197,   198,   270,    63,    67,    66,
-    65,     0,     0,     0,     0,     0,   139,   136,     0,   257,
-   255,   255,   255,    90,   256,    86,   255,   255,    97,     0,
-   273,     0,   270,     0,   270,     0,   270,     0,     0,   176,
-   270,     0,     0,     0,   228,   227,     0,   226,   229,     0,
-     0,     0,   231,     0,   202,   205,     0,   212,   213,   219,
-   218,   245,   246,   230,   233,   232,     0,    61,   157,    56,
-   131,   143,   153,   141,   258,    95,     0,    94,    96,    87,
-   255,    92,    93,     0,    85,    98,    89,     0,   107,     0,
-    80,    83,    84,   270,   123,     0,     0,    73,    74,    79,
-   255,   270,   284,     0,   284,   267,   259,     0,   261,   266,
-   263,     0,    68,    70,    71,     0,     0,     0,   222,     0,
-     0,     0,     0,     0,     0,   200,   193,   194,   191,   192,
-     0,     0,     0,   195,     0,     0,     0,     0,     0,   158,
-   137,   138,    91,     0,   120,     0,   114,   270,    82,   270,
-   115,   270,    77,   255,   270,   285,   116,   270,   260,     0,
-     0,   121,   270,   199,   206,   220,   223,   224,   217,   215,
-   234,     0,   247,   211,   203,   207,   208,   209,     0,   216,
-   214,     0,     0,   249,   201,    99,   108,   109,   152,    81,
-    78,    75,    76,   111,   111,   262,     0,     0,    69,     0,
-   225,   238,     0,   236,   196,     0,   210,     0,   251,   253,
-   248,     0,     0,   117,   118,   265,   264,   221,   235,     0,
-   240,   204,   252,     0,   250,   103,   104,     0,     0,   101,
-   105,   133,   237,   243,   244,   242,   239,   241,   254,     0,
-   100,   102,   106,     0,     0,     0
+    45,     0,   275,   276,   274,     0,     0,   195,   279,   278,
+   271,   125,   127,     0,     0,     0,     0,    55,   133,   134,
+   129,   130,   132,   126,   146,   153,   147,   267,   154,   155,
+   268,   144,   143,   145,   141,   139,   150,   148,   149,     0,
+   151,    40,    41,   269,   269,     0,    88,     0,   124,   282,
+   119,     0,     0,   195,   195,   112,   122,   174,   161,   113,
+     0,     0,     0,   110,   196,   197,   269,    63,    67,    66,
+    65,     0,     0,     0,     0,     0,   138,   135,     0,   256,
+   254,   254,   254,    90,   255,    86,   254,   254,    97,     0,
+   272,     0,   269,     0,   269,     0,   269,     0,     0,   175,
+   269,     0,     0,     0,   227,   226,     0,   225,   228,     0,
+     0,     0,   230,     0,   201,   204,     0,   211,   212,   218,
+   217,   244,   245,   229,   232,   231,     0,    61,   156,    56,
+   131,   142,   152,   140,   257,    95,     0,    94,    96,    87,
+   254,    92,    93,     0,    85,    98,    89,     0,   107,     0,
+    80,    83,    84,   269,   123,     0,     0,    73,    74,    79,
+   254,   269,   283,     0,   283,   266,   258,     0,   260,   265,
+   262,     0,    68,    70,    71,     0,     0,     0,   221,     0,
+     0,     0,     0,     0,     0,   199,   192,   193,   190,   191,
+     0,     0,     0,   194,     0,     0,     0,     0,     0,   157,
+   136,   137,    91,     0,   120,     0,   114,   269,    82,   269,
+   115,   269,    77,   254,   269,   284,   116,   269,   259,     0,
+     0,   121,   269,   198,   205,   219,   222,   223,   216,   214,
+   233,     0,   246,   210,   202,   206,   207,   208,     0,   215,
+   213,     0,     0,   248,   200,    99,   108,   109,   151,    81,
+    78,    75,    76,   111,   111,   261,     0,     0,    69,     0,
+   224,   237,     0,   235,   195,     0,   209,     0,   250,   252,
+   247,     0,     0,   117,   118,   264,   263,   220,   234,     0,
+   239,   203,   251,     0,   249,   103,   104,     0,     0,   101,
+   105,   236,   242,   243,   241,   238,   240,   253,     0,   100,
+   102,   106,     0,     0,     0
 };
 
-static const short yydefgoto[] = {   444,
+static const short yydefgoto[] = {   443,
      3,     4,     8,     9,    13,    14,    25,    26,    27,    55,
     56,    57,   107,    58,    74,   183,    75,    76,    77,    59,
     69,    70,    60,   212,   100,    61,   130,   131,   312,   313,
    297,   298,   299,   290,   291,   119,   281,   186,   187,   285,
    286,   413,   429,   430,   300,   301,   147,   148,   196,   101,
-   161,   162,   431,   432,   222,   223,    62,   176,   214,   177,
-   253,   270,   102,   103,   200,   104,   332,   333,   335,   204,
-   205,   206,   254,   255,   256,   400,   321,   257,   258,   259,
-   260,   403,   404,   437,   438,   261,   262,   263,   383,   384,
-   409,   224,   225,   240,   308,   309,   264,   121,   122,   123,
-   146,   151,   265,   105,   355,   266
+   161,   162,   431,   222,   223,    62,   176,   214,   177,   253,
+   270,   102,   103,   200,   104,   332,   333,   335,   204,   205,
+   206,   254,   255,   256,   400,   321,   257,   258,   259,   260,
+   403,   404,   436,   437,   261,   262,   263,   383,   384,   409,
+   224,   225,   240,   308,   309,   264,   121,   122,   123,   146,
+   151,   265,   105,   355,   266
 };
 
 static const short yypact[] = {   223,
 -32768,-32768,   223,-32768,   -76,-32768,    30,    24,-32768,-32768,
 -32768,-32768,    34,-32768,   -61,   247,-32768,-32768,    61,    27,
-    52,    71,    55,    77,    99,   247,-32768,    76,-32768,-32768,
--32768,-32768,-32768,   181,-32768,-32768,   428,-32768,   187,    49,
+    71,    84,   145,   118,   210,   247,-32768,   109,-32768,-32768,
+-32768,-32768,-32768,   199,-32768,-32768,   428,-32768,   212,    49,
 -32768,-32768,-32768,   154,-32768,-32768,-32768,-32768,-32768,-32768,
--32768,-32768,-32768,-32768,   176,   428,-32768,-32768,-32768,-32768,
--32768,-32768,-32768,   352,   581,-32768,   102,-32768,   199,-32768,
-   117,-32768,-32768,    59,-32768,   -26,-32768,   120,-32768,-32768,
--32768,   -15,   112,-32768,   179,-32768,   193,   165,-32768,-32768,
--32768,-32768,-32768,   211,   208,-32768,-32768,-32768,   657,   266,
--32768,-32768,-32768,-32768,   169,   299,-32768,-32768,-32768,   286,
-   200,-32768,-32768,   223,   286,   206,   210,     3,-32768,-32768,
+-32768,-32768,-32768,-32768,   186,   428,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,   352,   581,-32768,   129,-32768,   174,-32768,
+   157,-32768,-32768,    59,-32768,   -26,-32768,   159,-32768,-32768,
+-32768,   -15,   152,-32768,   193,-32768,   204,   218,-32768,-32768,
+-32768,-32768,-32768,   262,   217,-32768,-32768,-32768,   657,   337,
+-32768,-32768,-32768,-32768,   220,   343,-32768,-32768,-32768,   286,
+   244,-32768,-32768,   223,   286,   249,   256,     3,-32768,-32768,
 -32768,-32768,    45,   286,-32768,-32768,-32768,-32768,-32768,   -23,
--32768,   224,   227,   239,   319,   184,-32768,-32768,   -76,-32768,
--32768,   312,-32768,-32768,-32768,   340,   505,    57,-32768,-32768,
--32768,-32768,-32768,   354,   657,   355,   286,-32768,-32768,-32768,
-   246,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
--32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,   259,
-   264,-32768,-32768,   168,    37,    35,-32768,   268,    65,   274,
+-32768,   251,   255,   263,   294,   184,-32768,-32768,   -76,-32768,
+-32768,   297,-32768,-32768,-32768,   359,   505,    57,-32768,-32768,
+-32768,-32768,-32768,   368,   657,   363,   286,-32768,-32768,-32768,
+   259,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,   260,
+   268,-32768,-32768,   168,    37,    32,-32768,   258,    48,   276,
    345,   278,   314,   116,   170,-32768,-32768,-32768,   280,-32768,
    281,   282,   166,-32768,-32768,   285,   275,-32768,-32768,-32768,
--32768,   385,   326,   385,   355,   184,-32768,-32768,   184,-32768,
-    98,    94,    98,-32768,-32768,   303,    94,    98,   298,   312,
--32768,   369,     7,   334,    16,   330,    16,   335,    56,-32768,
-    14,   166,   310,   380,-32768,-32768,   -25,-32768,-32768,   318,
+-32768,   385,   312,   385,   363,   184,-32768,-32768,   184,-32768,
+    98,    94,    98,-32768,-32768,   303,    94,    98,   298,   297,
+-32768,   369,     7,   328,    16,   330,    16,   335,    56,-32768,
+    14,   166,   310,   380,-32768,-32768,   -25,-32768,-32768,   315,
    223,   166,-32768,   301,   203,   324,   316,   -25,-32768,-32768,
 -32768,   305,-32768,-32768,-32768,-32768,   166,-32768,-32768,   421,
--32768,   421,-32768,-32768,-32768,-32768,   344,-32768,-32768,-32768,
-    98,-32768,-32768,   341,-32768,-32768,-32768,   355,   313,   131,
+-32768,   421,-32768,-32768,-32768,-32768,   334,-32768,-32768,-32768,
+    98,-32768,-32768,   341,-32768,-32768,-32768,   363,   313,    35,
 -32768,-32768,-32768,   275,-32768,   356,   323,   322,-32768,-32768,
-    98,   275,   355,   327,   355,-32768,-32768,   141,-32768,-32768,
-   329,   155,-32768,-32768,-32768,   342,   309,   333,   336,   331,
-   235,   347,   337,   343,   348,-32768,-32768,-32768,-32768,-32768,
-   339,   309,   309,-32768,   309,   166,   248,   338,   350,-32768,
--32768,-32768,-32768,   346,-32768,   317,-32768,     7,-32768,   275,
+    98,   275,   363,   327,   363,-32768,-32768,    74,-32768,-32768,
+   329,   131,-32768,-32768,-32768,   326,   309,   333,   336,   339,
+   235,   342,   338,   344,   346,-32768,-32768,-32768,-32768,-32768,
+   347,   309,   309,-32768,   309,   166,   248,   348,   350,-32768,
+-32768,-32768,-32768,   351,-32768,   317,-32768,     7,-32768,   275,
 -32768,    12,-32768,    98,   275,-32768,-32768,   275,-32768,    68,
-   317,-32768,    14,-32768,-32768,-32768,-32768,   349,-32768,-32768,
-   285,     0,-32768,-32768,   351,-32768,-32768,-32768,   358,-32768,
--32768,     6,   177,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
--32768,-32768,-32768,-32768,-32768,-32768,   359,   361,-32768,   385,
--32768,-32768,   201,-32768,    57,   166,-32768,   355,   360,-32768,
--32768,   338,    43,-32768,-32768,-32768,-32768,   421,-32768,     0,
-    10,   267,   360,   355,-32768,-32768,-32768,    43,    38,-32768,
--32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,    18,
--32768,-32768,-32768,   461,   462,-32768
+   317,-32768,    14,-32768,-32768,-32768,-32768,   353,-32768,-32768,
+   285,     0,-32768,-32768,   349,-32768,-32768,-32768,   354,-32768,
+-32768,     6,   141,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,   355,   358,-32768,   385,
+-32768,-32768,   155,-32768,    57,   166,-32768,   363,   340,-32768,
+-32768,   348,    43,-32768,-32768,-32768,-32768,   421,-32768,     0,
+    10,   232,   340,   363,-32768,-32768,-32768,    43,    38,-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,    18,-32768,
+-32768,-32768,   462,   463,-32768
 };
 
 static const short yypgoto[] = {-32768,
--32768,   463,-32768,   325,-32768,   452,-32768,-32768,   446,-32768,
--32768,   417,-32768,-32768,-32768,-32768,   401,-32768,   363,-32768,
--32768,   366,-32768,-32768,   414,-32768,-32768,   328,-32768,   121,
-   250,-32768,   133,-32768,   140,-32768,-32768,-32768,   260,-32768,
--32768,-32768,    64,  -285,  -228,   -80,-32768,   -22,-32768,  -137,
--32768,   276,-32768,  -115,   308,   315,-32768,   -31,-32768,  -207,
-  -109,  -211,   -71,   357,-32768,    -5,-32768,-32768,-32768,  -187,
--32768,   172,  -133,    89,   -45,-32768,   241,-32768,  -242,-32768,
--32768,-32768,    81,-32768,-32768,-32768,-32768,-32768,-32768,    85,
-    95,  -209,-32768,-32768,-32768,   142,  -125,  -148,-32768,-32768,
--32768,-32768,     1,-32768,   202,    -7
+-32768,   466,-32768,   360,-32768,   453,-32768,-32768,   446,-32768,
+-32768,   417,-32768,-32768,-32768,-32768,   401,-32768,   361,-32768,
+-32768,   367,-32768,-32768,   413,-32768,-32768,   332,-32768,   120,
+   242,-32768,   132,-32768,   137,-32768,-32768,-32768,   264,-32768,
+-32768,-32768,    60,  -327,  -228,   -80,-32768,   -34,-32768,  -137,
+-32768,   277,  -115,   304,   307,-32768,   -31,-32768,  -207,  -109,
+  -211,   -71,   357,-32768,    -5,-32768,-32768,-32768,  -187,-32768,
+   171,  -133,    89,   -45,-32768,   239,-32768,  -242,-32768,-32768,
+-32768,    80,-32768,-32768,-32768,-32768,-32768,-32768,    90,    93,
+  -209,-32768,-32768,-32768,   143,  -125,  -148,-32768,-32768,-32768,
+-32768,     1,-32768,   200,    -7
 };
 
 
@@ -666,55 +665,55 @@
 static const short yytable[] = {    15,
      5,   120,   272,     5,   292,    15,   236,   238,    10,   197,
    179,   276,   278,   279,    10,    10,   117,   282,   283,   163,
-    10,   426,    10,   114,    10,   143,   178,   132,   434,    65,
+    10,   426,    10,   114,    10,   143,   178,   132,   433,    65,
      7,    63,    72,   159,   160,   427,    79,    64,    10,    11,
     71,   426,    10,    11,    78,   296,   426,    19,    65,   296,
     63,   217,   218,   159,   160,   427,    64,    10,   159,   160,
    427,    16,     1,     2,    10,   168,    79,    10,   171,    67,
     28,   343,     1,     2,    78,   198,    10,   168,   370,   319,
-   171,   144,   435,   132,   154,   115,   436,    29,   155,   149,
+   171,   144,   434,   132,   154,   115,   435,    29,   155,   149,
    179,   353,   320,   179,   381,   145,   295,   163,   118,   133,
-   150,    34,    72,   221,   226,   402,   178,    79,   316,   178,
-    71,    32,   289,   310,   139,    78,   153,   289,   325,   292,
+   150,   441,    72,   221,   226,   402,   178,    79,   316,   178,
+    71,   441,   289,   310,   139,    78,   153,   289,   325,   292,
    118,   289,   408,   -72,   152,   118,   268,   118,   181,   118,
-   219,   428,   443,   339,   219,   164,   180,    12,   387,    30,
-   202,    17,   229,   442,   393,   441,   230,   201,   209,   211,
-   118,   428,   293,   397,   442,   133,   428,   210,    31,    68,
-   314,   306,    10,   307,    33,   203,   220,     1,     2,   112,
-   220,  -281,   166,   306,    10,   168,   169,   170,   171,     1,
-     2,   124,   217,   218,   274,    36,   243,   275,   418,   165,
+   219,   428,   442,   339,   219,   164,   180,    12,   387,   229,
+   202,    17,   347,   230,   393,   440,   348,   201,   209,   211,
+   118,   428,   293,   397,  -280,   133,   428,   210,    30,    68,
+   314,   306,    10,   307,   124,   203,   220,     1,     2,   112,
+   220,    31,   166,   306,    10,   168,   169,   170,   171,     1,
+     2,   359,   217,   218,   274,   360,   243,   275,   418,   165,
    166,   167,    10,   168,   169,   170,   171,     1,     2,   202,
-   244,    66,   379,    73,   219,    37,   394,   273,   181,   395,
-   277,   181,   108,   349,   245,   246,   180,   421,    80,   180,
-   388,   354,   235,   111,   203,   294,   116,   302,   124,   302,
-   247,   311,   172,   315,   310,   398,     1,     2,   347,   127,
-   220,   166,   348,    10,   168,   169,   170,   171,   359,   248,
-   173,   324,   360,   202,   166,   249,    10,   168,   169,   170,
-   171,    20,   362,   125,   250,   128,   363,   293,   134,   391,
-    21,   365,   251,   174,   252,  -255,   237,   126,   203,  -255,
-   345,   118,   314,   245,   411,   135,   376,   377,   412,   378,
-   175,    22,   129,    23,    10,   356,   245,   356,   369,     1,
-     2,   136,    24,   327,   328,   329,   330,   138,   419,   109,
-   110,   380,   420,   141,   331,   166,   142,    10,   168,   169,
-   170,   171,     1,     2,   249,    10,   168,   184,   185,   171,
-     1,     2,     1,     2,   159,   160,   156,   249,   389,   157,
-   294,   159,   160,   244,   302,   158,   180,    83,    84,   188,
-   322,   323,   311,   389,    82,   315,   207,   245,   246,   341,
-   342,   180,   213,    10,   405,    83,    84,   327,   328,   329,
-   330,   414,   415,   247,   410,   215,   216,    85,    38,    86,
-  -282,    87,   231,   232,   233,   234,   239,   241,   118,   269,
+   244,    32,   379,    73,   219,    33,   394,   273,   181,   395,
+   277,   181,    34,   349,   245,   246,   180,   421,    36,   180,
+   388,   354,   235,    37,   203,   294,    66,   302,    80,   302,
+   247,   311,   172,   315,   310,   398,     1,     2,   362,   108,
+   220,   166,   363,    10,   168,   169,   170,   171,   411,   248,
+   173,   324,   412,   202,   166,   249,    10,   168,   169,   170,
+   171,    20,   419,   111,   250,   116,   420,   293,   124,   391,
+    21,   365,   251,   174,   252,  -254,   237,   125,   203,  -254,
+   345,   118,   314,   245,   109,   110,   376,   377,   126,   378,
+   175,    22,   127,    23,    10,   356,   245,   356,   369,     1,
+     2,   129,    24,   327,   328,   329,   330,     1,     2,   159,
+   160,   380,   184,   185,   331,   166,   128,    10,   168,   169,
+   170,   171,     1,     2,   249,    10,   168,   159,   160,   171,
+     1,     2,   327,   328,   329,   330,   135,   249,   389,   134,
+   294,    83,    84,   244,   302,   136,   180,   322,   323,   341,
+   342,   138,   311,   389,    82,   315,   141,   245,   246,   414,
+   415,   180,   142,   156,   405,    83,    84,   157,   188,   158,
+   207,    10,   231,   247,   410,   213,   215,    85,    38,    86,
+   216,    87,  -281,   232,   233,   234,   239,   241,   118,   269,
    242,    88,   248,   267,   280,    89,   284,   288,   249,    90,
    410,   303,    91,    41,    42,    43,   305,   250,   318,   317,
-   326,   338,   405,    92,    45,   251,   439,   252,    93,    46,
+   326,   338,   405,    92,    45,   251,   438,   252,    93,    46,
     94,    47,    95,   334,   336,   340,   344,   350,   346,    48,
-   351,    96,    97,   352,   357,   368,    10,   361,    49,   366,
-    50,     1,     2,   372,   375,    51,    98,    52,    53,    54,
-   373,   364,   386,   367,    38,   203,   382,   374,    99,   385,
-   445,   446,   406,   182,    18,     6,   401,   407,   416,    39,
-   417,    35,    81,    40,   113,   137,   424,   140,   106,    41,
-    42,    43,   208,   399,   392,    44,   304,   390,   271,   287,
-    45,   440,   227,   371,   422,    46,   425,    47,   337,   228,
-   433,   396,   423,   199,     0,    48,   358,     0,     0,     0,
+   351,    96,    97,   352,   357,   364,    10,   361,    49,   366,
+    50,     1,     2,   368,   372,    51,    98,    52,    53,    54,
+   203,   373,   375,   367,    38,   374,   424,   386,    99,   385,
+   406,   444,   445,   407,   416,    18,   382,   417,     6,    39,
+   401,    35,    81,    40,   113,   140,   137,   106,   304,    41,
+    42,    43,   399,   392,   390,    44,   208,   439,   227,   271,
+    45,   228,   371,   287,   422,    46,   337,    47,   182,   432,
+   423,   425,   396,   199,   358,    48,     0,     0,     0,     0,
      0,     0,     0,     0,    49,     0,    50,     0,   189,   190,
      0,    51,     0,    52,    53,    54,   191,     0,     0,     0,
     85,    38,    86,     0,    87,   192,     0,     0,     0,     0,
@@ -753,47 +752,47 @@
     10,   281,    14,    15,    74,   147,     9,    10,   321,   105,
     13,    79,    73,   155,   108,   112,    77,    61,   112,    45,
    216,   301,   118,   219,   337,    93,   234,   213,   114,    99,
-    56,     3,   110,   184,   185,   106,   216,   115,   242,   219,
-   110,    57,   106,   239,   114,   115,   124,   106,   252,   348,
+    56,   429,   110,   184,   185,   106,   216,   115,   242,   219,
+   110,   439,   106,   239,   114,   115,   124,   106,   252,   348,
    114,   106,   117,   108,   124,   114,   207,   114,   136,   114,
-    37,   114,   115,   267,    37,   135,   136,   108,   346,    88,
-    84,   108,   108,   429,   354,   108,   112,   147,   156,   157,
-   114,   114,   233,   361,   440,   155,   114,   157,    88,   111,
-   241,   106,     9,   108,    88,   109,    73,    14,    15,   111,
-    73,   107,     7,   106,     9,    10,    11,    12,    13,    14,
-    15,   117,    15,    16,   216,   110,    21,   219,   400,     6,
+    37,   114,   115,   267,    37,   135,   136,   108,   346,   108,
+    84,   108,   108,   112,   354,   108,   112,   147,   156,   157,
+   114,   114,   233,   361,   107,   155,   114,   157,    88,   111,
+   241,   106,     9,   108,   117,   109,    73,    14,    15,   111,
+    73,    88,     7,   106,     9,    10,    11,    12,    13,    14,
+    15,   108,    15,    16,   216,   112,    21,   219,   400,     6,
      7,     8,     9,    10,    11,    12,    13,    14,    15,    84,
-    35,    15,   336,    50,    37,    25,   355,   215,   216,   358,
-   117,   219,   111,   294,    49,    50,   216,   405,    43,   219,
-   346,   302,   107,   107,   109,   233,   107,   235,   117,   237,
-    65,   239,    49,   241,   360,   361,    14,    15,   108,    75,
+    35,    57,   336,    50,    37,    88,   355,   215,   216,   358,
+   117,   219,     3,   294,    49,    50,   216,   405,   110,   219,
+   346,   302,   107,    25,   109,   233,    15,   235,    43,   237,
+    65,   239,    49,   241,   360,   361,    14,    15,   108,   111,
     73,     7,   112,     9,    10,    11,    12,    13,   108,    84,
     67,   251,   112,    84,     7,    90,     9,    10,    11,    12,
-    13,    15,   108,    85,    99,    55,   112,   348,     3,   350,
+    13,    15,   108,   107,    99,   107,   112,   348,   117,   350,
     24,   317,   107,    90,   109,   108,   107,    85,   109,   112,
-   288,   114,   363,    49,   108,   117,   332,   333,   112,   335,
-   107,    45,    85,    47,     9,   303,    49,   305,    64,    14,
-    15,     3,    56,   101,   102,   103,   104,   108,   108,   111,
-   112,    64,   112,   108,   112,     7,   107,     9,    10,    11,
+   288,   114,   363,    49,   111,   112,   332,   333,    85,   335,
+   107,    45,    75,    47,     9,   303,    49,   305,    64,    14,
+    15,    85,    56,   101,   102,   103,   104,    14,    15,    16,
+    17,    64,    16,    17,   112,     7,    55,     9,    10,    11,
     12,    13,    14,    15,    90,     9,    10,    16,    17,    13,
-    14,    15,    14,    15,    16,    17,   113,    90,   346,   113,
-   348,    16,    17,    35,   352,   107,   346,    14,    15,    10,
-    33,    34,   360,   361,     3,   363,     3,    49,    50,    16,
-    17,   361,   117,     9,   372,    14,    15,   101,   102,   103,
-   104,   394,   395,    65,   382,   117,   113,    26,    27,    28,
-   107,    30,   115,    39,   107,    72,   107,   107,   114,     5,
+    14,    15,   101,   102,   103,   104,   117,    90,   346,     3,
+   348,    14,    15,    35,   352,     3,   346,    33,    34,    16,
+    17,   108,   360,   361,     3,   363,   108,    49,    50,   394,
+   395,   361,   107,   113,   372,    14,    15,   113,    10,   107,
+     3,     9,   115,    65,   382,   117,   117,    26,    27,    28,
+   113,    30,   107,    39,   107,    72,   107,   107,   114,     5,
    109,    40,    84,   109,    92,    44,    99,    29,    90,    48,
    408,    72,    51,    52,    53,    54,    72,    99,    29,   100,
    110,   107,   420,    62,    63,   107,   424,   109,    67,    68,
     69,    70,    71,   100,   109,     5,    86,    72,   116,    78,
-   108,    80,    81,   112,   108,   105,     9,   109,    87,   107,
-    89,    14,    15,   107,   106,    94,    95,    96,    97,    98,
-   108,   110,   107,   118,    27,   109,   119,   110,   107,   110,
-     0,     0,   112,   139,    13,     3,   118,   110,   110,    42,
-   110,    26,    56,    46,    74,   110,   117,   115,    65,    52,
-    53,    54,   155,   363,   352,    58,   237,   348,   213,   230,
-    63,   428,   185,   322,   406,    68,   412,    70,   258,   185,
-   420,   360,   408,   147,    -1,    78,   305,    -1,    -1,    -1,
+   108,    80,    81,   112,   108,   110,     9,   109,    87,   107,
+    89,    14,    15,   105,   107,    94,    95,    96,    97,    98,
+   109,   108,   106,   118,    27,   110,   117,   107,   107,   110,
+   112,     0,     0,   110,   110,    13,   119,   110,     3,    42,
+   118,    26,    56,    46,    74,   115,   110,    65,   237,    52,
+    53,    54,   363,   352,   348,    58,   155,   428,   185,   213,
+    63,   185,   322,   230,   406,    68,   258,    70,   139,   420,
+   408,   412,   360,   147,   305,    78,    -1,    -1,    -1,    -1,
     -1,    -1,    -1,    -1,    87,    -1,    89,    -1,    14,    15,
     -1,    94,    -1,    96,    97,    98,    22,    -1,    -1,    -1,
     26,    27,    28,    -1,    30,    31,    -1,    -1,    -1,    -1,
@@ -1364,13 +1363,13 @@
   switch (yyn) {
 
 case 1:
-#line 325 "asn1p_y.y"
+#line 324 "asn1p_y.y"
 {
 		*(void **)param = yyvsp[0].a_grammar;
 	;
     break;}
 case 2:
-#line 331 "asn1p_y.y"
+#line 330 "asn1p_y.y"
 {
 		yyval.a_grammar = asn1p_new();
 		checkmem(yyval.a_grammar);
@@ -1378,14 +1377,14 @@
 	;
     break;}
 case 3:
-#line 336 "asn1p_y.y"
+#line 335 "asn1p_y.y"
 {
 		yyval.a_grammar = yyvsp[-1].a_grammar;
 		TQ_ADD(&(yyval.a_grammar->modules), yyvsp[0].a_module, mod_next);
 	;
     break;}
 case 4:
-#line 357 "asn1p_y.y"
+#line 356 "asn1p_y.y"
 {
 
 		if(yyvsp[-1].a_module) {
@@ -1402,27 +1401,27 @@
 	;
     break;}
 case 5:
-#line 378 "asn1p_y.y"
+#line 377 "asn1p_y.y"
 { yyval.a_oid = 0; ;
     break;}
 case 6:
-#line 379 "asn1p_y.y"
+#line 378 "asn1p_y.y"
 { yyval.a_oid = yyvsp[0].a_oid; ;
     break;}
 case 7:
-#line 383 "asn1p_y.y"
+#line 382 "asn1p_y.y"
 {
 		yyval.a_oid = yyvsp[-1].a_oid;
 	;
     break;}
 case 8:
-#line 386 "asn1p_y.y"
+#line 385 "asn1p_y.y"
 {
 		yyval.a_oid = 0;
 	;
     break;}
 case 9:
-#line 392 "asn1p_y.y"
+#line 391 "asn1p_y.y"
 {
 		yyval.a_oid = asn1p_oid_new();
 		asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc);
@@ -1431,7 +1430,7 @@
 	;
     break;}
 case 10:
-#line 398 "asn1p_y.y"
+#line 397 "asn1p_y.y"
 {
 		yyval.a_oid = yyvsp[-1].a_oid;
 		asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc);
@@ -1440,74 +1439,74 @@
 	;
     break;}
 case 11:
-#line 407 "asn1p_y.y"
+#line 406 "asn1p_y.y"
 {					/* iso */
 		yyval.a_oid_arc.name = yyvsp[0].tv_str;
 		yyval.a_oid_arc.number = -1;
 	;
     break;}
 case 12:
-#line 411 "asn1p_y.y"
+#line 410 "asn1p_y.y"
 {		/* iso(1) */
 		yyval.a_oid_arc.name = yyvsp[-3].tv_str;
 		yyval.a_oid_arc.number = yyvsp[-1].a_int;
 	;
     break;}
 case 13:
-#line 415 "asn1p_y.y"
+#line 414 "asn1p_y.y"
 {					/* 1 */
 		yyval.a_oid_arc.name = 0;
 		yyval.a_oid_arc.number = yyvsp[0].a_int;
 	;
     break;}
 case 14:
-#line 425 "asn1p_y.y"
+#line 424 "asn1p_y.y"
 { yyval.a_module_flags = MSF_NOFLAGS; ;
     break;}
 case 15:
-#line 426 "asn1p_y.y"
+#line 425 "asn1p_y.y"
 {
 		yyval.a_module_flags = yyvsp[0].a_module_flags;
 	;
     break;}
 case 16:
-#line 435 "asn1p_y.y"
+#line 434 "asn1p_y.y"
 {
 		yyval.a_module_flags = yyvsp[0].a_module_flags;
 	;
     break;}
 case 17:
-#line 438 "asn1p_y.y"
+#line 437 "asn1p_y.y"
 {
 		yyval.a_module_flags = yyvsp[-1].a_module_flags | yyvsp[0].a_module_flags;
 	;
     break;}
 case 18:
-#line 447 "asn1p_y.y"
+#line 446 "asn1p_y.y"
 {
 		yyval.a_module_flags = MSF_EXPLICIT_TAGS;
 	;
     break;}
 case 19:
-#line 450 "asn1p_y.y"
+#line 449 "asn1p_y.y"
 {
 		yyval.a_module_flags = MSF_IMPLICIT_TAGS;
 	;
     break;}
 case 20:
-#line 453 "asn1p_y.y"
+#line 452 "asn1p_y.y"
 {
 		yyval.a_module_flags = MSF_AUTOMATIC_TAGS;
 	;
     break;}
 case 21:
-#line 456 "asn1p_y.y"
+#line 455 "asn1p_y.y"
 {
 		yyval.a_module_flags = MSF_EXTENSIBILITY_IMPLIED;
 	;
     break;}
 case 22:
-#line 460 "asn1p_y.y"
+#line 459 "asn1p_y.y"
 {
 		/* X.680Amd1 specifies TAG and XER */
 		if(strcmp(yyvsp[-1].tv_str, "TAG") == 0) {
@@ -1525,23 +1524,23 @@
 	;
     break;}
 case 23:
-#line 481 "asn1p_y.y"
+#line 480 "asn1p_y.y"
 { yyval.a_module = 0; ;
     break;}
 case 24:
-#line 482 "asn1p_y.y"
+#line 481 "asn1p_y.y"
 {
 		yyval.a_module = yyvsp[0].a_module;
 	;
     break;}
 case 25:
-#line 491 "asn1p_y.y"
+#line 490 "asn1p_y.y"
 {
 		yyval.a_module = yyvsp[0].a_module;
 	;
     break;}
 case 26:
-#line 494 "asn1p_y.y"
+#line 493 "asn1p_y.y"
 {
 		yyval.a_module = yyvsp[-1].a_module;
 
@@ -1571,13 +1570,13 @@
 	;
     break;}
 case 27:
-#line 527 "asn1p_y.y"
+#line 526 "asn1p_y.y"
 {
 		yyval.a_module = yyvsp[0].a_module;
 	;
     break;}
 case 28:
-#line 530 "asn1p_y.y"
+#line 529 "asn1p_y.y"
 {
 		yyval.a_module = asn1p_module_new();
 		checkmem(yyval.a_module);
@@ -1589,7 +1588,7 @@
 	;
     break;}
 case 29:
-#line 539 "asn1p_y.y"
+#line 538 "asn1p_y.y"
 {
 		yyval.a_module = asn1p_module_new();
 		checkmem(yyval.a_module);
@@ -1599,7 +1598,7 @@
 	;
     break;}
 case 30:
-#line 546 "asn1p_y.y"
+#line 545 "asn1p_y.y"
 {
 		yyval.a_module = asn1p_module_new();
 		checkmem(yyval.a_module);
@@ -1609,7 +1608,7 @@
 	;
     break;}
 case 31:
-#line 559 "asn1p_y.y"
+#line 558 "asn1p_y.y"
 {
 		yyval.a_module = asn1p_module_new();
 		checkmem(yyval.a_module);
@@ -1619,11 +1618,11 @@
 	;
     break;}
 case 32:
-#line 567 "asn1p_y.y"
+#line 566 "asn1p_y.y"
 { asn1p_lexer_hack_push_encoding_control(); ;
     break;}
 case 33:
-#line 568 "asn1p_y.y"
+#line 567 "asn1p_y.y"
 {
 		fprintf(stderr,
 			"WARNING: ENCODING-CONTROL %s "
@@ -1634,7 +1633,7 @@
 	;
     break;}
 case 34:
-#line 580 "asn1p_y.y"
+#line 579 "asn1p_y.y"
 {
 		return yyerror(
 			"Attempt to redefine a standard basic string type, "
@@ -1642,7 +1641,7 @@
 	;
     break;}
 case 35:
-#line 593 "asn1p_y.y"
+#line 592 "asn1p_y.y"
 {
 		if(!saved_aid && 0)
 			return yyerror("Unterminated IMPORTS FROM, "
@@ -1652,13 +1651,13 @@
 	;
     break;}
 case 36:
-#line 603 "asn1p_y.y"
+#line 602 "asn1p_y.y"
 {
 		return yyerror("Empty IMPORTS list");
 	;
     break;}
 case 37:
-#line 609 "asn1p_y.y"
+#line 608 "asn1p_y.y"
 {
 		yyval.a_module = asn1p_module_new();
 		checkmem(yyval.a_module);
@@ -1666,22 +1665,22 @@
 	;
     break;}
 case 38:
-#line 614 "asn1p_y.y"
+#line 613 "asn1p_y.y"
 {
 		yyval.a_module = yyvsp[-1].a_module;
 		TQ_ADD(&(yyval.a_module->imports), yyvsp[0].a_xports, xp_next);
 	;
     break;}
 case 39:
-#line 621 "asn1p_y.y"
+#line 620 "asn1p_y.y"
 { memset(&yyval.a_aid, 0, sizeof(yyval.a_aid)); ;
     break;}
 case 40:
-#line 622 "asn1p_y.y"
+#line 621 "asn1p_y.y"
 { yyval.a_aid.oid = yyvsp[0].a_oid; ;
     break;}
 case 41:
-#line 626 "asn1p_y.y"
+#line 625 "asn1p_y.y"
 {
 		yyval.a_xports = yyvsp[-3].a_xports;
 		yyval.a_xports->fromModuleName = yyvsp[-1].tv_str;
@@ -1692,7 +1691,7 @@
 	;
     break;}
 case 42:
-#line 637 "asn1p_y.y"
+#line 636 "asn1p_y.y"
 {
 		yyval.a_xports = asn1p_xports_new();
 		checkmem(yyval.a_xports);
@@ -1700,14 +1699,14 @@
 	;
     break;}
 case 43:
-#line 642 "asn1p_y.y"
+#line 641 "asn1p_y.y"
 {
 		yyval.a_xports = yyvsp[-2].a_xports;
 		TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next);
 	;
     break;}
 case 44:
-#line 649 "asn1p_y.y"
+#line 648 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -1716,7 +1715,7 @@
 	;
     break;}
 case 45:
-#line 655 "asn1p_y.y"
+#line 654 "asn1p_y.y"
 {		/* Completely equivalent to above */
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -1725,7 +1724,7 @@
 	;
     break;}
 case 46:
-#line 661 "asn1p_y.y"
+#line 660 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -1734,19 +1733,19 @@
 	;
     break;}
 case 47:
-#line 670 "asn1p_y.y"
+#line 669 "asn1p_y.y"
 {
 		yyval.a_xports = yyvsp[-1].a_xports;
 	;
     break;}
 case 48:
-#line 673 "asn1p_y.y"
+#line 672 "asn1p_y.y"
 {
 		yyval.a_xports = 0;
 	;
     break;}
 case 49:
-#line 676 "asn1p_y.y"
+#line 675 "asn1p_y.y"
 {
 		/* Empty EXPORTS clause effectively prohibits export. */
 		yyval.a_xports = asn1p_xports_new();
@@ -1754,7 +1753,7 @@
 	;
     break;}
 case 50:
-#line 684 "asn1p_y.y"
+#line 683 "asn1p_y.y"
 {
 		yyval.a_xports = asn1p_xports_new();
 		assert(yyval.a_xports);
@@ -1762,14 +1761,14 @@
 	;
     break;}
 case 51:
-#line 689 "asn1p_y.y"
+#line 688 "asn1p_y.y"
 {
 		yyval.a_xports = yyvsp[-2].a_xports;
 		TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next);
 	;
     break;}
 case 52:
-#line 696 "asn1p_y.y"
+#line 695 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -1778,7 +1777,7 @@
 	;
     break;}
 case 53:
-#line 702 "asn1p_y.y"
+#line 701 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -1787,7 +1786,7 @@
 	;
     break;}
 case 54:
-#line 708 "asn1p_y.y"
+#line 707 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -1796,11 +1795,11 @@
 	;
     break;}
 case 55:
-#line 719 "asn1p_y.y"
+#line 718 "asn1p_y.y"
 { asn1p_lexer_hack_push_opaque_state(); ;
     break;}
 case 56:
-#line 719 "asn1p_y.y"
+#line 718 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-4].a_expr;
 		assert(yyval.a_expr->Identifier == 0);
@@ -1810,7 +1809,7 @@
 	;
     break;}
 case 57:
-#line 729 "asn1p_y.y"
+#line 728 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -1820,7 +1819,7 @@
 	;
     break;}
 case 58:
-#line 736 "asn1p_y.y"
+#line 735 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -1829,7 +1828,7 @@
 	;
     break;}
 case 59:
-#line 754 "asn1p_y.y"
+#line 753 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[0].a_expr;
 		yyval.a_expr->Identifier = yyvsp[-2].tv_str;
@@ -1838,7 +1837,7 @@
 	;
     break;}
 case 60:
-#line 760 "asn1p_y.y"
+#line 759 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[0].a_expr;
 		yyval.a_expr->Identifier = yyvsp[-2].tv_str;
@@ -1847,7 +1846,7 @@
 	;
     break;}
 case 61:
-#line 776 "asn1p_y.y"
+#line 775 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[0].a_expr;
 		assert(yyval.a_expr->Identifier == 0);
@@ -1857,7 +1856,7 @@
 	;
     break;}
 case 62:
-#line 786 "asn1p_y.y"
+#line 785 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_plist = asn1p_paramlist_new(yylineno);
@@ -1869,7 +1868,7 @@
 	;
     break;}
 case 63:
-#line 795 "asn1p_y.y"
+#line 794 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_plist = yyvsp[-2].a_plist;
@@ -1880,14 +1879,14 @@
 	;
     break;}
 case 64:
-#line 806 "asn1p_y.y"
+#line 805 "asn1p_y.y"
 {
 		yyval.a_parg.governor = NULL;
 		yyval.a_parg.argument = yyvsp[0].tv_str;
 	;
     break;}
 case 65:
-#line 810 "asn1p_y.y"
+#line 809 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_parg.governor = asn1p_ref_new(yylineno);
@@ -1897,7 +1896,7 @@
 	;
     break;}
 case 66:
-#line 817 "asn1p_y.y"
+#line 816 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_parg.governor = asn1p_ref_new(yylineno);
@@ -1907,7 +1906,7 @@
 	;
     break;}
 case 67:
-#line 824 "asn1p_y.y"
+#line 823 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_parg.governor = asn1p_ref_new(yylineno);
@@ -1918,7 +1917,7 @@
 	;
     break;}
 case 68:
-#line 835 "asn1p_y.y"
+#line 834 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -1926,20 +1925,20 @@
 	;
     break;}
 case 69:
-#line 840 "asn1p_y.y"
+#line 839 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
 	;
     break;}
 case 70:
-#line 847 "asn1p_y.y"
+#line 846 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[0].a_expr;
 	;
     break;}
 case 71:
-#line 850 "asn1p_y.y"
+#line 849 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -1949,15 +1948,15 @@
 	;
     break;}
 case 72:
-#line 874 "asn1p_y.y"
+#line 873 "asn1p_y.y"
 { yyval.a_expr = asn1p_expr_new(yylineno); ;
     break;}
 case 73:
-#line 875 "asn1p_y.y"
+#line 874 "asn1p_y.y"
 { yyval.a_expr = yyvsp[0].a_expr; ;
     break;}
 case 74:
-#line 878 "asn1p_y.y"
+#line 877 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -1965,14 +1964,14 @@
 	;
     break;}
 case 75:
-#line 883 "asn1p_y.y"
+#line 882 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
 	;
     break;}
 case 76:
-#line 890 "asn1p_y.y"
+#line 889 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-1].a_expr;
 		assert(yyval.a_expr->Identifier == 0);
@@ -1982,7 +1981,7 @@
 	;
     break;}
 case 77:
-#line 897 "asn1p_y.y"
+#line 896 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-1].a_expr;
 		yyvsp[0].a_marker.flags |= yyval.a_expr->marker.flags;
@@ -1991,7 +1990,7 @@
 	;
     break;}
 case 78:
-#line 903 "asn1p_y.y"
+#line 902 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2001,13 +2000,13 @@
 	;
     break;}
 case 79:
-#line 910 "asn1p_y.y"
+#line 909 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[0].a_expr;
 	;
     break;}
 case 80:
-#line 916 "asn1p_y.y"
+#line 915 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2015,14 +2014,14 @@
 	;
     break;}
 case 81:
-#line 921 "asn1p_y.y"
+#line 920 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
 	;
     break;}
 case 82:
-#line 928 "asn1p_y.y"
+#line 927 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[0].a_expr;
 		assert(yyval.a_expr->Identifier == 0);
@@ -2030,20 +2029,20 @@
 	;
     break;}
 case 83:
-#line 933 "asn1p_y.y"
+#line 932 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[0].a_expr;
 	;
     break;}
 case 84:
-#line 936 "asn1p_y.y"
+#line 935 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[0].a_expr;
 		_fixup_anonymous_identifier(yyval.a_expr);
 	;
     break;}
 case 85:
-#line 943 "asn1p_y.y"
+#line 942 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		checkmem(yyval.a_expr);
@@ -2053,15 +2052,15 @@
 	;
     break;}
 case 86:
-#line 953 "asn1p_y.y"
+#line 952 "asn1p_y.y"
 { yyval.a_int = 0; ;
     break;}
 case 87:
-#line 954 "asn1p_y.y"
+#line 953 "asn1p_y.y"
 { yyval.a_int = 1; ;
     break;}
 case 88:
-#line 958 "asn1p_y.y"
+#line 957 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2071,14 +2070,14 @@
 	;
     break;}
 case 89:
-#line 965 "asn1p_y.y"
+#line 964 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
 	;
     break;}
 case 90:
-#line 975 "asn1p_y.y"
+#line 974 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2089,7 +2088,7 @@
 	;
     break;}
 case 91:
-#line 985 "asn1p_y.y"
+#line 984 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		yyval.a_expr->Identifier = yyvsp[-3].tv_str;
@@ -2101,7 +2100,7 @@
 	;
     break;}
 case 92:
-#line 996 "asn1p_y.y"
+#line 995 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		yyval.a_expr->Identifier = yyvsp[-2].tv_str;
@@ -2112,7 +2111,7 @@
 	;
     break;}
 case 93:
-#line 1006 "asn1p_y.y"
+#line 1005 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2124,7 +2123,7 @@
 	;
     break;}
 case 94:
-#line 1017 "asn1p_y.y"
+#line 1016 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		yyval.a_expr->Identifier = yyvsp[-2].tv_str;
@@ -2135,7 +2134,7 @@
 	;
     break;}
 case 95:
-#line 1027 "asn1p_y.y"
+#line 1026 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2147,7 +2146,7 @@
 	;
     break;}
 case 96:
-#line 1038 "asn1p_y.y"
+#line 1037 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2159,72 +2158,67 @@
 	;
     break;}
 case 97:
-#line 1050 "asn1p_y.y"
+#line 1049 "asn1p_y.y"
 { yyval.a_wsynt = 0; ;
     break;}
 case 98:
-#line 1051 "asn1p_y.y"
+#line 1050 "asn1p_y.y"
 {
 		yyval.a_wsynt = yyvsp[0].a_wsynt;
 	;
     break;}
 case 99:
-#line 1058 "asn1p_y.y"
+#line 1057 "asn1p_y.y"
 { asn1p_lexer_hack_enable_with_syntax(); ;
     break;}
 case 100:
-#line 1060 "asn1p_y.y"
+#line 1059 "asn1p_y.y"
 {
 		yyval.a_wsynt = yyvsp[-1].a_wsynt;
 	;
     break;}
 case 101:
-#line 1066 "asn1p_y.y"
+#line 1065 "asn1p_y.y"
 {
 		yyval.a_wsynt = asn1p_wsyntx_new();
 		TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next);
 	;
     break;}
 case 102:
-#line 1070 "asn1p_y.y"
+#line 1069 "asn1p_y.y"
 {
 		yyval.a_wsynt = yyvsp[-1].a_wsynt;
 		TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next);
 	;
     break;}
 case 103:
-#line 1077 "asn1p_y.y"
+#line 1076 "asn1p_y.y"
 {
 		yyval.a_wchunk = asn1p_wsyntx_chunk_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0);
 		yyval.a_wchunk->type = WC_WHITESPACE;
 	;
     break;}
 case 104:
-#line 1081 "asn1p_y.y"
+#line 1080 "asn1p_y.y"
 {
 		yyval.a_wchunk = asn1p_wsyntx_chunk_frombuf(yyvsp[0].tv_str, strlen(yyvsp[0].tv_str), 0);
 	;
     break;}
 case 105:
-#line 1084 "asn1p_y.y"
+#line 1083 "asn1p_y.y"
 {
-		asn1p_ref_t *ref;
-		int ret;
-		ref = asn1p_ref_new(yylineno);
-		checkmem(ref);
-		ret = asn1p_ref_add_component(ref, yyvsp[0].a_refcomp.name, yyvsp[0].a_refcomp.lex_type);
-		checkmem(ret == 0);
-		yyval.a_wchunk = asn1p_wsyntx_chunk_fromref(ref, 0);
+		yyval.a_wchunk = asn1p_wsyntx_chunk_frombuf(yyvsp[0].a_refcomp.name, strlen(yyvsp[0].a_refcomp.name), 0);
+		yyval.a_wchunk->type = WC_FIELD;
 	;
     break;}
 case 106:
-#line 1093 "asn1p_y.y"
+#line 1087 "asn1p_y.y"
 {
 		yyval.a_wchunk = asn1p_wsyntx_chunk_fromsyntax(yyvsp[-1].a_wsynt);
 	;
     break;}
 case 107:
-#line 1099 "asn1p_y.y"
+#line 1093 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2235,7 +2229,7 @@
 	;
     break;}
 case 108:
-#line 1107 "asn1p_y.y"
+#line 1101 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2247,7 +2241,7 @@
 	;
     break;}
 case 109:
-#line 1116 "asn1p_y.y"
+#line 1110 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2259,7 +2253,7 @@
 	;
     break;}
 case 110:
-#line 1128 "asn1p_y.y"
+#line 1122 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-1].a_expr;
 		yyval.a_expr->tag = yyvsp[-2].a_tag;
@@ -2281,14 +2275,14 @@
 	;
     break;}
 case 111:
-#line 1150 "asn1p_y.y"
+#line 1144 "asn1p_y.y"
 {
 		yyval.a_int = asn1p_as_pointer ? EM_INDIRECT : 0;
 		asn1p_as_pointer = 0;
 	;
     break;}
 case 112:
-#line 1157 "asn1p_y.y"
+#line 1151 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[0].a_expr;
 		yyval.a_expr->marker.flags |= yyvsp[-1].a_int;
@@ -2307,13 +2301,13 @@
 	;
     break;}
 case 113:
-#line 1176 "asn1p_y.y"
+#line 1170 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[0].a_expr;
 	;
     break;}
 case 114:
-#line 1179 "asn1p_y.y"
+#line 1173 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-1].a_expr;
 		assert(yyval.a_expr->expr_type == A1TC_INVALID);
@@ -2322,7 +2316,7 @@
 	;
     break;}
 case 115:
-#line 1185 "asn1p_y.y"
+#line 1179 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-1].a_expr;
 		assert(yyval.a_expr->expr_type == A1TC_INVALID);
@@ -2331,7 +2325,7 @@
 	;
     break;}
 case 116:
-#line 1191 "asn1p_y.y"
+#line 1185 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-1].a_expr;
 		assert(yyval.a_expr->expr_type == A1TC_INVALID);
@@ -2340,7 +2334,7 @@
 	;
     break;}
 case 117:
-#line 1197 "asn1p_y.y"
+#line 1191 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2353,7 +2347,7 @@
 	;
     break;}
 case 118:
-#line 1207 "asn1p_y.y"
+#line 1201 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2366,7 +2360,7 @@
 	;
     break;}
 case 119:
-#line 1217 "asn1p_y.y"
+#line 1211 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2375,7 +2369,7 @@
 	;
     break;}
 case 120:
-#line 1223 "asn1p_y.y"
+#line 1217 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_expr = asn1p_expr_new(yylineno);
@@ -2389,7 +2383,7 @@
 	;
     break;}
 case 121:
-#line 1237 "asn1p_y.y"
+#line 1231 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_expr = yyvsp[-1].a_expr;
@@ -2406,7 +2400,7 @@
 	;
     break;}
 case 122:
-#line 1261 "asn1p_y.y"
+#line 1255 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2416,7 +2410,7 @@
 	;
     break;}
 case 123:
-#line 1268 "asn1p_y.y"
+#line 1262 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2426,7 +2420,7 @@
 	;
     break;}
 case 124:
-#line 1283 "asn1p_y.y"
+#line 1277 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_ref = asn1p_ref_new(yylineno);
@@ -2437,7 +2431,7 @@
 	;
     break;}
 case 125:
-#line 1291 "asn1p_y.y"
+#line 1285 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_ref = asn1p_ref_new(yylineno);
@@ -2450,7 +2444,7 @@
 	;
     break;}
 case 126:
-#line 1301 "asn1p_y.y"
+#line 1295 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_ref = asn1p_ref_new(yylineno);
@@ -2463,7 +2457,7 @@
 	;
     break;}
 case 127:
-#line 1311 "asn1p_y.y"
+#line 1305 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_ref = asn1p_ref_new(yylineno);
@@ -2476,7 +2470,7 @@
 	;
     break;}
 case 128:
-#line 1321 "asn1p_y.y"
+#line 1315 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_ref = asn1p_ref_new(yylineno);
@@ -2487,7 +2481,7 @@
 	;
     break;}
 case 129:
-#line 1329 "asn1p_y.y"
+#line 1323 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_ref = yyvsp[0].a_ref;
@@ -2509,7 +2503,7 @@
 	;
     break;}
 case 130:
-#line 1351 "asn1p_y.y"
+#line 1345 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_ref = asn1p_ref_new(yylineno);
@@ -2520,7 +2514,7 @@
 	;
     break;}
 case 131:
-#line 1359 "asn1p_y.y"
+#line 1353 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_ref = yyvsp[-2].a_ref;
@@ -2529,50 +2523,50 @@
 		checkmem(ret == 0);
 	;
     break;}
-case 134:
-#line 1373 "asn1p_y.y"
+case 133:
+#line 1366 "asn1p_y.y"
 {
 		yyval.a_refcomp.lex_type = RLT_AmpUppercase;
 		yyval.a_refcomp.name = yyvsp[0].tv_str;
 	;
     break;}
-case 135:
-#line 1378 "asn1p_y.y"
+case 134:
+#line 1371 "asn1p_y.y"
 {
 		yyval.a_refcomp.lex_type = RLT_Amplowercase;
 		yyval.a_refcomp.name = yyvsp[0].tv_str;
 	;
     break;}
-case 136:
-#line 1387 "asn1p_y.y"
+case 135:
+#line 1380 "asn1p_y.y"
 {
 		yyval.a_ref = asn1p_ref_new(yylineno);
 		asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_AmpUppercase);
 	;
     break;}
-case 137:
-#line 1391 "asn1p_y.y"
+case 136:
+#line 1384 "asn1p_y.y"
 {
 		yyval.a_ref = yyval.a_ref;
 		asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_AmpUppercase);
 	;
     break;}
-case 138:
-#line 1395 "asn1p_y.y"
+case 137:
+#line 1388 "asn1p_y.y"
 {
 		yyval.a_ref = yyval.a_ref;
 		asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_Amplowercase);
 	;
     break;}
-case 139:
-#line 1402 "asn1p_y.y"
+case 138:
+#line 1395 "asn1p_y.y"
 {
 		yyval.a_ref = asn1p_ref_new(yylineno);
 		asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_CAPITALS);
 	;
     break;}
-case 140:
-#line 1422 "asn1p_y.y"
+case 139:
+#line 1415 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		assert(yyval.a_expr->Identifier == NULL);
@@ -2581,8 +2575,8 @@
 		yyval.a_expr->value = yyvsp[0].a_value;
 	;
     break;}
-case 141:
-#line 1432 "asn1p_y.y"
+case 140:
+#line 1425 "asn1p_y.y"
 {
 		yyval.a_value = asn1p_value_fromint(0);
 		checkmem(yyval.a_value);
@@ -2591,76 +2585,76 @@
 		yyval.a_value->value.choice_identifier.value = yyvsp[0].a_value;
 	;
     break;}
-case 142:
-#line 1439 "asn1p_y.y"
+case 141:
+#line 1432 "asn1p_y.y"
 { asn1p_lexer_hack_push_opaque_state(); ;
     break;}
-case 143:
-#line 1439 "asn1p_y.y"
+case 142:
+#line 1432 "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 144:
-#line 1444 "asn1p_y.y"
+case 143:
+#line 1437 "asn1p_y.y"
 {
 		yyval.a_value = asn1p_value_fromint(0);
 		checkmem(yyval.a_value);
 		yyval.a_value->type = ATV_NULL;
 	;
     break;}
-case 145:
-#line 1449 "asn1p_y.y"
+case 144:
+#line 1442 "asn1p_y.y"
 {
 		yyval.a_value = asn1p_value_fromint(0);
 		checkmem(yyval.a_value);
 		yyval.a_value->type = ATV_FALSE;
 	;
     break;}
-case 146:
-#line 1454 "asn1p_y.y"
+case 145:
+#line 1447 "asn1p_y.y"
 {
 		yyval.a_value = asn1p_value_fromint(0);
 		checkmem(yyval.a_value);
 		yyval.a_value->type = ATV_TRUE;
 	;
     break;}
-case 147:
-#line 1459 "asn1p_y.y"
+case 146:
+#line 1452 "asn1p_y.y"
 {
 		yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'B');
 		checkmem(yyval.a_value);
 	;
     break;}
-case 148:
-#line 1463 "asn1p_y.y"
+case 147:
+#line 1456 "asn1p_y.y"
 {
 		yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'H');
 		checkmem(yyval.a_value);
 	;
     break;}
-case 149:
-#line 1467 "asn1p_y.y"
+case 148:
+#line 1460 "asn1p_y.y"
 {
 		yyval.a_value = yyval.a_value;
 	;
     break;}
+case 149:
+#line 1463 "asn1p_y.y"
+{
+		yyval.a_value = yyvsp[0].a_value;
+	;
+    break;}
 case 150:
-#line 1470 "asn1p_y.y"
+#line 1466 "asn1p_y.y"
 {
 		yyval.a_value = yyvsp[0].a_value;
 	;
     break;}
 case 151:
-#line 1473 "asn1p_y.y"
-{
-		yyval.a_value = yyvsp[0].a_value;
-	;
-    break;}
-case 152:
-#line 1479 "asn1p_y.y"
+#line 1472 "asn1p_y.y"
 {
 		asn1p_ref_t *ref;
 		int ret;
@@ -2673,8 +2667,8 @@
 		free(yyvsp[0].tv_str);
 	;
     break;}
-case 153:
-#line 1490 "asn1p_y.y"
+case 152:
+#line 1483 "asn1p_y.y"
 {
 		asn1p_ref_t *ref;
 		int ret;
@@ -2690,31 +2684,31 @@
 		free(yyvsp[0].tv_str);
 	;
     break;}
-case 154:
-#line 1508 "asn1p_y.y"
+case 153:
+#line 1501 "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 155:
-#line 1512 "asn1p_y.y"
+case 154:
+#line 1505 "asn1p_y.y"
 {
 		yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int);
 		checkmem(yyval.a_value);
 		yyval.a_value->type = ATV_TUPLE;
 	;
     break;}
-case 156:
-#line 1517 "asn1p_y.y"
+case 155:
+#line 1510 "asn1p_y.y"
 {
 		yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int);
 		checkmem(yyval.a_value);
 		yyval.a_value->type = ATV_QUADRUPLE;
 	;
     break;}
-case 157:
-#line 1551 "asn1p_y.y"
+case 156:
+#line 1544 "asn1p_y.y"
 {
 		yyval.tv_opaque.len = yyvsp[0].tv_opaque.len + 1;
 		yyval.tv_opaque.buf = malloc(yyval.tv_opaque.len + 1);
@@ -2725,8 +2719,8 @@
 		free(yyvsp[0].tv_opaque.buf);
 	;
     break;}
-case 158:
-#line 1560 "asn1p_y.y"
+case 157:
+#line 1553 "asn1p_y.y"
 {
 		int newsize = yyvsp[-1].tv_opaque.len + yyvsp[0].tv_opaque.len;
 		char *p = malloc(newsize + 1);
@@ -2740,72 +2734,72 @@
 		yyval.tv_opaque.len = newsize;
 	;
     break;}
-case 159:
-#line 1575 "asn1p_y.y"
+case 158:
+#line 1568 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_BOOLEAN; ;
     break;}
-case 160:
-#line 1576 "asn1p_y.y"
+case 159:
+#line 1569 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_NULL; ;
     break;}
-case 161:
-#line 1577 "asn1p_y.y"
+case 160:
+#line 1570 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_REAL; ;
     break;}
-case 162:
-#line 1578 "asn1p_y.y"
+case 161:
+#line 1571 "asn1p_y.y"
 { yyval.a_type = yyvsp[0].a_type; ;
     break;}
-case 163:
-#line 1579 "asn1p_y.y"
+case 162:
+#line 1572 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_OCTET_STRING; ;
     break;}
-case 164:
-#line 1580 "asn1p_y.y"
+case 163:
+#line 1573 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; ;
     break;}
-case 165:
-#line 1581 "asn1p_y.y"
+case 164:
+#line 1574 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_RELATIVE_OID; ;
     break;}
-case 166:
-#line 1582 "asn1p_y.y"
+case 165:
+#line 1575 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_EXTERNAL; ;
     break;}
-case 167:
-#line 1583 "asn1p_y.y"
+case 166:
+#line 1576 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_EMBEDDED_PDV; ;
     break;}
-case 168:
-#line 1584 "asn1p_y.y"
+case 167:
+#line 1577 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_CHARACTER_STRING; ;
     break;}
-case 169:
-#line 1585 "asn1p_y.y"
+case 168:
+#line 1578 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_UTCTime; ;
     break;}
-case 170:
-#line 1586 "asn1p_y.y"
+case 169:
+#line 1579 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_GeneralizedTime; ;
     break;}
+case 170:
+#line 1580 "asn1p_y.y"
+{ yyval.a_type = yyvsp[0].a_type; ;
+    break;}
 case 171:
 #line 1587 "asn1p_y.y"
-{ yyval.a_type = yyvsp[0].a_type; ;
-    break;}
-case 172:
-#line 1594 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_INTEGER; ;
     break;}
-case 173:
-#line 1595 "asn1p_y.y"
+case 172:
+#line 1588 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_ENUMERATED; ;
     break;}
-case 174:
-#line 1596 "asn1p_y.y"
+case 173:
+#line 1589 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_BIT_STRING; ;
     break;}
-case 175:
-#line 1600 "asn1p_y.y"
+case 174:
+#line 1593 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2813,8 +2807,8 @@
 		yyval.a_expr->meta_type = AMT_TYPE;
 	;
     break;}
-case 176:
-#line 1606 "asn1p_y.y"
+case 175:
+#line 1599 "asn1p_y.y"
 {
 		if(yyvsp[0].a_expr) {
 			yyval.a_expr = yyvsp[0].a_expr;
@@ -2826,92 +2820,92 @@
 		yyval.a_expr->meta_type = AMT_TYPE;
 	;
     break;}
-case 177:
-#line 1619 "asn1p_y.y"
+case 176:
+#line 1612 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_BMPString; ;
     break;}
-case 178:
-#line 1620 "asn1p_y.y"
+case 177:
+#line 1613 "asn1p_y.y"
 {
 		yyval.a_type = ASN_STRING_GeneralString;
 		fprintf(stderr, "WARNING: GeneralString is not fully supported\n");
 	;
     break;}
-case 179:
-#line 1624 "asn1p_y.y"
+case 178:
+#line 1617 "asn1p_y.y"
 {
 		yyval.a_type = ASN_STRING_GraphicString;
 		fprintf(stderr, "WARNING: GraphicString is not fully supported\n");
 	;
     break;}
-case 180:
-#line 1628 "asn1p_y.y"
+case 179:
+#line 1621 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_IA5String; ;
     break;}
-case 181:
-#line 1629 "asn1p_y.y"
+case 180:
+#line 1622 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_ISO646String; ;
     break;}
-case 182:
-#line 1630 "asn1p_y.y"
+case 181:
+#line 1623 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_NumericString; ;
     break;}
-case 183:
-#line 1631 "asn1p_y.y"
+case 182:
+#line 1624 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_PrintableString; ;
     break;}
-case 184:
-#line 1632 "asn1p_y.y"
+case 183:
+#line 1625 "asn1p_y.y"
 {
 		yyval.a_type = ASN_STRING_T61String;
 		fprintf(stderr, "WARNING: T61String is not fully supported\n");
 	;
     break;}
-case 185:
-#line 1636 "asn1p_y.y"
+case 184:
+#line 1629 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_TeletexString; ;
     break;}
-case 186:
-#line 1637 "asn1p_y.y"
+case 185:
+#line 1630 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_UniversalString; ;
     break;}
-case 187:
-#line 1638 "asn1p_y.y"
+case 186:
+#line 1631 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_UTF8String; ;
     break;}
-case 188:
-#line 1639 "asn1p_y.y"
+case 187:
+#line 1632 "asn1p_y.y"
 {
 		yyval.a_type = ASN_STRING_VideotexString;
 		fprintf(stderr, "WARNING: VideotexString is not fully supported\n");
 	;
     break;}
-case 189:
-#line 1643 "asn1p_y.y"
+case 188:
+#line 1636 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_VisibleString; ;
     break;}
-case 190:
-#line 1644 "asn1p_y.y"
+case 189:
+#line 1637 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_ObjectDescriptor; ;
     break;}
-case 196:
-#line 1656 "asn1p_y.y"
+case 195:
+#line 1649 "asn1p_y.y"
 { yyval.a_constr = 0; ;
     break;}
-case 197:
-#line 1657 "asn1p_y.y"
+case 196:
+#line 1650 "asn1p_y.y"
 {
 		yyval.a_constr = yyvsp[0].a_constr;
 	;
     break;}
-case 198:
-#line 1663 "asn1p_y.y"
+case 197:
+#line 1656 "asn1p_y.y"
 {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[0].a_constr, 0);
 	;
     break;}
-case 199:
-#line 1666 "asn1p_y.y"
+case 198:
+#line 1659 "asn1p_y.y"
 {
 		/*
 		 * This is a special case, for compatibility purposes.
@@ -2920,26 +2914,26 @@
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_SIZE, yyvsp[-1].a_constr, 0);
 	;
     break;}
-case 200:
-#line 1676 "asn1p_y.y"
+case 199:
+#line 1669 "asn1p_y.y"
 {
 		yyval.a_constr = yyvsp[-1].a_constr;
 	;
     break;}
-case 201:
-#line 1679 "asn1p_y.y"
+case 200:
+#line 1672 "asn1p_y.y"
 {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[-3].a_constr, yyvsp[-1].a_constr);
 	;
     break;}
-case 202:
-#line 1685 "asn1p_y.y"
+case 201:
+#line 1678 "asn1p_y.y"
 {
 		yyval.a_constr = yyvsp[0].a_constr;
 	;
     break;}
-case 203:
-#line 1688 "asn1p_y.y"
+case 202:
+#line 1681 "asn1p_y.y"
 {
 		asn1p_constraint_t *ct;
 		ct = asn1p_constraint_new(yylineno);
@@ -2947,8 +2941,8 @@
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct);
 	;
     break;}
-case 204:
-#line 1694 "asn1p_y.y"
+case 203:
+#line 1687 "asn1p_y.y"
 {
 		asn1p_constraint_t *ct;
 		ct = asn1p_constraint_new(yylineno);
@@ -2958,38 +2952,38 @@
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, ct, yyvsp[0].a_constr);
 	;
     break;}
-case 205:
-#line 1705 "asn1p_y.y"
+case 204:
+#line 1698 "asn1p_y.y"
 {
 		yyval.a_constr = yyvsp[0].a_constr;
 	;
     break;}
-case 206:
-#line 1708 "asn1p_y.y"
+case 205:
+#line 1701 "asn1p_y.y"
 {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_AEX, yyvsp[0].a_constr, 0);
 	;
     break;}
-case 207:
-#line 1711 "asn1p_y.y"
+case 206:
+#line 1704 "asn1p_y.y"
 {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_UNI, yyvsp[-2].a_constr, yyvsp[0].a_constr);
 	;
     break;}
-case 208:
-#line 1714 "asn1p_y.y"
+case 207:
+#line 1707 "asn1p_y.y"
 {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_INT, yyvsp[-2].a_constr, yyvsp[0].a_constr);
 	;
     break;}
-case 209:
-#line 1717 "asn1p_y.y"
+case 208:
+#line 1710 "asn1p_y.y"
 {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_EXC, yyvsp[-2].a_constr, yyvsp[0].a_constr);
 	;
     break;}
-case 210:
-#line 1723 "asn1p_y.y"
+case 209:
+#line 1716 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_constr = asn1p_constraint_new(yylineno);
@@ -2999,8 +2993,8 @@
 		checkmem(ret == 0);
 	;
     break;}
-case 211:
-#line 1731 "asn1p_y.y"
+case 210:
+#line 1724 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_constr = asn1p_constraint_new(yylineno);
@@ -3010,8 +3004,8 @@
 		checkmem(ret == 0);
 	;
     break;}
-case 212:
-#line 1739 "asn1p_y.y"
+case 211:
+#line 1732 "asn1p_y.y"
 {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
@@ -3019,8 +3013,8 @@
 		yyval.a_constr->value = yyvsp[0].a_value;
 	;
     break;}
-case 213:
-#line 1745 "asn1p_y.y"
+case 212:
+#line 1738 "asn1p_y.y"
 {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
@@ -3028,29 +3022,29 @@
 		yyval.a_constr->containedSubtype = yyvsp[0].a_value;
 	;
     break;}
+case 213:
+#line 1744 "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 214:
 #line 1751 "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 215:
-#line 1758 "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 216:
-#line 1766 "asn1p_y.y"
+case 215:
+#line 1759 "asn1p_y.y"
 {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
@@ -3060,36 +3054,36 @@
 		yyval.a_constr->range_stop->type = ATV_MAX;
 	;
     break;}
+case 216:
+#line 1767 "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 217:
-#line 1774 "asn1p_y.y"
+#line 1776 "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 = yyvsp[0].a_constr;
 	;
     break;}
 case 218:
-#line 1783 "asn1p_y.y"
+#line 1779 "asn1p_y.y"
 {
 		yyval.a_constr = yyvsp[0].a_constr;
 	;
     break;}
 case 219:
-#line 1786 "asn1p_y.y"
-{
-		yyval.a_constr = yyvsp[0].a_constr;
-	;
-    break;}
-case 220:
-#line 1790 "asn1p_y.y"
+#line 1783 "asn1p_y.y"
 { asn1p_lexer_hack_push_opaque_state(); ;
     break;}
-case 221:
-#line 1790 "asn1p_y.y"
+case 220:
+#line 1783 "asn1p_y.y"
 {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
@@ -3099,64 +3093,64 @@
 		yyval.a_constr->value->type = ATV_UNPARSED;
 	;
     break;}
-case 222:
-#line 1801 "asn1p_y.y"
+case 221:
+#line 1794 "asn1p_y.y"
 { yyval.a_ctype = ACT_EL_RANGE; ;
     break;}
-case 223:
-#line 1802 "asn1p_y.y"
+case 222:
+#line 1795 "asn1p_y.y"
 { yyval.a_ctype = ACT_EL_RLRANGE; ;
     break;}
-case 224:
-#line 1803 "asn1p_y.y"
+case 223:
+#line 1796 "asn1p_y.y"
 { yyval.a_ctype = ACT_EL_LLRANGE; ;
     break;}
-case 225:
-#line 1804 "asn1p_y.y"
+case 224:
+#line 1797 "asn1p_y.y"
 { yyval.a_ctype = ACT_EL_ULRANGE; ;
     break;}
-case 226:
-#line 1808 "asn1p_y.y"
+case 225:
+#line 1801 "asn1p_y.y"
 {
 		yyval.a_ctype = ACT_CT_SIZE;
 	;
     break;}
-case 227:
-#line 1811 "asn1p_y.y"
+case 226:
+#line 1804 "asn1p_y.y"
 {
 		yyval.a_ctype = ACT_CT_FROM;
 	;
     break;}
-case 228:
-#line 1817 "asn1p_y.y"
+case 227:
+#line 1810 "asn1p_y.y"
 {
 		yyval.a_value = asn1p_value_fromint(0);
 		checkmem(yyval.a_value);
 		yyval.a_value->type = ATV_FALSE;
 	;
     break;}
-case 229:
-#line 1822 "asn1p_y.y"
+case 228:
+#line 1815 "asn1p_y.y"
 {
 		yyval.a_value = asn1p_value_fromint(1);
 		checkmem(yyval.a_value);
 		yyval.a_value->type = ATV_TRUE;
 	;
     break;}
+case 229:
+#line 1820 "asn1p_y.y"
+{
+		yyval.a_value = yyvsp[0].a_value;
+	;
+    break;}
 case 230:
-#line 1827 "asn1p_y.y"
+#line 1823 "asn1p_y.y"
 {
 		yyval.a_value = yyvsp[0].a_value;
 	;
     break;}
 case 231:
-#line 1830 "asn1p_y.y"
-{
-		yyval.a_value = yyvsp[0].a_value;
-	;
-    break;}
-case 232:
-#line 1833 "asn1p_y.y"
+#line 1826 "asn1p_y.y"
 {
 		asn1p_ref_t *ref;
 		int ret;
@@ -3169,8 +3163,8 @@
 		free(yyvsp[0].tv_str);
 	;
     break;}
-case 233:
-#line 1847 "asn1p_y.y"
+case 232:
+#line 1840 "asn1p_y.y"
 {
 		asn1p_ref_t *ref;
 		int ret;
@@ -3183,32 +3177,32 @@
 		free(yyvsp[0].tv_str);
 	;
     break;}
-case 234:
-#line 1861 "asn1p_y.y"
+case 233:
+#line 1854 "asn1p_y.y"
 {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMP, yyvsp[0].a_constr, 0);
 	;
     break;}
-case 235:
-#line 1864 "asn1p_y.y"
+case 234:
+#line 1857 "asn1p_y.y"
 {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-1].a_constr, 0);
 	;
     break;}
-case 236:
-#line 1870 "asn1p_y.y"
+case 235:
+#line 1863 "asn1p_y.y"
 {
 		yyval.a_constr = yyvsp[0].a_constr;
 	;
     break;}
-case 237:
-#line 1873 "asn1p_y.y"
+case 236:
+#line 1866 "asn1p_y.y"
 {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-2].a_constr, yyvsp[0].a_constr);
 	;
     break;}
-case 238:
-#line 1879 "asn1p_y.y"
+case 237:
+#line 1872 "asn1p_y.y"
 {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
@@ -3216,8 +3210,8 @@
 		yyval.a_constr->value = asn1p_value_frombuf("...", 3, 0);
 	;
     break;}
-case 239:
-#line 1885 "asn1p_y.y"
+case 238:
+#line 1878 "asn1p_y.y"
 {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
@@ -3227,46 +3221,46 @@
 		if(yyvsp[-1].a_constr) asn1p_constraint_insert(yyval.a_constr, yyvsp[-1].a_constr);
 	;
     break;}
-case 240:
-#line 1899 "asn1p_y.y"
+case 239:
+#line 1892 "asn1p_y.y"
 { yyval.a_pres = ACPRES_DEFAULT; ;
     break;}
-case 241:
-#line 1900 "asn1p_y.y"
+case 240:
+#line 1893 "asn1p_y.y"
 { yyval.a_pres = yyvsp[0].a_pres; ;
     break;}
-case 242:
-#line 1904 "asn1p_y.y"
+case 241:
+#line 1897 "asn1p_y.y"
 {
 		yyval.a_pres = ACPRES_PRESENT;
 	;
     break;}
-case 243:
-#line 1907 "asn1p_y.y"
+case 242:
+#line 1900 "asn1p_y.y"
 {
 		yyval.a_pres = ACPRES_ABSENT;
 	;
     break;}
-case 244:
-#line 1910 "asn1p_y.y"
+case 243:
+#line 1903 "asn1p_y.y"
 {
 		yyval.a_pres = ACPRES_OPTIONAL;
 	;
     break;}
+case 244:
+#line 1909 "asn1p_y.y"
+{
+		yyval.a_constr = yyvsp[0].a_constr;
+	;
+    break;}
 case 245:
-#line 1916 "asn1p_y.y"
+#line 1912 "asn1p_y.y"
 {
 		yyval.a_constr = yyvsp[0].a_constr;
 	;
     break;}
 case 246:
-#line 1919 "asn1p_y.y"
-{
-		yyval.a_constr = yyvsp[0].a_constr;
-	;
-    break;}
-case 247:
-#line 1928 "asn1p_y.y"
+#line 1921 "asn1p_y.y"
 {
 		asn1p_ref_t *ref = asn1p_ref_new(yylineno);
 		asn1p_constraint_t *ct;
@@ -3280,14 +3274,14 @@
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, ct, 0);
 	;
     break;}
-case 248:
-#line 1943 "asn1p_y.y"
+case 247:
+#line 1936 "asn1p_y.y"
 {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, yyvsp[-3].a_constr, yyvsp[-1].a_constr);
 	;
     break;}
-case 249:
-#line 1949 "asn1p_y.y"
+case 248:
+#line 1942 "asn1p_y.y"
 {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
@@ -3295,8 +3289,8 @@
 		yyval.a_constr->value = asn1p_value_fromref(yyvsp[0].a_ref, 0);
 	;
     break;}
-case 250:
-#line 1955 "asn1p_y.y"
+case 249:
+#line 1948 "asn1p_y.y"
 {
 		asn1p_constraint_t *ct;
 		ct = asn1p_constraint_new(yylineno);
@@ -3306,8 +3300,8 @@
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct);
 	;
     break;}
-case 251:
-#line 1969 "asn1p_y.y"
+case 250:
+#line 1962 "asn1p_y.y"
 {
 		char *p = malloc(strlen(yyvsp[0].tv_str) + 2);
 		int ret;
@@ -3320,8 +3314,8 @@
 		free(yyvsp[0].tv_str);
 	;
     break;}
-case 252:
-#line 1980 "asn1p_y.y"
+case 251:
+#line 1973 "asn1p_y.y"
 {
 		char *p = malloc(strlen(yyvsp[0].tv_str) + 3);
 		int ret;
@@ -3335,14 +3329,14 @@
 		free(yyvsp[0].tv_str);
 	;
     break;}
-case 253:
-#line 1996 "asn1p_y.y"
+case 252:
+#line 1989 "asn1p_y.y"
 {
 		yyval.tv_str = yyvsp[0].tv_str;
 	;
     break;}
-case 254:
-#line 1999 "asn1p_y.y"
+case 253:
+#line 1992 "asn1p_y.y"
 {
 		int l1 = strlen(yyvsp[-2].tv_str);
 		int l3 = strlen(yyvsp[0].tv_str);
@@ -3353,57 +3347,67 @@
 		yyval.tv_str[l1 + 1 + l3] = '\0';
 	;
     break;}
-case 255:
-#line 2017 "asn1p_y.y"
+case 254:
+#line 2010 "asn1p_y.y"
 {
 		yyval.a_marker.flags = EM_NOMARK;
 		yyval.a_marker.default_value = 0;
 	;
     break;}
-case 256:
-#line 2021 "asn1p_y.y"
+case 255:
+#line 2014 "asn1p_y.y"
 { yyval.a_marker = yyvsp[0].a_marker; ;
     break;}
-case 257:
-#line 2025 "asn1p_y.y"
+case 256:
+#line 2018 "asn1p_y.y"
 {
 		yyval.a_marker.flags = EM_OPTIONAL | EM_INDIRECT;
 		yyval.a_marker.default_value = 0;
 	;
     break;}
-case 258:
-#line 2029 "asn1p_y.y"
+case 257:
+#line 2022 "asn1p_y.y"
 {
 		yyval.a_marker.flags = EM_DEFAULT;
 		yyval.a_marker.default_value = yyvsp[0].a_value;
 	;
     break;}
-case 259:
-#line 2052 "asn1p_y.y"
+case 258:
+#line 2045 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
 	;
     break;}
-case 260:
-#line 2056 "asn1p_y.y"
+case 259:
+#line 2049 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-1].a_expr;
 	;
     break;}
-case 261:
-#line 2062 "asn1p_y.y"
+case 260:
+#line 2055 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
 	;
     break;}
+case 261:
+#line 2060 "asn1p_y.y"
+{
+		yyval.a_expr = yyvsp[-2].a_expr;
+		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
+	;
+    break;}
 case 262:
 #line 2067 "asn1p_y.y"
 {
-		yyval.a_expr = yyvsp[-2].a_expr;
-		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
+		yyval.a_expr = asn1p_expr_new(yylineno);
+		checkmem(yyval.a_expr);
+		yyval.a_expr->expr_type = A1TC_UNIVERVAL;
+		yyval.a_expr->meta_type = AMT_VALUE;
+		yyval.a_expr->Identifier = yyvsp[0].tv_str;
 	;
     break;}
 case 263:
@@ -3413,11 +3417,12 @@
 		checkmem(yyval.a_expr);
 		yyval.a_expr->expr_type = A1TC_UNIVERVAL;
 		yyval.a_expr->meta_type = AMT_VALUE;
-		yyval.a_expr->Identifier = yyvsp[0].tv_str;
+		yyval.a_expr->Identifier = yyvsp[-3].tv_str;
+		yyval.a_expr->value = yyvsp[-1].a_value;
 	;
     break;}
 case 264:
-#line 2081 "asn1p_y.y"
+#line 2082 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -3428,18 +3433,7 @@
 	;
     break;}
 case 265:
-#line 2089 "asn1p_y.y"
-{
-		yyval.a_expr = asn1p_expr_new(yylineno);
-		checkmem(yyval.a_expr);
-		yyval.a_expr->expr_type = A1TC_UNIVERVAL;
-		yyval.a_expr->meta_type = AMT_VALUE;
-		yyval.a_expr->Identifier = yyvsp[-3].tv_str;
-		yyval.a_expr->value = yyvsp[-1].a_value;
-	;
-    break;}
-case 266:
-#line 2097 "asn1p_y.y"
+#line 2090 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -3448,8 +3442,8 @@
 		yyval.a_expr->value = yyvsp[0].a_value;
 	;
     break;}
-case 267:
-#line 2104 "asn1p_y.y"
+case 266:
+#line 2097 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -3459,79 +3453,86 @@
 		yyval.a_expr->meta_type = AMT_VALUE;
 	;
     break;}
+case 267:
+#line 2108 "asn1p_y.y"
+{
+		yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int);
+		checkmem(yyval.a_value);
+	;
+    break;}
 case 268:
-#line 2115 "asn1p_y.y"
+#line 2112 "asn1p_y.y"
 {
 		yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int);
 		checkmem(yyval.a_value);
 	;
     break;}
 case 269:
-#line 2119 "asn1p_y.y"
-{
-		yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int);
-		checkmem(yyval.a_value);
-	;
-    break;}
-case 270:
-#line 2150 "asn1p_y.y"
+#line 2143 "asn1p_y.y"
 { memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); ;
     break;}
-case 271:
-#line 2151 "asn1p_y.y"
+case 270:
+#line 2144 "asn1p_y.y"
 { yyval.a_tag = yyvsp[0].a_tag; ;
     break;}
-case 272:
-#line 2155 "asn1p_y.y"
+case 271:
+#line 2148 "asn1p_y.y"
 {
 		yyval.a_tag = yyvsp[-1].a_tag;
 		yyval.a_tag.tag_mode = yyvsp[0].a_tag.tag_mode;
 	;
     break;}
-case 273:
-#line 2162 "asn1p_y.y"
+case 272:
+#line 2155 "asn1p_y.y"
 {
 		yyval.a_tag = yyvsp[-2].a_tag;
 		yyval.a_tag.tag_value = yyvsp[-1].a_int;
 	;
     break;}
-case 274:
-#line 2168 "asn1p_y.y"
+case 273:
+#line 2161 "asn1p_y.y"
 { yyval.a_tag.tag_class = TC_CONTEXT_SPECIFIC; ;
     break;}
-case 275:
-#line 2169 "asn1p_y.y"
+case 274:
+#line 2162 "asn1p_y.y"
 { yyval.a_tag.tag_class = TC_UNIVERSAL; ;
     break;}
-case 276:
-#line 2170 "asn1p_y.y"
+case 275:
+#line 2163 "asn1p_y.y"
 { yyval.a_tag.tag_class = TC_APPLICATION; ;
     break;}
-case 277:
-#line 2171 "asn1p_y.y"
+case 276:
+#line 2164 "asn1p_y.y"
 { yyval.a_tag.tag_class = TC_PRIVATE; ;
     break;}
-case 278:
-#line 2175 "asn1p_y.y"
+case 277:
+#line 2168 "asn1p_y.y"
 { yyval.a_tag.tag_mode = TM_DEFAULT; ;
     break;}
-case 279:
-#line 2176 "asn1p_y.y"
+case 278:
+#line 2169 "asn1p_y.y"
 { yyval.a_tag.tag_mode = TM_IMPLICIT; ;
     break;}
-case 280:
-#line 2177 "asn1p_y.y"
+case 279:
+#line 2170 "asn1p_y.y"
 { yyval.a_tag.tag_mode = TM_EXPLICIT; ;
     break;}
+case 280:
+#line 2174 "asn1p_y.y"
+{
+		checkmem(yyvsp[0].tv_str);
+		yyval.tv_str = yyvsp[0].tv_str;
+	;
+    break;}
 case 281:
-#line 2181 "asn1p_y.y"
+#line 2178 "asn1p_y.y"
 {
 		checkmem(yyvsp[0].tv_str);
 		yyval.tv_str = yyvsp[0].tv_str;
 	;
     break;}
 case 282:
-#line 2185 "asn1p_y.y"
+#line 2186 "asn1p_y.y"
 {
 		checkmem(yyvsp[0].tv_str);
 		yyval.tv_str = yyvsp[0].tv_str;
@@ -3539,23 +3540,16 @@
     break;}
 case 283:
 #line 2193 "asn1p_y.y"
-{
-		checkmem(yyvsp[0].tv_str);
-		yyval.tv_str = yyvsp[0].tv_str;
-	;
-    break;}
-case 284:
-#line 2200 "asn1p_y.y"
 { yyval.tv_str = 0; ;
     break;}
-case 285:
-#line 2201 "asn1p_y.y"
+case 284:
+#line 2194 "asn1p_y.y"
 {
 		yyval.tv_str = yyvsp[0].tv_str;
 	;
     break;}
-case 286:
-#line 2207 "asn1p_y.y"
+case 285:
+#line 2200 "asn1p_y.y"
 {
 		checkmem(yyvsp[0].tv_str);
 		yyval.tv_str = yyvsp[0].tv_str;
@@ -3783,7 +3777,7 @@
     }
   return 1;
 }
-#line 2213 "asn1p_y.y"
+#line 2206 "asn1p_y.y"
 
 
 
diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y
index 323ebe7..a3d055c 100644
--- a/libasn1parser/asn1p_y.y
+++ b/libasn1parser/asn1p_y.y
@@ -242,8 +242,7 @@
 %type	<a_ref>			ComplexTypeReference
 %type	<a_ref>			ComplexTypeReferenceAmpList
 %type	<a_refcomp>		ComplexTypeReferenceElement
-%type	<a_refcomp>		ClassFieldIdentifier
-%type	<a_refcomp>		ClassFieldName
+%type	<a_refcomp>		PrimitiveFieldReference
 %type	<a_expr>		FieldSpec
 %type	<a_ref>			FieldName
 %type	<a_ref>			DefinedObjectClass
@@ -1081,14 +1080,9 @@
 	| TOK_Literal {
 		$$ = asn1p_wsyntx_chunk_frombuf($1, strlen($1), 0);
 	}
-	| ClassFieldIdentifier {
-		asn1p_ref_t *ref;
-		int ret;
-		ref = asn1p_ref_new(yylineno);
-		checkmem(ref);
-		ret = asn1p_ref_add_component(ref, $1.name, $1.lex_type);
-		checkmem(ret == 0);
-		$$ = asn1p_wsyntx_chunk_fromref(ref, 0);
+	| PrimitiveFieldReference {
+		$$ = asn1p_wsyntx_chunk_frombuf($1.name, strlen($1.name), 0);
+		$$->type = WC_FIELD;
 	}
 	| '[' WithSyntaxList ']' {
 		$$ = asn1p_wsyntx_chunk_fromsyntax($2);
@@ -1365,10 +1359,9 @@
 	}
 	;
 
-ComplexTypeReferenceElement:	ClassFieldName;
-ClassFieldIdentifier:		ClassFieldName;
+ComplexTypeReferenceElement:	PrimitiveFieldReference;
 
-ClassFieldName:
+PrimitiveFieldReference:
 	/* "&Type1" */
 	TOK_typefieldreference {
 		$$.lex_type = RLT_AmpUppercase;
diff --git a/libasn1parser/asn1parser.c b/libasn1parser/asn1parser.c
index f59d1af..bd712b3 100644
--- a/libasn1parser/asn1parser.c
+++ b/libasn1parser/asn1parser.c
@@ -1,5 +1,6 @@
 #include <stdio.h>
 #include <string.h>
+#include <stdlib.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <assert.h>
@@ -184,3 +185,21 @@
 }
 
 
+int
+asn1p_atoi(const char *ptr, asn1c_integer_t *value) {
+	errno = 0;	/* Clear the error code */
+
+	if(sizeof(*value) <= sizeof(int)) {
+		*value = strtol(ptr, 0, 10);
+	} else {
+#ifdef	HAVE_STRTOIMAX
+		*value = strtoimax(ptr, 0, 10);
+#elif	HAVE_STRTOLL
+		*value = strtoll(ptr, 0, 10);
+#else
+		*value = strtol(ptr, 0, 10);
+#endif
+	}
+
+	return errno == 0 ? 0 : -1;
+}
diff --git a/libasn1parser/asn1parser.h b/libasn1parser/asn1parser.h
index fc8de37..ceb099e 100644
--- a/libasn1parser/asn1parser.h
+++ b/libasn1parser/asn1parser.h
@@ -69,4 +69,6 @@
 asn1p_t	*asn1p_parse_buffer(const char *buffer, int size /* = -1 */,
 	enum asn1p_flags);
 
+int asn1p_atoi(const char *ptr, asn1c_integer_t *r_value);
+
 #endif	/* ASN1PARSER_H */
diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c
index 865d90b..ced31db 100644
--- a/libasn1print/asn1print.c
+++ b/libasn1print/asn1print.c
@@ -106,7 +106,7 @@
 
 	TQ_FOR(tc, &(mod->members), next) {
 		asn1print_expr(asn, mod, tc, flags, 0);
-		if(flags & APF_DEBUG_CONSTRAINTS)
+		if(flags & APF_PRINT_CONSTRAINTS)
 			printf("\n");
 		else
 			printf("\n\n");
@@ -416,11 +416,9 @@
 		  switch(wc->type) {
 		  case WC_LITERAL:
 		  case WC_WHITESPACE:
+		  case WC_FIELD:
 			printf("%s", wc->content.token);
 			break;
-		  case WC_REFERENCE:
-			asn1print_ref(wc->content.ref, flags);
-			break;
 		  case WC_OPTIONALGROUP:
 			printf("[");
 			asn1print_with_syntax(wc->content.syntax,flags);
@@ -690,7 +688,7 @@
 	/*
 	 * The following section exists entirely for debugging.
 	 */
-	if(flags & APF_DEBUG_CONSTRAINTS
+	if(flags & APF_PRINT_CONSTRAINTS
 	&& tc->expr_type != A1TC_EXTENSIBLE) {
 		asn1p_expr_t *top_parent;
 
@@ -713,6 +711,41 @@
 		printf("\n");
 	}
 
+	if(flags & APF_PRINT_CLASS_MATRIX
+	&& tc->expr_type == A1TC_CLASSDEF) do {
+		int r, col, maxidlen;
+		if(tc->object_class_matrix.rows == 0) {
+			printf("\n-- Class matrix is empty");
+			break;
+		}
+		printf("\n-- Class matrix has %d entr%s:\n",
+				tc->object_class_matrix.rows,
+				tc->object_class_matrix.rows==1 ? "y" : "ies");
+		maxidlen = tc->object_class_matrix.max_identifier_length;
+		for(r = -1; r < tc->object_class_matrix.rows; r++) {
+			struct asn1p_ioc_row_s *row;
+			row = tc->object_class_matrix.row[r<0?0:r];
+			if(r < 0) printf("--    %s", r > 9 ? " " : "");
+			else printf("-- [%*d]", r > 9 ? 2 : 1, r+1);
+			for(col = 0; col < row->columns; col++) {
+				struct asn1p_ioc_cell_s *cell;
+				cell = &row->column[col];
+				if(r < 0) {
+					printf("[%*s]", maxidlen,
+						cell->field->Identifier);
+					continue;
+				}
+				if(!cell->value) {
+					printf(" %*s ", maxidlen, "<no entry>");
+					continue;
+				}
+				printf(" %*s ", maxidlen,
+					cell->value->Identifier);
+			}
+			printf("\n");
+		}
+	} while(0);
+
 	return 0;
 }
 
diff --git a/libasn1print/asn1print.h b/libasn1print/asn1print.h
index 336ba1e..c24fa0c 100644
--- a/libasn1print/asn1print.h
+++ b/libasn1print/asn1print.h
@@ -3,10 +3,11 @@
 
 enum asn1print_flags {
 	APF_NOFLAGS,
-	APF_LINE_COMMENTS	= 0x01, /* Include line comments */
-	APF_DEBUG_CONSTRAINTS	= 0x02,	/* Explain constraints */
+	APF_NOINDENT		= 0x01,	/* Disable indentation */
+	APF_LINE_COMMENTS	= 0x02, /* Include line comments */
 	APF_PRINT_XML_DTD	= 0x04,	/* Generate XML DTD */
-	APF_NOINDENT		= 0x08,	/* Disable indentation */
+	APF_PRINT_CONSTRAINTS	= 0x08,	/* Explain constraints */
+	APF_PRINT_CLASS_MATRIX	= 0x10,	/* Dump class matrix */
 };
 
 /*
diff --git a/tests/34-class-OK.asn1 b/tests/34-class-OK.asn1
index 48437fb..2ea8901 100644
--- a/tests/34-class-OK.asn1
+++ b/tests/34-class-OK.asn1
@@ -14,7 +14,7 @@
 	-- First CLASS
 
 	EXTENSION ::= CLASS {
-		&id [PRIVATE 0] OBJECT IDENTIFIER UNIQUE,
+		&id [PRIVATE 0] INTEGER UNIQUE,
 		&ExtnType
 	} WITH SYNTAX {
 		SYNTAX		&ExtnType
@@ -35,6 +35,8 @@
 
 	terminal-type EXTENSION-ATTRIBUTE ::= {TerminalType IDENTIFIED BY 23}
 
+	TerminalType ::= INTEGER { terminal(0) }
+
 	-- Advanced CLASS extraction
 
 	ExtensionAttribute ::= SEQUENCE {
diff --git a/tests/34-class-OK.asn1.-EF b/tests/34-class-OK.asn1.-EF
index 8cc56ee..8af80a8 100644
--- a/tests/34-class-OK.asn1.-EF
+++ b/tests/34-class-OK.asn1.-EF
@@ -4,7 +4,7 @@
 BEGIN
 
 EXTENSION ::= CLASS {
-    &id	 [PRIVATE 0] OBJECT IDENTIFIER UNIQUE,
+    &id	 [PRIVATE 0] INTEGER UNIQUE,
     &ExtnType	
 } WITH SYNTAX {
 		SYNTAX		&ExtnType
@@ -24,6 +24,10 @@
 
 terminal-type EXTENSION-ATTRIBUTE ::= {TerminalType IDENTIFIED BY 23}
 
+TerminalType ::= INTEGER {
+    terminal(0)
+}
+
 ExtensionAttribute ::= SEQUENCE {
     extension-attribute-type	 [0] IMPLICIT EXTENSION-ATTRIBUTE.&id ({ExtensionAttributeTable}),
     extension-attribute-value	 [1] EXPLICIT EXTENSION-ATTRIBUTE.&Type ({ExtensionAttributeTable}{@extension-attribute-type})
diff --git a/tests/34-class-OK.asn1.-EFprint-class-matrix b/tests/34-class-OK.asn1.-EFprint-class-matrix
new file mode 100644
index 0000000..f97de09
--- /dev/null
+++ b/tests/34-class-OK.asn1.-EFprint-class-matrix
@@ -0,0 +1,43 @@
+ModuleTestClassSimple { iso org(3) dod(6) internet(1) private(4) enterprise(1)
+	spelio(9363) software(1) asn1c(5) test(1) 34 }
+DEFINITIONS IMPLICIT TAGS ::=
+BEGIN
+
+EXTENSION ::= CLASS {
+    &id	 [PRIVATE 0] INTEGER UNIQUE,
+    &ExtnType	
+} WITH SYNTAX {
+		SYNTAX		&ExtnType
+		IDENTIFIED BY	&id
+	}
+
+-- Class matrix is empty
+
+Ext1 ::= SEQUENCE {
+    extnId	 EXTENSION.&id
+}
+
+EXTENSION-ATTRIBUTE ::= CLASS {
+    &id	 INTEGER (0..256) UNIQUE,
+    &Type	 ANY
+} WITH SYNTAX {&Type IDENTIFIED BY &id}
+
+-- Class matrix has 1 entry:
+--    [         &id][       &Type]
+-- [1]           23  TerminalType 
+
+
+terminal-type EXTENSION-ATTRIBUTE ::= {TerminalType IDENTIFIED BY 23}
+
+TerminalType ::= INTEGER {
+    terminal(0)
+}
+
+ExtensionAttribute ::= SEQUENCE {
+    extension-attribute-type	 [0] IMPLICIT EXTENSION-ATTRIBUTE.&id ({ExtensionAttributeTable}),
+    extension-attribute-value	 [1] EXPLICIT EXTENSION-ATTRIBUTE.&Type ({ExtensionAttributeTable}{@extension-attribute-type})
+}
+
+ub-extension-attributes INTEGER ::= 256
+
+END