ENUMERATION can not be empty
diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y
index 4cd3879..dbad995 100644
--- a/libasn1parser/asn1p_y.y
+++ b/libasn1parser/asn1p_y.y
@@ -132,9 +132,9 @@
%token <tv_str> TOK_bstring
%token <tv_opaque> TOK_cstring
%token <tv_str> TOK_hstring
-%token <tv_str> TOK_identifier
-%token <a_int> TOK_number
-%token <a_int> TOK_number_negative
+%token <tv_str> TOK_identifier "identifier"
+%token <a_int> TOK_number "number"
+%token <a_int> TOK_number_negative "negative number"
%token <a_dbl> TOK_realnumber
%token <a_int> TOK_tuple
%token <a_int> TOK_quadruple
@@ -145,6 +145,11 @@
%token <tv_str> TOK_Literal /* "BY" */
/*
+ * Tokens available with asn1p_lexer_hack_push_extended_values().
+ */
+%token TOK_ExtValue_BIT_STRING
+
+/*
* Token types representing ASN.1 standard keywords.
*/
%token TOK_ABSENT
@@ -235,8 +240,8 @@
%left '|' TOK_UNION
/* Misc tags */
-%token TOK_TwoDots /* .. */
-%token TOK_ThreeDots /* ... */
+%token TOK_TwoDots ".."
+%token TOK_ThreeDots "..."
/*
@@ -291,8 +296,14 @@
%type <a_expr> ComponentType
%type <a_expr> AlternativeTypeLists
%type <a_expr> AlternativeType
-%type <a_expr> UniverationDefinition
%type <a_expr> UniverationList
+%type <a_expr> Enumerations
+%type <a_expr> NamedBitList
+%type <a_expr> NamedBit
+%type <a_expr> NamedNumberList
+%type <a_expr> NamedNumber
+%type <a_expr> IdentifierList
+%type <a_expr> IdentifierElement
%type <a_expr> UniverationElement
%type <tv_str> TypeRefName
%type <tv_str> ObjectClassReference
@@ -1638,7 +1649,6 @@
TOK_BOOLEAN { $$ = ASN_BASIC_BOOLEAN; }
| TOK_NULL { $$ = ASN_BASIC_NULL; }
| TOK_REAL { $$ = ASN_BASIC_REAL; }
- | BasicTypeId_UniverationCompatible { $$ = $1; }
| TOK_OCTET TOK_STRING { $$ = ASN_BASIC_OCTET_STRING; }
| TOK_OBJECT TOK_IDENTIFIER { $$ = ASN_BASIC_OBJECT_IDENTIFIER; }
| TOK_RELATIVE_OID { $$ = ASN_BASIC_RELATIVE_OID; }
@@ -1647,7 +1657,8 @@
| TOK_CHARACTER TOK_STRING { $$ = ASN_BASIC_CHARACTER_STRING; }
| TOK_UTCTime { $$ = ASN_BASIC_UTCTime; }
| TOK_GeneralizedTime { $$ = ASN_BASIC_GeneralizedTime; }
- | BasicString { $$ = $1; }
+ | BasicString
+ | BasicTypeId_UniverationCompatible
;
/*
@@ -1655,7 +1666,7 @@
*/
BasicTypeId_UniverationCompatible:
TOK_INTEGER { $$ = ASN_BASIC_INTEGER; }
- | TOK_ENUMERATED { $$ = ASN_BASIC_ENUMERATED; }
+ | TOK_ENUMERATED { $$ = ASN_BASIC_INTEGER; }
| TOK_BIT TOK_STRING { $$ = ASN_BASIC_BIT_STRING; }
;
@@ -1666,16 +1677,32 @@
$$->expr_type = $1;
$$->meta_type = AMT_TYPE;
}
- | BasicTypeId_UniverationCompatible UniverationDefinition {
- if($2) {
- $$ = $2;
- } else {
- $$ = NEW_EXPR();
- checkmem($$);
- }
- $$->expr_type = $1;
- $$->meta_type = AMT_TYPE;
- }
+ | TOK_INTEGER '{' NamedNumberList '}' {
+ $$ = $3;
+ $$->expr_type = ASN_BASIC_INTEGER;
+ $$->meta_type = AMT_TYPE;
+ }
+ | TOK_ENUMERATED '{' Enumerations '}' {
+ $$ = $3;
+ $$->expr_type = ASN_BASIC_ENUMERATED;
+ $$->meta_type = AMT_TYPE;
+ }
+ | TOK_BIT TOK_STRING '{' NamedBitList '}' {
+ $$ = $4;
+ $$->expr_type = ASN_BASIC_BIT_STRING;
+ $$->meta_type = AMT_TYPE;
+ }
+ | TOK_ExtValue_BIT_STRING '{' IdentifierList '}' {
+ $$ = $3;
+ $$->expr_type = ASN_BASIC_BIT_STRING;
+ $$->meta_type = AMT_TYPE;
+ }
+ | TOK_ExtValue_BIT_STRING '{' '}' {
+ $$ = NEW_EXPR();
+ checkmem($$);
+ $$->expr_type = ASN_BASIC_BIT_STRING;
+ $$->meta_type = AMT_TYPE;
+ }
;
BasicString:
@@ -2173,32 +2200,101 @@
}
;
-/*
- * Universal enumeration definition to use in INTEGER and ENUMERATED.
- * === EXAMPLE ===
- * Gender ::= ENUMERATED { unknown(0), male(1), female(2) }
- * Temperature ::= INTEGER { absolute-zero(-273), freezing(0), boiling(100) }
- * === EOF ===
- */
-/*
-optUniverationDefinition:
- { $$ = 0; }
- | UniverationDefinition {
- $$ = $1;
- }
- ;
-*/
-
-UniverationDefinition:
- '{' '}' {
+IdentifierList:
+ IdentifierElement {
$$ = NEW_EXPR();
checkmem($$);
+ asn1p_expr_add($$, $1);
+ }
+ | IdentifierList ',' IdentifierElement {
+ $$ = $1;
+ asn1p_expr_add($$, $3);
+ };
+
+IdentifierElement:
+ Identifier {
+ $$ = NEW_EXPR();
+ checkmem($$);
+ $$->expr_type = A1TC_UNIVERVAL;
+ $$->meta_type = AMT_VALUE;
+ $$->Identifier = $1;
+ }
+
+NamedNumberList:
+ NamedNumber {
+ $$ = NEW_EXPR();
+ checkmem($$);
+ asn1p_expr_add($$, $1);
}
- | '{' UniverationList '}' {
- $$ = $2;
+ | NamedNumberList ',' NamedNumber {
+ $$ = $1;
+ asn1p_expr_add($$, $3);
}
;
+NamedNumber:
+ Identifier '(' SignedNumber ')' {
+ $$ = NEW_EXPR();
+ checkmem($$);
+ $$->expr_type = A1TC_UNIVERVAL;
+ $$->meta_type = AMT_VALUE;
+ $$->Identifier = $1;
+ $$->value = $3;
+ }
+ | Identifier '(' DefinedValue ')' {
+ $$ = NEW_EXPR();
+ checkmem($$);
+ $$->expr_type = A1TC_UNIVERVAL;
+ $$->meta_type = AMT_VALUE;
+ $$->Identifier = $1;
+ $$->value = $3;
+ };
+
+NamedBitList:
+ NamedBit {
+ $$ = NEW_EXPR();
+ checkmem($$);
+ asn1p_expr_add($$, $1);
+ }
+ | NamedBitList ',' NamedBit {
+ $$ = $1;
+ asn1p_expr_add($$, $3);
+ }
+ ;
+
+NamedBit:
+ Identifier '(' TOK_number ')' {
+ $$ = NEW_EXPR();
+ checkmem($$);
+ $$->expr_type = A1TC_UNIVERVAL;
+ $$->meta_type = AMT_VALUE;
+ $$->Identifier = $1;
+ $$->value = asn1p_value_fromint($3);
+ }
+ | Identifier '(' DefinedValue ')' {
+ $$ = NEW_EXPR();
+ checkmem($$);
+ $$->expr_type = A1TC_UNIVERVAL;
+ $$->meta_type = AMT_VALUE;
+ $$->Identifier = $1;
+ $$->value = $3;
+ };
+
+Enumerations:
+ UniverationList {
+ $$ = $1;
+ asn1p_expr_t *first_memb = TQ_FIRST(&($$->members));
+ if(first_memb) {
+ if(first_memb->expr_type == A1TC_EXTENSIBLE) {
+ return yyerror(
+ "The ENUMERATION cannot start with extension (...).");
+ }
+ } else {
+ return yyerror(
+ "The ENUMERATION list cannot be empty.");
+ }
+ }
+
UniverationList:
UniverationElement {
$$ = NEW_EXPR();