Support for some CharsDefn

diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y
index f9c7ed4..b6be6f6 100644
--- a/libasn1parser/asn1p_y.y
+++ b/libasn1parser/asn1p_y.y
@@ -286,6 +286,7 @@
 %type	<a_value>		ContainedSubtype
 %type	<a_ctype>		ConstraintSpec
 %type	<a_ctype>		ConstraintRangeSpec
+%type	<a_value>		RestrictedCharacterStringValue
 %type	<a_wsynt>		optWithSyntax
 %type	<a_wsynt>		WithSyntax
 %type	<a_wsynt>		WithSyntaxFormat
@@ -1346,9 +1347,8 @@
 		$$ = _convert_bitstring2binary($1, 'H');
 		checkmem($$);
 	}
-	| TOK_cstring {
-		$$ = asn1p_value_frombuf($1.buf, $1.len, 0);
-		checkmem($$);
+	| RestrictedCharacterStringValue {
+		$$ = $$;
 	}
 	| SignedNumber {
 		$$ = $1;
@@ -1386,6 +1386,38 @@
 	}
 	;
 
+
+RestrictedCharacterStringValue:
+	TOK_cstring {
+		$$ = asn1p_value_frombuf($1.buf, $1.len, 0);
+		checkmem($$);
+	}
+	| '{' TOK_number ',' TOK_number '}' {
+		asn1c_integer_t v = ($2 << 4) + $4;
+		if($2 > 7) return yyerror("X.680:2003, #37.14 "
+				"mandates 0..7 range for Tuple's TableColumn");
+		if($4 > 15) return yyerror("X.680:2003, #37.14 "
+				"mandates 0..15 range for Tuple's TableRow");
+		$$ = asn1p_value_fromint(v);
+		checkmem($$);
+		$$->type = ATV_TUPLE;
+	}
+	| '{' TOK_number ',' TOK_number ',' TOK_number ',' TOK_number '}' {
+		asn1c_integer_t v = ($2 << 24) | ($4 << 16) | ($6 << 8) | $8;
+		if($2 > 127) return yyerror("X.680:2003, #37.12 "
+				"mandates 0..127 range for Quadruple's Group");
+		if($4 > 255) return yyerror("X.680:2003, #37.12 "
+				"mandates 0..255 range for Quadruple's Plane");
+		if($6 > 255) return yyerror("X.680:2003, #37.12 "
+				"mandates 0..255 range for Quadruple's Row");
+		if($8 > 255) return yyerror("X.680:2003, #37.12 "
+				"mandates 0..255 range for Quadruple's Cell");
+		$$ = asn1p_value_fromint(v);
+		checkmem($$);
+		$$->type = ATV_QUADRUPLE;
+	}
+	;
+
 Opaque:
 	TOK_opaque {
 		$$.len = $1.len + 1;
@@ -1544,6 +1576,9 @@
 	ConstraintSubtypeElement {
 		$$ = $1;
 	}
+	| TOK_ALL TOK_EXCEPT ConstraintSubtypeElement {
+		CONSTRAINT_INSERT($$, ACT_CA_AEX, $3, 0);
+	}
 	| ElementSetSpec Union ConstraintSubtypeElement {
 		CONSTRAINT_INSERT($$, ACT_CA_UNI, $1, $3);
 	}
@@ -1663,9 +1698,8 @@
 	| SignedNumber {
 		$$ = $1;
 	}
-	| TOK_cstring {
-		$$ = asn1p_value_frombuf($1.buf, $1.len, 0);
-		checkmem($$);
+	| RestrictedCharacterStringValue {
+		$$ = $1;
 	}
 	| Identifier {
 		asn1p_ref_t *ref;