Commit f59d075d authored by Lev Walkin's avatar Lev Walkin

new style constraints implementation support

parent b2664669
...@@ -546,9 +546,9 @@ distclean-generic: ...@@ -546,9 +546,9 @@ distclean-generic:
maintainer-clean-generic: maintainer-clean-generic:
@echo "This command is intended for maintainers to use" @echo "This command is intended for maintainers to use"
@echo "it deletes files that may require special tools to rebuild." @echo "it deletes files that may require special tools to rebuild."
-rm -f asn1p_y.h
-rm -f asn1p_y.c
-rm -f asn1p_l.c -rm -f asn1p_l.c
-rm -f asn1p_y.c
-rm -f asn1p_y.h
clean: clean-am clean: clean-am
clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
......
...@@ -108,3 +108,42 @@ asn1p_constraint_insert(asn1p_constraint_t *into, asn1p_constraint_t *what) { ...@@ -108,3 +108,42 @@ asn1p_constraint_insert(asn1p_constraint_t *into, asn1p_constraint_t *what) {
return 0; return 0;
} }
char *
asn1p_constraint_type2str(enum asn1p_constraint_type_e type) {
switch(type) {
case ACT_INVALID:
return "INVALID";
case ACT_EL_VALUE:
return "SingleValue";
case ACT_EL_RANGE:
case ACT_EL_LLRANGE:
case ACT_EL_RLRANGE:
case ACT_EL_ULRANGE:
return "ValueRange";
case ACT_EL_EXT:
return "...";
case ACT_CT_SIZE:
return "SizeConstraint";
case ACT_CT_FROM:
return "PermittedAlphabet";
case ACT_CT_WCOMP:
return "SingleTypeConstraint";
case ACT_CT_WCOMPS:
return "MultipleTypeConstraints";
case ACT_CA_SET:
return "SET";
case ACT_CA_CRC:
return "ComponentRelationConstraint";
case ACT_CA_CSV:
return "CSV";
case ACT_CA_UNI:
return "UNION";
case ACT_CA_INT:
return "INTERSECTION";
case ACT_CA_EXC:
return "EXCEPT";
}
return "UNKNOWN";
}
...@@ -59,6 +59,8 @@ typedef struct asn1p_constraint_s { ...@@ -59,6 +59,8 @@ typedef struct asn1p_constraint_s {
int _lineno; /* Position in a source file */ int _lineno; /* Position in a source file */
} asn1p_constraint_t; } asn1p_constraint_t;
/* Human-readable constraint type description */
char *asn1p_constraint_type2str(enum asn1p_constraint_type_e);
/* /*
* Constructors and a recursive destructor. * Constructors and a recursive destructor.
......
...@@ -57,6 +57,7 @@ asn1p_expr_clone(asn1p_expr_t *expr) { ...@@ -57,6 +57,7 @@ asn1p_expr_clone(asn1p_expr_t *expr) {
CLCLONE(Identifier, strdup); CLCLONE(Identifier, strdup);
CLCLONE(reference, asn1p_ref_clone); CLCLONE(reference, asn1p_ref_clone);
CLCLONE(constraints, asn1p_constraint_clone); CLCLONE(constraints, asn1p_constraint_clone);
CLCLONE(combined_constraints, asn1p_constraint_clone);
CLCLONE(params, asn1p_paramlist_clone); CLCLONE(params, asn1p_paramlist_clone);
CLCLONE(value, asn1p_value_clone); CLCLONE(value, asn1p_value_clone);
CLCLONE(with_syntax, asn1p_wsyntx_clone); CLCLONE(with_syntax, asn1p_wsyntx_clone);
...@@ -90,6 +91,8 @@ asn1p_expr_free(asn1p_expr_t *expr) { ...@@ -90,6 +91,8 @@ asn1p_expr_free(asn1p_expr_t *expr) {
asn1p_ref_free(expr->reference); asn1p_ref_free(expr->reference);
if(expr->constraints) if(expr->constraints)
asn1p_constraint_free(expr->constraints); asn1p_constraint_free(expr->constraints);
if(expr->combined_constraints)
asn1p_constraint_free(expr->combined_constraints);
if(expr->params) if(expr->params)
asn1p_paramlist_free(expr->params); asn1p_paramlist_free(expr->params);
if(expr->value) if(expr->value)
......
...@@ -124,6 +124,12 @@ typedef struct asn1p_expr_s { ...@@ -124,6 +124,12 @@ typedef struct asn1p_expr_s {
*/ */
asn1p_constraint_t *constraints; asn1p_constraint_t *constraints;
/*
* This field is holding the transformed constraints, with all the
* parent constraints taken into account.
*/
asn1p_constraint_t *combined_constraints;
/* /*
* A list of parameters for parametrized type declaration * A list of parameters for parametrized type declaration
* (AMT_PARAMTYPE). * (AMT_PARAMTYPE).
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
int asn1p_lex(void); int asn1p_lex(void);
void asn1p_lexer_hack_push_opaque_state(void); /* Used in .y */ void asn1p_lexer_hack_push_opaque_state(void); /* Used in .y */
void asn1p_lexer_hack_enable_with_syntax(void); /* Used in .y */ void asn1p_lexer_hack_enable_with_syntax(void); /* Used in .y */
void asn1p_lexer_hack_push_encoding_control(void); /* Used in .y */
#define YY_FATAL_ERROR(msg) do { \ #define YY_FATAL_ERROR(msg) do { \
fprintf(stderr, \ fprintf(stderr, \
...@@ -76,7 +77,7 @@ static asn1_integer_t asn1p_atoi(char *ptr); /* errno is either 0 or ERANGE */ ...@@ -76,7 +77,7 @@ static asn1_integer_t asn1p_atoi(char *ptr); /* errno is either 0 or ERANGE */
%} %}
%option never-interactive %option never-interactive
%option noinput nounput %option noinput
%option noyywrap stack %option noyywrap stack
/* Performance penalty is OK */ /* Performance penalty is OK */
%option yylineno %option yylineno
...@@ -89,6 +90,7 @@ static asn1_integer_t asn1p_atoi(char *ptr); /* errno is either 0 or ERANGE */ ...@@ -89,6 +90,7 @@ static asn1_integer_t asn1p_atoi(char *ptr); /* errno is either 0 or ERANGE */
%x cpp_comment %x cpp_comment
%x quoted %x quoted
%x opaque %x opaque
%x encoding_control
%x with_syntax %x with_syntax
/* Newline */ /* Newline */
...@@ -190,6 +192,19 @@ WSP [\t\r\v\f\n ] ...@@ -190,6 +192,19 @@ WSP [\t\r\v\f\n ]
} }
<encoding_control>{
ENCODING-CONTROL {
const char *s = "ENCODING-CONTROL";
const char *p = s + sizeof("ENCODING-CONTROL") - 2;
for(; p >= s; p--) unput(*p);
yy_pop_state();
}
END unput('D'); unput('N'); unput('E'); yy_pop_state();
[^{} \t\r\v\f\n]+
[[:alnum:]]+
. /* Eat everything else */
"\n"
}
'[0-9A-F \t\r\v\f\n]+'H { '[0-9A-F \t\r\v\f\n]+'H {
/* " \t\r\n" weren't allowed in ASN.1:1990. */ /* " \t\r\n" weren't allowed in ASN.1:1990. */
...@@ -311,6 +326,7 @@ DEFINED { ...@@ -311,6 +326,7 @@ DEFINED {
DEFINITIONS return TOK_DEFINITIONS; DEFINITIONS return TOK_DEFINITIONS;
EMBEDDED return TOK_EMBEDDED; EMBEDDED return TOK_EMBEDDED;
ENCODED return TOK_ENCODED; ENCODED return TOK_ENCODED;
ENCODING-CONTROL return TOK_ENCODING_CONTROL;
END return TOK_END; END return TOK_END;
ENUMERATED return TOK_ENUMERATED; ENUMERATED return TOK_ENUMERATED;
EXCEPT return TOK_EXCEPT; EXCEPT return TOK_EXCEPT;
...@@ -330,6 +346,7 @@ IMPLIED return TOK_IMPLIED; ...@@ -330,6 +346,7 @@ IMPLIED return TOK_IMPLIED;
IMPORTS return TOK_IMPORTS; IMPORTS return TOK_IMPORTS;
INCLUDES return TOK_INCLUDES; INCLUDES return TOK_INCLUDES;
INSTANCE return TOK_INSTANCE; INSTANCE return TOK_INSTANCE;
INSTRUCTIONS return TOK_INSTRUCTIONS;
INTEGER return TOK_INTEGER; INTEGER return TOK_INTEGER;
INTERSECTION return TOK_INTERSECTION; INTERSECTION return TOK_INTERSECTION;
ISO646String return TOK_ISO646String; ISO646String return TOK_ISO646String;
...@@ -405,7 +422,7 @@ WITH return TOK_WITH; ...@@ -405,7 +422,7 @@ WITH return TOK_WITH;
[A-Z][A-Z0-9-]* { [A-Z][A-Z0-9-]* {
CHECK_DASHES; CHECK_DASHES;
asn1p_lval.tv_str = strdup(yytext); asn1p_lval.tv_str = strdup(yytext);
return TOK_objectclassreference; return TOK_capitalreference;
} }
/* /*
...@@ -460,6 +477,7 @@ WITH return TOK_WITH; ...@@ -460,6 +477,7 @@ WITH return TOK_WITH;
} }
[|^] return yytext[0]; /* Union, Intersection */
<*>. { <*>. {
fprintf(stderr, fprintf(stderr,
...@@ -485,17 +503,16 @@ WITH return TOK_WITH; ...@@ -485,17 +503,16 @@ WITH return TOK_WITH;
/* /*
* Very dirty but wonderful hack allowing to rule states from within .y file. * Very dirty but wonderful hack allowing to rule states from within .y file.
*/ */
void void asn1p_lexer_hack_push_opaque_state() { yy_push_state(opaque); }
asn1p_lexer_hack_push_opaque_state() {
yy_push_state(opaque);
}
/* /*
* Another hack which disables recognizing some tokens when inside WITH SYNTAX. * Another hack which disables recognizing some tokens when inside WITH SYNTAX.
*/ */
void void asn1p_lexer_hack_enable_with_syntax() { yy_push_state(with_syntax); }
asn1p_lexer_hack_enable_with_syntax() {
yy_push_state(with_syntax); /* Yet another */
void asn1p_lexer_hack_push_encoding_control() {
yy_push_state(encoding_control);
} }
/* /*
......
...@@ -9,11 +9,16 @@ ...@@ -9,11 +9,16 @@
*/ */
typedef enum asn1p_module_flags { typedef enum asn1p_module_flags {
MSF_NOFLAGS, MSF_NOFLAGS,
MSF_EXPLICIT_TAGS = 0x1, MSF_unk_INSTRUCTIONS = 0x001,
MSF_IMPLICIT_TAGS = 0x2, MSF_TAG_INSTRUCTIONS = 0x002,
MSF_AUTOMATIC_TAGS = 0x4, MSF_XER_INSTRUCTIONS = 0x004,
MSF_EXTENSIBILITY_IMPLIED = 0x8, MSF_EXPLICIT_TAGS = 0x010,
MSF_IMPLICIT_TAGS = 0x020,
MSF_AUTOMATIC_TAGS = 0x040,
MSF_EXTENSIBILITY_IMPLIED = 0x100,
} asn1p_module_flags_e; } asn1p_module_flags_e;
#define MSF_MASK_INSTRUCTIONS 0x0f
#define MSF_MASK_TAGS 0xf0
/* /*
* === EXAMPLE === * === EXAMPLE ===
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -39,7 +39,7 @@ typedef union { ...@@ -39,7 +39,7 @@ typedef union {
#define TOK_number 263 #define TOK_number 263
#define TOK_number_negative 264 #define TOK_number_negative 264
#define TOK_typereference 265 #define TOK_typereference 265
#define TOK_objectclassreference 266 #define TOK_capitalreference 266
#define TOK_typefieldreference 267 #define TOK_typefieldreference 267
#define TOK_valuefieldreference 268 #define TOK_valuefieldreference 268
#define TOK_ABSENT 269 #define TOK_ABSENT 269
...@@ -65,68 +65,70 @@ typedef union { ...@@ -65,68 +65,70 @@ typedef union {
#define TOK_DEFINED 289 #define TOK_DEFINED 289
#define TOK_EMBEDDED 290 #define TOK_EMBEDDED 290
#define TOK_ENCODED 291 #define TOK_ENCODED 291
#define TOK_END 292 #define TOK_ENCODING_CONTROL 292
#define TOK_ENUMERATED 293 #define TOK_END 293
#define TOK_EXPLICIT 294 #define TOK_ENUMERATED 294
#define TOK_EXPORTS 295 #define TOK_EXPLICIT 295
#define TOK_EXTENSIBILITY 296 #define TOK_EXPORTS 296
#define TOK_EXTERNAL 297 #define TOK_EXTENSIBILITY 297
#define TOK_FALSE 298 #define TOK_EXTERNAL 298
#define TOK_FROM 299 #define TOK_FALSE 299
#define TOK_GeneralizedTime 300 #define TOK_FROM 300
#define TOK_GeneralString 301 #define TOK_GeneralizedTime 301
#define TOK_GraphicString 302 #define TOK_GeneralString 302
#define TOK_IA5String 303 #define TOK_GraphicString 303
#define TOK_IDENTIFIER 304 #define TOK_IA5String 304
#define TOK_IMPLICIT 305 #define TOK_IDENTIFIER 305
#define TOK_IMPLIED 306 #define TOK_IMPLICIT 306
#define TOK_IMPORTS 307 #define TOK_IMPLIED 307
#define TOK_INCLUDES 308 #define TOK_IMPORTS 308
#define TOK_INSTANCE 309 #define TOK_INCLUDES 309
#define TOK_INTEGER 310 #define TOK_INSTANCE 310
#define TOK_ISO646String 311 #define TOK_INSTRUCTIONS 311
#define TOK_MAX 312 #define TOK_INTEGER 312
#define TOK_MIN 313 #define TOK_ISO646String 313
#define TOK_MINUS_INFINITY 314 #define TOK_MAX 314
#define TOK_NULL 315 #define TOK_MIN 315
#define TOK_NumericString 316 #define TOK_MINUS_INFINITY 316
#define TOK_OBJECT 317 #define TOK_NULL 317
#define TOK_ObjectDescriptor 318 #define TOK_NumericString 318
#define TOK_OCTET 319 #define TOK_OBJECT 319
#define TOK_OF 320 #define TOK_ObjectDescriptor 320
#define TOK_OPTIONAL 321 #define TOK_OCTET 321
#define TOK_PATTERN 322 #define TOK_OF 322
#define TOK_PDV 323 #define TOK_OPTIONAL 323
#define TOK_PLUS_INFINITY 324 #define TOK_PATTERN 324
#define TOK_PRESENT 325 #define TOK_PDV 325
#define TOK_PrintableString 326 #define TOK_PLUS_INFINITY 326
#define TOK_PRIVATE 327 #define TOK_PRESENT 327
#define TOK_REAL 328 #define TOK_PrintableString 328
#define TOK_RELATIVE_OID 329 #define TOK_PRIVATE 329
#define TOK_SEQUENCE 330 #define TOK_REAL 330
#define TOK_SET 331 #define TOK_RELATIVE_OID 331
#define TOK_SIZE 332 #define TOK_SEQUENCE 332
#define TOK_STRING 333 #define TOK_SET 333
#define TOK_SYNTAX 334 #define TOK_SIZE 334
#define TOK_T61String 335 #define TOK_STRING 335
#define TOK_TAGS 336 #define TOK_SYNTAX 336
#define TOK_TeletexString 337 #define TOK_T61String 337
#define TOK_TRUE 338 #define TOK_TAGS 338
#define TOK_TYPE_IDENTIFIER 339 #define TOK_TeletexString 339
#define TOK_UNIQUE 340 #define TOK_TRUE 340
#define TOK_UNIVERSAL 341 #define TOK_TYPE_IDENTIFIER 341
#define TOK_UniversalString 342 #define TOK_UNIQUE 342
#define TOK_UTCTime 343 #define TOK_UNIVERSAL 343
#define TOK_UTF8String 344 #define TOK_UniversalString 344
#define TOK_VideotexString 345 #define TOK_UTCTime 345
#define TOK_VisibleString 346 #define TOK_UTF8String 346
#define TOK_WITH 347 #define TOK_VideotexString 347
#define TOK_UNION 348 #define TOK_VisibleString 348
#define TOK_INTERSECTION 349 #define TOK_WITH 349
#define TOK_EXCEPT 350 #define TOK_EXCEPT 350
#define TOK_TwoDots 351 #define TOK_INTERSECTION 351
#define TOK_ThreeDots 352 #define TOK_UNION 352
#define TOK_tag 353 #define TOK_TwoDots 353
#define TOK_ThreeDots 354
#define TOK_tag 355
extern YYSTYPE asn1p_lval; extern YYSTYPE asn1p_lval;
...@@ -15,6 +15,7 @@ int yylex(void); ...@@ -15,6 +15,7 @@ int yylex(void);
int yyerror(const char *msg); int yyerror(const char *msg);
void asn1p_lexer_hack_push_opaque_state(void); void asn1p_lexer_hack_push_opaque_state(void);
void asn1p_lexer_hack_enable_with_syntax(void); void asn1p_lexer_hack_enable_with_syntax(void);
void asn1p_lexer_hack_push_encoding_control(void);
#define yylineno asn1p_lineno #define yylineno asn1p_lineno
extern int asn1p_lineno; extern int asn1p_lineno;
...@@ -99,7 +100,7 @@ static asn1p_value_t * ...@@ -99,7 +100,7 @@ static asn1p_value_t *
%token <a_int> TOK_number %token <a_int> TOK_number
%token <a_int> TOK_number_negative %token <a_int> TOK_number_negative
%token <tv_str> TOK_typereference %token <tv_str> TOK_typereference
%token <tv_str> TOK_objectclassreference /* "CLASS1" */ %token <tv_str> TOK_capitalreference /* "CLASS1" */
%token <tv_str> TOK_typefieldreference /* "&Pork" */ %token <tv_str> TOK_typefieldreference /* "&Pork" */
%token <tv_str> TOK_valuefieldreference /* "&id" */ %token <tv_str> TOK_valuefieldreference /* "&id" */
...@@ -129,6 +130,7 @@ static asn1p_value_t * ...@@ -129,6 +130,7 @@ static asn1p_value_t *
%token TOK_DEFINED %token TOK_DEFINED
%token TOK_EMBEDDED %token TOK_EMBEDDED
%token TOK_ENCODED %token TOK_ENCODED
%token TOK_ENCODING_CONTROL
%token TOK_END %token TOK_END
%token TOK_ENUMERATED %token TOK_ENUMERATED
%token TOK_EXPLICIT %token TOK_EXPLICIT
...@@ -147,6 +149,7 @@ static asn1p_value_t * ...@@ -147,6 +149,7 @@ static asn1p_value_t *
%token TOK_IMPORTS %token TOK_IMPORTS
%token TOK_INCLUDES %token TOK_INCLUDES
%token TOK_INSTANCE %token TOK_INSTANCE
%token TOK_INSTRUCTIONS
%token TOK_INTEGER %token TOK_INTEGER
%token TOK_ISO646String %token TOK_ISO646String
%token TOK_MAX %token TOK_MAX
...@@ -186,9 +189,9 @@ static asn1p_value_t * ...@@ -186,9 +189,9 @@ static asn1p_value_t *
%token TOK_VisibleString %token TOK_VisibleString
%token TOK_WITH %token TOK_WITH
%left '|' TOK_UNION
%left '^' TOK_INTERSECTION
%left TOK_EXCEPT %left TOK_EXCEPT
%left '^' TOK_INTERSECTION
%left '|' TOK_UNION
/* Misc tags */ /* Misc tags */
%token TOK_TwoDots /* .. */ %token TOK_TwoDots /* .. */
...@@ -262,14 +265,10 @@ static asn1p_value_t * ...@@ -262,14 +265,10 @@ static asn1p_value_t *
%type <a_tag> Tag /* [UNIVERSAL 0] IMPLICIT */ %type <a_tag> Tag /* [UNIVERSAL 0] IMPLICIT */
%type <a_tag> optTag /* [UNIVERSAL 0] IMPLICIT */ %type <a_tag> optTag /* [UNIVERSAL 0] IMPLICIT */
%type <a_constr> optConstraints %type <a_constr> optConstraints
%type <a_constr> Constraints %type <a_constr> SetOfConstraints
%type <a_constr> SingleConstraint /* (SIZE(2)) */ %type <a_constr> ElementSetSpecs /* 1..2,...,3 */
%type <a_constr> ConstraintElementSet /* 1..2,...,3 */ %type <a_constr> ElementSetSpec /* 1..2,...,3 */
%type <a_constr> ConstraintSubtypeElement /* 1..2 */ %type <a_constr> ConstraintSubtypeElement /* 1..2 */
%type <a_constr> ConstraintElementIntersection
%type <a_constr> ConstraintElementException
%type <a_constr> ConstraintElementUnion
%type <a_constr> ConstraintElement
%type <a_constr> SimpleTableConstraint %type <a_constr> SimpleTableConstraint
%type <a_constr> TableConstraint %type <a_constr> TableConstraint
%type <a_constr> WithComponents %type <a_constr> WithComponents
...@@ -429,6 +428,22 @@ ModuleSpecificationFlag: ...@@ -429,6 +428,22 @@ ModuleSpecificationFlag:
| TOK_EXTENSIBILITY TOK_IMPLIED { | TOK_EXTENSIBILITY TOK_IMPLIED {
$$ = MSF_EXTENSIBILITY_IMPLIED; $$ = MSF_EXTENSIBILITY_IMPLIED;
} }
/* EncodingReferenceDefault */
| TOK_capitalreference TOK_INSTRUCTIONS {
/* X.680Amd1 specifies TAG and XER */
if(strcmp($1, "TAG") == 0) {
$$ = MSF_TAG_INSTRUCTIONS;
} else if(strcmp($1, "XER") == 0) {
$$ = MSF_XER_INSTRUCTIONS;
} else {
fprintf(stderr,
"WARNING: %s INSTRUCTIONS at line %d: "
"Unrecognized encoding reference\n",
$1, yylineno);
$$ = MSF_unk_INSTRUCTIONS;
}
free($1);
}
; ;
/* /*
...@@ -437,7 +452,6 @@ ModuleSpecificationFlag: ...@@ -437,7 +452,6 @@ ModuleSpecificationFlag:
optModuleSpecificationBody: optModuleSpecificationBody:
{ $$ = 0; } { $$ = 0; }
| ModuleSpecificationBody { | ModuleSpecificationBody {
assert($1);
$$ = $1; $$ = $1;
} }
; ;
...@@ -452,6 +466,12 @@ ModuleSpecificationBody: ...@@ -452,6 +466,12 @@ ModuleSpecificationBody:
| ModuleSpecificationBody ModuleSpecificationElement { | ModuleSpecificationBody ModuleSpecificationElement {
$$ = $1; $$ = $1;
/* Behave well when one of them is skipped. */
if(!($1)) {
if($2) $$ = $2;
break;
}
#ifdef MY_IMPORT #ifdef MY_IMPORT
#error MY_IMPORT DEFINED ELSEWHERE! #error MY_IMPORT DEFINED ELSEWHERE!
#endif #endif
...@@ -515,6 +535,16 @@ ModuleSpecificationElement: ...@@ -515,6 +535,16 @@ ModuleSpecificationElement:
assert($1->meta_type != AMT_INVALID); assert($1->meta_type != AMT_INVALID);
TQ_ADD(&($$->members), $1, next); TQ_ADD(&($$->members), $1, next);
} }
| TOK_ENCODING_CONTROL TOK_capitalreference
{ asn1p_lexer_hack_push_encoding_control(); }
{
fprintf(stderr,
"WARNING: ENCODING-CONTROL %s "
"specification at line %d ignored\n",
$2, yylineno);
free($2);
$$ = 0;
}
/* /*
* Erroneous attemps * Erroneous attemps
...@@ -662,7 +692,7 @@ DefinedTypeRef: ...@@ -662,7 +692,7 @@ DefinedTypeRef:
optValueSetBody: optValueSetBody:
{ } { }
| ConstraintElementSet { | ElementSetSpecs {
} }
; ;
...@@ -1346,20 +1376,19 @@ ConstructedType: ...@@ -1346,20 +1376,19 @@ ConstructedType:
/* /*
* Data type constraints. * Data type constraints.
*/ */
optConstraints:
{ $$ = 0; }
| Constraints { $$ = $1; }
;
Union: '|' | TOK_UNION; Union: '|' | TOK_UNION;
Intersection: '^' | TOK_INTERSECTION; Intersection: '^' | TOK_INTERSECTION;
Except: TOK_EXCEPT; Except: TOK_EXCEPT;
Constraints: optConstraints:
TOK_SIZE '(' ConstraintElementSet ')' { { $$ = 0; }
| SetOfConstraints {
CONSTRAINT_INSERT($$, ACT_CA_SET, $1, 0);
}
| TOK_SIZE '(' ElementSetSpecs ')' {
/* /*
* This is a special case, for compatibility purposes. * This is a special case, for compatibility purposes.
* It goes without parenthesis. * It goes without parentheses.
*/ */
int ret; int ret;
$$ = asn1p_constraint_new(yylineno); $$ = asn1p_constraint_new(yylineno);
...@@ -1368,80 +1397,70 @@ Constraints: ...@@ -1368,80 +1397,70 @@ Constraints:
ret = asn1p_constraint_insert($$, $3); ret = asn1p_constraint_insert($$, $3);
checkmem(ret == 0); checkmem(ret == 0);
} }
| SingleConstraint {
CONSTRAINT_INSERT($$, ACT_CA_SET, $1, 0);
}
| Constraints SingleConstraint {
CONSTRAINT_INSERT($$, ACT_CA_SET, $1, $2);
}
; ;
SingleConstraint: SetOfConstraints:
'(' ConstraintElementSet ')' { '(' ElementSetSpecs ')' {
$$ = $2; $$ = $2;
} }
| SetOfConstraints '(' ElementSetSpecs ')' {
CONSTRAINT_INSERT($$, ACT_CA_SET, $1, $3);
}
; ;
ConstraintElementSet: ElementSetSpecs:
ConstraintElement { ElementSetSpec {
$$ = $1; $$ = $1;
} }
| ConstraintElement ',' TOK_ThreeDots { | ElementSetSpec ',' TOK_ThreeDots {
asn1p_constraint_t *ct; asn1p_constraint_t *ct;
ct = asn1p_constraint_new(yylineno); ct = asn1p_constraint_new(yylineno);
checkmem(ct);
ct->type = ACT_EL_EXT; ct->type = ACT_EL_EXT;
CONSTRAINT_INSERT($$, ACT_CA_CSV, $1, ct); CONSTRAINT_INSERT($$, ACT_CA_CSV, $1, ct);
} }
| ConstraintElement ',' TOK_ThreeDots ',' ConstraintElement { | ElementSetSpec ',' TOK_ThreeDots ',' ElementSetSpec {
asn1p_constraint_t *ct; asn1p_constraint_t *ct;
ct = asn1p_constraint_new(yylineno); ct = asn1p_constraint_new(yylineno);
checkmem(ct);
ct->type = ACT_EL_EXT; ct->type = ACT_EL_EXT;
CONSTRAINT_INSERT($$, ACT_CA_CSV, $1, ct); CONSTRAINT_INSERT($$, ACT_CA_CSV, $1, ct);
ct = $$; ct = $$;
CONSTRAINT_INSERT($$, ACT_CA_CSV, ct, $5); CONSTRAINT_INSERT($$, ACT_CA_CSV, ct, $5);
} }
| TOK_ThreeDots {
$$ = asn1p_constraint_new(yylineno);
checkmem($$);
$$->type = ACT_EL_EXT;
}
| TOK_ThreeDots ',' ConstraintElement {
asn1p_constraint_t *ct;
ct = asn1p_constraint_new(yylineno);
checkmem(ct);
ct->type = ACT_EL_EXT;
CONSTRAINT_INSERT($$, ACT_CA_CSV, ct, $3);
}
; ;
ConstraintElement: ConstraintElementUnion { $$ = $1; } ; ElementSetSpec:
ConstraintSubtypeElement {
ConstraintElementUnion: $$ = $1;
ConstraintElementIntersection { $$ = $1; } }
| ConstraintElementUnion Union ConstraintElementIntersection { | ElementSetSpec Union ConstraintSubtypeElement {
CONSTRAINT_INSERT($$, ACT_CA_UNI, $1, $3); CONSTRAINT_INSERT($$, ACT_CA_UNI, $1, $3);
} }
; | ElementSetSpec Intersection ConstraintSubtypeElement {
ConstraintElementIntersection:
ConstraintElementException { $$ = $1; }
| ConstraintElementIntersection Intersection
ConstraintElementException {
CONSTRAINT_INSERT($$, ACT_CA_INT, $1, $3); CONSTRAINT_INSERT($$, ACT_CA_INT, $1, $3);
} }
; | ConstraintSubtypeElement Except ConstraintSubtypeElement {
ConstraintElementException:
ConstraintSubtypeElement { $$ = $1; }
| ConstraintElementException Except ConstraintSubtypeElement {
CONSTRAINT_INSERT($$, ACT_CA_EXC, $1, $3); CONSTRAINT_INSERT($$, ACT_CA_EXC, $1, $3);
} }
; ;
ConstraintSubtypeElement: ConstraintSubtypeElement:
ConstraintValue { ConstraintSpec '(' ElementSetSpecs ')' {
int ret;
$$ = asn1p_constraint_new(yylineno);
checkmem($$);
$$->type = $1;
ret = asn1p_constraint_insert($$, $3);
checkmem(ret == 0);
}
| '(' ElementSetSpecs ')' {
int ret;
$$ = asn1p_constraint_new(yylineno);
checkmem($$);
$$->type = ACT_CA_SET;
ret = asn1p_constraint_insert($$, $2);
checkmem(ret == 0);
}
| ConstraintValue {
$$ = asn1p_constraint_new(yylineno); $$ = asn1p_constraint_new(yylineno);
checkmem($$); checkmem($$);
$$->type = ACT_EL_VALUE; $$->type = ACT_EL_VALUE;
...@@ -1454,13 +1473,30 @@ ConstraintSubtypeElement: ...@@ -1454,13 +1473,30 @@ ConstraintSubtypeElement:
$$->range_start = $1; $$->range_start = $1;
$$->range_stop = $3; $$->range_stop = $3;
} }
| ConstraintSpec '(' ConstraintElementSet ')' { | TOK_MIN ConstraintRangeSpec ConstraintValue {
int ret;
$$ = asn1p_constraint_new(yylineno); $$ = asn1p_constraint_new(yylineno);
checkmem($$); checkmem($$);
$$->type = $1; $$->type = $2;
ret = asn1p_constraint_insert($$, $3); $$->range_start = asn1p_value_fromint(-123);
checkmem(ret == 0); $$->range_stop = $3;
$$->range_start->type = ATV_MIN;
}
| ConstraintValue ConstraintRangeSpec TOK_MAX {
$$ = asn1p_constraint_new(yylineno);
checkmem($$);
$$->type = $2;
$$->range_start = $1;
$$->range_stop = asn1p_value_fromint(321);
$$->range_stop->type = ATV_MAX;
}
| TOK_MIN ConstraintRangeSpec TOK_MAX {
$$ = asn1p_constraint_new(yylineno);
checkmem($$);
$$->type = $2;
$$->range_start = asn1p_value_fromint(-123);
$$->range_stop = asn1p_value_fromint(321);
$$->range_start->type = ATV_MIN;
$$->range_stop->type = ATV_MAX;
} }
| TableConstraint { | TableConstraint {
$$ = $1; $$ = $1;
...@@ -1505,16 +1541,7 @@ ConstraintValue: ...@@ -1505,16 +1541,7 @@ ConstraintValue:
$$ = asn1p_value_frombuf($1.buf, $1.len, 0); $$ = asn1p_value_frombuf($1.buf, $1.len, 0);
checkmem($$); checkmem($$);
} }
| TOK_MIN {
$$ = asn1p_value_fromint(123);
checkmem($$);
$$->type = ATV_MIN;
}
| TOK_MAX {
$$ = asn1p_value_fromint(321);
checkmem($$);
$$->type = ATV_MAX;
}
| TOK_FALSE { | TOK_FALSE {
$$ = asn1p_value_fromint(0); $$ = asn1p_value_fromint(0);
checkmem($$); checkmem($$);
...@@ -1841,14 +1868,15 @@ TypeRefName: ...@@ -1841,14 +1868,15 @@ TypeRefName:
checkmem($1); checkmem($1);
$$ = $1; $$ = $1;
} }
| TOK_objectclassreference { | TOK_capitalreference {
checkmem($1); checkmem($1);
$$ = $1; $$ = $1;
} }
; ;
ObjectClassReference: ObjectClassReference:
TOK_objectclassreference { TOK_capitalreference {
checkmem($1); checkmem($1);
$$ = $1; $$ = $1;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment