new WITH SYNTAX clause parsing
diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y
index 36d9baf..f39bd12 100644
--- a/libasn1parser/asn1p_y.y
+++ b/libasn1parser/asn1p_y.y
@@ -120,6 +120,7 @@
%token <tv_str> TOK_capitalreference /* "CLASS1" */
%token <tv_str> TOK_typefieldreference /* "&Pork" */
%token <tv_str> TOK_valuefieldreference /* "&id" */
+%token <tv_str> TOK_Literal /* "BY" */
/*
* Token types representing ASN.1 standard keywords.
@@ -307,8 +308,8 @@
%type <a_value> RestrictedCharacterStringValue
%type <a_wsynt> optWithSyntax
%type <a_wsynt> WithSyntax
-%type <a_wsynt> WithSyntaxFormat
-%type <a_wchunk> WithSyntaxFormatToken
+%type <a_wsynt> WithSyntaxList
+%type <a_wchunk> WithSyntaxToken
%type <a_marker> optMarker Marker
%type <a_int> optUnique
%type <a_pres> optPresenceConstraint PresenceConstraint
@@ -1054,27 +1055,30 @@
WithSyntax:
TOK_WITH TOK_SYNTAX '{'
{ asn1p_lexer_hack_enable_with_syntax(); }
- WithSyntaxFormat
+ WithSyntaxList
'}' {
$$ = $5;
}
;
-WithSyntaxFormat:
- WithSyntaxFormatToken {
+WithSyntaxList:
+ WithSyntaxToken {
$$ = asn1p_wsyntx_new();
TQ_ADD(&($$->chunks), $1, next);
}
- | WithSyntaxFormat WithSyntaxFormatToken {
+ | WithSyntaxList WithSyntaxToken {
$$ = $1;
TQ_ADD(&($$->chunks), $2, next);
}
;
-WithSyntaxFormatToken:
+WithSyntaxToken:
TOK_opaque {
$$ = asn1p_wsyntx_chunk_frombuf($1.buf, $1.len, 0);
}
+ | TOK_Literal {
+ $$ = asn1p_wsyntx_chunk_frombuf($1, strlen($1), 0);
+ }
| ClassFieldIdentifier {
asn1p_ref_t *ref;
int ret;
@@ -1084,6 +1088,9 @@
checkmem(ret == 0);
$$ = asn1p_wsyntx_chunk_fromref(ref, 0);
}
+ | '[' WithSyntaxList ']' {
+ $$ = asn1p_wsyntx_chunk_fromsyntax($2);
+ }
;
ExtensionAndException:
@@ -2340,10 +2347,9 @@
expr->Identifier);
}
-extern char *asn1p_text;
-
int
yyerror(const char *msg) {
+ extern char *asn1p_text;
fprintf(stderr,
"ASN.1 grammar parse error "
"near line %d (token \"%s\"): %s\n",
@@ -2351,4 +2357,3 @@
return -1;
}
-