blob: a3d055c6655a2d07cd25e4c1b95c9545bd7f1a52 [file] [log] [blame]
Lev Walkinf15320b2004-06-03 03:38:44 +00001%{
2
3#include <stdlib.h>
4#include <stdio.h>
5#include <string.h>
6#include <errno.h>
7#include <assert.h>
8
9#include "asn1parser.h"
10
11#define YYPARSE_PARAM param
Lev Walkin4354b442005-06-07 21:25:42 +000012#define YYPARSE_PARAM_TYPE void **
Lev Walkinf15320b2004-06-03 03:38:44 +000013#define YYERROR_VERBOSE
14
15int yylex(void);
16int yyerror(const char *msg);
Lev Walkin8daab912005-06-07 21:32:16 +000017#ifdef YYBYACC
18int yyparse(void **param); /* byacc does not produce a prototype */
19#endif
Lev Walkinf15320b2004-06-03 03:38:44 +000020void asn1p_lexer_hack_push_opaque_state(void);
21void asn1p_lexer_hack_enable_with_syntax(void);
Lev Walkinf59d0752004-08-18 04:59:12 +000022void asn1p_lexer_hack_push_encoding_control(void);
Lev Walkinf15320b2004-06-03 03:38:44 +000023#define yylineno asn1p_lineno
24extern int asn1p_lineno;
25
Lev Walkin1ed22092005-08-12 10:06:17 +000026/*
Lev Walkinef625402005-09-05 05:17:57 +000027 * Process directives as <ASN1C:RepresentAsPointer>
Lev Walkin4696c742005-08-22 12:23:54 +000028 */
29extern int asn1p_as_pointer;
Lev Walkin4696c742005-08-22 12:23:54 +000030
31/*
Lev Walkin1ed22092005-08-12 10:06:17 +000032 * This temporary variable is used to solve the shortcomings of 1-lookahead
33 * parser.
34 */
35static struct AssignedIdentifier *saved_aid;
Lev Walkinf15320b2004-06-03 03:38:44 +000036
Lev Walkin2e9bd5c2005-08-13 09:07:11 +000037static asn1p_value_t *_convert_bitstring2binary(char *str, int base);
38static void _fixup_anonymous_identifier(asn1p_expr_t *expr);
Lev Walkinf15320b2004-06-03 03:38:44 +000039
Lev Walkin1ed22092005-08-12 10:06:17 +000040#define checkmem(ptr) do { \
41 if(!(ptr)) \
42 return yyerror("Memory failure"); \
Lev Walkinf15320b2004-06-03 03:38:44 +000043 } while(0)
44
Lev Walkin2c14a692005-08-12 10:08:45 +000045#define CONSTRAINT_INSERT(root, constr_type, arg1, arg2) do { \
Lev Walkin1ed22092005-08-12 10:06:17 +000046 if(arg1->type != constr_type) { \
47 int __ret; \
48 root = asn1p_constraint_new(yylineno); \
49 checkmem(root); \
50 root->type = constr_type; \
51 __ret = asn1p_constraint_insert(root, \
52 arg1); \
53 checkmem(__ret == 0); \
54 } else { \
55 root = arg1; \
56 } \
57 if(arg2) { \
58 int __ret \
59 = asn1p_constraint_insert(root, arg2); \
60 checkmem(__ret == 0); \
61 } \
Lev Walkinf15320b2004-06-03 03:38:44 +000062 } while(0)
63
64%}
65
66
67/*
68 * Token value definition.
69 * a_*: ASN-specific types.
70 * tv_*: Locally meaningful types.
71 */
72%union {
73 asn1p_t *a_grammar;
74 asn1p_module_flags_e a_module_flags;
75 asn1p_module_t *a_module;
76 asn1p_expr_type_e a_type; /* ASN.1 Type */
77 asn1p_expr_t *a_expr; /* Constructed collection */
78 asn1p_constraint_t *a_constr; /* Constraint */
79 enum asn1p_constraint_type_e a_ctype;/* Constraint type */
80 asn1p_xports_t *a_xports; /* IMports/EXports */
Lev Walkin1ed22092005-08-12 10:06:17 +000081 struct AssignedIdentifier a_aid; /* Assigned Identifier */
Lev Walkinf15320b2004-06-03 03:38:44 +000082 asn1p_oid_t *a_oid; /* Object Identifier */
83 asn1p_oid_arc_t a_oid_arc; /* Single OID's arc */
84 struct asn1p_type_tag_s a_tag; /* A tag */
85 asn1p_ref_t *a_ref; /* Reference to custom type */
86 asn1p_wsyntx_t *a_wsynt; /* WITH SYNTAX contents */
87 asn1p_wsyntx_chunk_t *a_wchunk; /* WITH SYNTAX chunk */
88 struct asn1p_ref_component_s a_refcomp; /* Component of a reference */
89 asn1p_value_t *a_value; /* Number, DefinedValue, etc */
90 struct asn1p_param_s a_parg; /* A parameter argument */
91 asn1p_paramlist_t *a_plist; /* A pargs list */
Lev Walkin9c974182004-09-15 11:59:51 +000092 struct asn1p_expr_marker_s a_marker; /* OPTIONAL/DEFAULT */
Lev Walkinf15320b2004-06-03 03:38:44 +000093 enum asn1p_constr_pres_e a_pres; /* PRESENT/ABSENT/OPTIONAL */
Lev Walkin144db9b2004-10-12 23:26:53 +000094 asn1c_integer_t a_int;
Lev Walkinf15320b2004-06-03 03:38:44 +000095 char *tv_str;
96 struct {
97 char *buf;
98 int len;
99 } tv_opaque;
100 struct {
101 char *name;
102 struct asn1p_type_tag_s tag;
103 } tv_nametag;
104};
105
106/*
107 * Token types returned by scanner.
108 */
109%token TOK_PPEQ /* "::=", Pseudo Pascal EQuality */
Lev Walkin57074f12006-03-16 05:11:14 +0000110%token <tv_opaque> TOK_whitespace /* A span of whitespace */
Lev Walkinf15320b2004-06-03 03:38:44 +0000111%token <tv_opaque> TOK_opaque /* opaque data (driven from .y) */
112%token <tv_str> TOK_bstring
113%token <tv_opaque> TOK_cstring
114%token <tv_str> TOK_hstring
115%token <tv_str> TOK_identifier
116%token <a_int> TOK_number
Lev Walkind9574ae2005-03-24 16:22:35 +0000117%token <a_int> TOK_tuple
118%token <a_int> TOK_quadruple
Lev Walkinf15320b2004-06-03 03:38:44 +0000119%token <a_int> TOK_number_negative
120%token <tv_str> TOK_typereference
Lev Walkinf59d0752004-08-18 04:59:12 +0000121%token <tv_str> TOK_capitalreference /* "CLASS1" */
Lev Walkinf15320b2004-06-03 03:38:44 +0000122%token <tv_str> TOK_typefieldreference /* "&Pork" */
123%token <tv_str> TOK_valuefieldreference /* "&id" */
Lev Walkin9d542d22006-03-14 16:31:37 +0000124%token <tv_str> TOK_Literal /* "BY" */
Lev Walkinf15320b2004-06-03 03:38:44 +0000125
126/*
127 * Token types representing ASN.1 standard keywords.
128 */
129%token TOK_ABSENT
130%token TOK_ABSTRACT_SYNTAX
131%token TOK_ALL
132%token TOK_ANY
133%token TOK_APPLICATION
134%token TOK_AUTOMATIC
135%token TOK_BEGIN
136%token TOK_BIT
137%token TOK_BMPString
138%token TOK_BOOLEAN
139%token TOK_BY
140%token TOK_CHARACTER
141%token TOK_CHOICE
142%token TOK_CLASS
143%token TOK_COMPONENT
144%token TOK_COMPONENTS
145%token TOK_CONSTRAINED
146%token TOK_CONTAINING
147%token TOK_DEFAULT
148%token TOK_DEFINITIONS
149%token TOK_DEFINED
150%token TOK_EMBEDDED
151%token TOK_ENCODED
Lev Walkinf59d0752004-08-18 04:59:12 +0000152%token TOK_ENCODING_CONTROL
Lev Walkinf15320b2004-06-03 03:38:44 +0000153%token TOK_END
154%token TOK_ENUMERATED
155%token TOK_EXPLICIT
156%token TOK_EXPORTS
157%token TOK_EXTENSIBILITY
158%token TOK_EXTERNAL
159%token TOK_FALSE
160%token TOK_FROM
161%token TOK_GeneralizedTime
162%token TOK_GeneralString
163%token TOK_GraphicString
164%token TOK_IA5String
165%token TOK_IDENTIFIER
166%token TOK_IMPLICIT
167%token TOK_IMPLIED
168%token TOK_IMPORTS
169%token TOK_INCLUDES
170%token TOK_INSTANCE
Lev Walkinf59d0752004-08-18 04:59:12 +0000171%token TOK_INSTRUCTIONS
Lev Walkinf15320b2004-06-03 03:38:44 +0000172%token TOK_INTEGER
173%token TOK_ISO646String
174%token TOK_MAX
175%token TOK_MIN
176%token TOK_MINUS_INFINITY
177%token TOK_NULL
178%token TOK_NumericString
179%token TOK_OBJECT
180%token TOK_ObjectDescriptor
181%token TOK_OCTET
182%token TOK_OF
183%token TOK_OPTIONAL
184%token TOK_PATTERN
185%token TOK_PDV
186%token TOK_PLUS_INFINITY
187%token TOK_PRESENT
188%token TOK_PrintableString
189%token TOK_PRIVATE
190%token TOK_REAL
191%token TOK_RELATIVE_OID
192%token TOK_SEQUENCE
193%token TOK_SET
194%token TOK_SIZE
195%token TOK_STRING
196%token TOK_SYNTAX
197%token TOK_T61String
198%token TOK_TAGS
199%token TOK_TeletexString
200%token TOK_TRUE
201%token TOK_TYPE_IDENTIFIER
202%token TOK_UNIQUE
203%token TOK_UNIVERSAL
204%token TOK_UniversalString
205%token TOK_UTCTime
206%token TOK_UTF8String
207%token TOK_VideotexString
208%token TOK_VisibleString
209%token TOK_WITH
210
Lev Walkinf15320b2004-06-03 03:38:44 +0000211%left TOK_EXCEPT
Lev Walkinf59d0752004-08-18 04:59:12 +0000212%left '^' TOK_INTERSECTION
213%left '|' TOK_UNION
Lev Walkinf15320b2004-06-03 03:38:44 +0000214
215/* Misc tags */
216%token TOK_TwoDots /* .. */
217%token TOK_ThreeDots /* ... */
Lev Walkinf15320b2004-06-03 03:38:44 +0000218
219
220/*
221 * Types defined herein.
222 */
223%type <a_grammar> ModuleList
224%type <a_module> ModuleSpecification
225%type <a_module> ModuleSpecificationBody
226%type <a_module> ModuleSpecificationElement
227%type <a_module> optModuleSpecificationBody /* Optional */
228%type <a_module_flags> optModuleSpecificationFlags
229%type <a_module_flags> ModuleSpecificationFlags /* Set of FL */
230%type <a_module_flags> ModuleSpecificationFlag /* Single FL */
231%type <a_module> ImportsDefinition
232%type <a_module> ImportsBundleSet
233%type <a_xports> ImportsBundle
234%type <a_xports> ImportsList
235%type <a_xports> ExportsDefinition
236%type <a_xports> ExportsBody
237%type <a_expr> ImportsElement
238%type <a_expr> ExportsElement
Lev Walkinf15320b2004-06-03 03:38:44 +0000239%type <a_expr> ExtensionAndException
Lev Walkin070a52d2004-08-22 03:19:54 +0000240%type <a_expr> TypeDeclaration
Lev Walkin4696c742005-08-22 12:23:54 +0000241%type <a_expr> TypeDeclarationSet
Lev Walkinf15320b2004-06-03 03:38:44 +0000242%type <a_ref> ComplexTypeReference
243%type <a_ref> ComplexTypeReferenceAmpList
244%type <a_refcomp> ComplexTypeReferenceElement
Lev Walkind370e9f2006-03-16 10:03:35 +0000245%type <a_refcomp> PrimitiveFieldReference
Lev Walkin9c2285a2006-03-09 08:49:26 +0000246%type <a_expr> FieldSpec
247%type <a_ref> FieldName
248%type <a_ref> DefinedObjectClass
Lev Walkinf15320b2004-06-03 03:38:44 +0000249%type <a_expr> ClassField
Lev Walkin9c2285a2006-03-09 08:49:26 +0000250%type <a_expr> ObjectClass
Lev Walkin070a52d2004-08-22 03:19:54 +0000251%type <a_expr> Type
Lev Walkinf15320b2004-06-03 03:38:44 +0000252%type <a_expr> DataTypeReference /* Type1 ::= Type2 */
253%type <a_expr> DefinedTypeRef
254%type <a_expr> ValueSetDefinition /* Val INTEGER ::= {1|2} */
255%type <a_expr> ValueDefinition /* val INTEGER ::= 1*/
Lev Walkin9c974182004-09-15 11:59:51 +0000256%type <a_value> Value
Lev Walkinf15320b2004-06-03 03:38:44 +0000257%type <a_value> DefinedValue
258%type <a_value> SignedNumber
Lev Walkin144db9b2004-10-12 23:26:53 +0000259%type <a_expr> optComponentTypeLists
Lev Walkin070a52d2004-08-22 03:19:54 +0000260%type <a_expr> ComponentTypeLists
261%type <a_expr> ComponentType
262%type <a_expr> AlternativeTypeLists
263%type <a_expr> AlternativeType
Lev Walkinf15320b2004-06-03 03:38:44 +0000264//%type <a_expr> optUniverationDefinition
265%type <a_expr> UniverationDefinition
266%type <a_expr> UniverationList
267%type <a_expr> UniverationElement
268%type <tv_str> TypeRefName
269%type <tv_str> ObjectClassReference
Lev Walkinf15320b2004-06-03 03:38:44 +0000270%type <tv_str> Identifier
Lev Walkin83cac2f2004-09-22 16:03:36 +0000271%type <tv_str> optIdentifier
Lev Walkinf15320b2004-06-03 03:38:44 +0000272%type <a_parg> ParameterArgumentName
273%type <a_plist> ParameterArgumentList
274%type <a_expr> ActualParameter
275%type <a_expr> ActualParameterList
Lev Walkin1ed22092005-08-12 10:06:17 +0000276%type <a_aid> AssignedIdentifier /* OID/DefinedValue */
Lev Walkinf15320b2004-06-03 03:38:44 +0000277%type <a_oid> ObjectIdentifier /* OID */
278%type <a_oid> optObjectIdentifier /* Optional OID */
279%type <a_oid> ObjectIdentifierBody
280%type <a_oid_arc> ObjectIdentifierElement
281%type <a_expr> BasicType
282%type <a_type> BasicTypeId
283%type <a_type> BasicTypeId_UniverationCompatible
284%type <a_type> BasicString
285%type <tv_opaque> Opaque
286//%type <tv_opaque> StringValue
Lev Walkinc603f102005-01-23 09:51:44 +0000287%type <a_tag> Tag /* [UNIVERSAL 0] IMPLICIT */
288%type <a_tag> TagClass TagTypeValue TagPlicit
Lev Walkinf15320b2004-06-03 03:38:44 +0000289%type <a_tag> optTag /* [UNIVERSAL 0] IMPLICIT */
290%type <a_constr> optConstraints
Lev Walkind2ea1de2004-08-20 13:25:29 +0000291%type <a_constr> Constraints
Lev Walkinf59d0752004-08-18 04:59:12 +0000292%type <a_constr> SetOfConstraints
293%type <a_constr> ElementSetSpecs /* 1..2,...,3 */
294%type <a_constr> ElementSetSpec /* 1..2,...,3 */
Lev Walkinf15320b2004-06-03 03:38:44 +0000295%type <a_constr> ConstraintSubtypeElement /* 1..2 */
Lev Walkinf15320b2004-06-03 03:38:44 +0000296%type <a_constr> SimpleTableConstraint
297%type <a_constr> TableConstraint
Lev Walkine596bf02005-03-28 15:01:27 +0000298%type <a_constr> InnerTypeConstraint
Lev Walkinf15320b2004-06-03 03:38:44 +0000299%type <a_constr> WithComponentsList
300%type <a_constr> WithComponentsElement
301%type <a_constr> ComponentRelationConstraint
302%type <a_constr> AtNotationList
303%type <a_ref> AtNotationElement
Lev Walkinff7dd142005-03-20 12:58:00 +0000304%type <a_value> SingleValue
305%type <a_value> ContainedSubtype
Lev Walkinf15320b2004-06-03 03:38:44 +0000306%type <a_ctype> ConstraintSpec
307%type <a_ctype> ConstraintRangeSpec
Lev Walkin1e448d32005-03-24 14:26:38 +0000308%type <a_value> RestrictedCharacterStringValue
Lev Walkinf15320b2004-06-03 03:38:44 +0000309%type <a_wsynt> optWithSyntax
310%type <a_wsynt> WithSyntax
Lev Walkin9d542d22006-03-14 16:31:37 +0000311%type <a_wsynt> WithSyntaxList
312%type <a_wchunk> WithSyntaxToken
Lev Walkinf15320b2004-06-03 03:38:44 +0000313%type <a_marker> optMarker Marker
314%type <a_int> optUnique
315%type <a_pres> optPresenceConstraint PresenceConstraint
316%type <tv_str> ComponentIdList
Lev Walkinef625402005-09-05 05:17:57 +0000317%type <a_int> NSTD_IndirectMarker
Lev Walkinf15320b2004-06-03 03:38:44 +0000318
319
320%%
321
322
323ParsedGrammar:
324 ModuleList {
325 *(void **)param = $1;
326 }
327 ;
328
329ModuleList:
330 ModuleSpecification {
331 $$ = asn1p_new();
332 checkmem($$);
333 TQ_ADD(&($$->modules), $1, mod_next);
334 }
335 | ModuleList ModuleSpecification {
336 $$ = $1;
337 TQ_ADD(&($$->modules), $2, mod_next);
338 }
339 ;
340
341/*
342 * ASN module definition.
343 * === EXAMPLE ===
344 * MySyntax DEFINITIONS AUTOMATIC TAGS ::=
345 * BEGIN
346 * ...
347 * END
348 * === EOF ===
349 */
350
351ModuleSpecification:
352 TypeRefName optObjectIdentifier TOK_DEFINITIONS
353 optModuleSpecificationFlags
354 TOK_PPEQ TOK_BEGIN
355 optModuleSpecificationBody
356 TOK_END {
357
358 if($7) {
359 $$ = $7;
360 } else {
361 /* There's a chance that a module is just plain empty */
362 $$ = asn1p_module_new();
363 }
364 checkmem($$);
365
Lev Walkin1ed22092005-08-12 10:06:17 +0000366 $$->ModuleName = $1;
Lev Walkinf15320b2004-06-03 03:38:44 +0000367 $$->module_oid = $2;
368 $$->module_flags = $4;
369 }
370 ;
371
372/*
373 * Object Identifier Definition
374 * { iso member-body(2) 3 }
375 */
376optObjectIdentifier:
377 { $$ = 0; }
378 | ObjectIdentifier { $$ = $1; }
379 ;
380
381ObjectIdentifier:
382 '{' ObjectIdentifierBody '}' {
383 $$ = $2;
384 }
385 | '{' '}' {
386 $$ = 0;
387 }
388 ;
389
390ObjectIdentifierBody:
391 ObjectIdentifierElement {
392 $$ = asn1p_oid_new();
393 asn1p_oid_add_arc($$, &$1);
394 if($1.name)
395 free($1.name);
396 }
397 | ObjectIdentifierBody ObjectIdentifierElement {
398 $$ = $1;
399 asn1p_oid_add_arc($$, &$2);
400 if($2.name)
401 free($2.name);
402 }
403 ;
404
405ObjectIdentifierElement:
406 Identifier { /* iso */
407 $$.name = $1;
408 $$.number = -1;
409 }
410 | Identifier '(' TOK_number ')' { /* iso(1) */
411 $$.name = $1;
412 $$.number = $3;
413 }
414 | TOK_number { /* 1 */
415 $$.name = 0;
416 $$.number = $1;
417 }
418 ;
419
420/*
421 * Optional module flags.
422 */
423optModuleSpecificationFlags:
424 { $$ = MSF_NOFLAGS; }
425 | ModuleSpecificationFlags {
426 $$ = $1;
427 }
428 ;
429
430/*
431 * Module flags.
432 */
433ModuleSpecificationFlags:
434 ModuleSpecificationFlag {
435 $$ = $1;
436 }
437 | ModuleSpecificationFlags ModuleSpecificationFlag {
438 $$ = $1 | $2;
439 }
440 ;
441
442/*
443 * Single module flag.
444 */
445ModuleSpecificationFlag:
446 TOK_EXPLICIT TOK_TAGS {
447 $$ = MSF_EXPLICIT_TAGS;
448 }
449 | TOK_IMPLICIT TOK_TAGS {
450 $$ = MSF_IMPLICIT_TAGS;
451 }
452 | TOK_AUTOMATIC TOK_TAGS {
453 $$ = MSF_AUTOMATIC_TAGS;
454 }
455 | TOK_EXTENSIBILITY TOK_IMPLIED {
456 $$ = MSF_EXTENSIBILITY_IMPLIED;
457 }
Lev Walkinf59d0752004-08-18 04:59:12 +0000458 /* EncodingReferenceDefault */
459 | TOK_capitalreference TOK_INSTRUCTIONS {
460 /* X.680Amd1 specifies TAG and XER */
461 if(strcmp($1, "TAG") == 0) {
462 $$ = MSF_TAG_INSTRUCTIONS;
463 } else if(strcmp($1, "XER") == 0) {
464 $$ = MSF_XER_INSTRUCTIONS;
465 } else {
466 fprintf(stderr,
467 "WARNING: %s INSTRUCTIONS at line %d: "
468 "Unrecognized encoding reference\n",
469 $1, yylineno);
470 $$ = MSF_unk_INSTRUCTIONS;
471 }
472 free($1);
473 }
Lev Walkinf15320b2004-06-03 03:38:44 +0000474 ;
475
476/*
477 * Optional module body.
478 */
479optModuleSpecificationBody:
480 { $$ = 0; }
481 | ModuleSpecificationBody {
Lev Walkinf15320b2004-06-03 03:38:44 +0000482 $$ = $1;
483 }
484 ;
485
486/*
487 * ASN.1 Module body.
488 */
489ModuleSpecificationBody:
490 ModuleSpecificationElement {
491 $$ = $1;
492 }
493 | ModuleSpecificationBody ModuleSpecificationElement {
494 $$ = $1;
495
Lev Walkinf59d0752004-08-18 04:59:12 +0000496 /* Behave well when one of them is skipped. */
497 if(!($1)) {
498 if($2) $$ = $2;
499 break;
500 }
501
Lev Walkinf15320b2004-06-03 03:38:44 +0000502#ifdef MY_IMPORT
503#error MY_IMPORT DEFINED ELSEWHERE!
504#endif
505#define MY_IMPORT(foo,field) do { \
Lev Walkinbc55d232004-08-13 12:31:09 +0000506 while(TQ_FIRST(&($2->foo))) { \
Lev Walkinf15320b2004-06-03 03:38:44 +0000507 TQ_ADD(&($$->foo), \
508 TQ_REMOVE(&($2->foo), field), \
509 field); \
Lev Walkinbc55d232004-08-13 12:31:09 +0000510 } \
511 assert(TQ_FIRST(&($2->foo)) == 0); \
512 } while(0)
Lev Walkinf15320b2004-06-03 03:38:44 +0000513
514 MY_IMPORT(imports, xp_next);
515 MY_IMPORT(exports, xp_next);
516 MY_IMPORT(members, next);
517#undef MY_IMPORT
518
519 }
520 ;
521
522/*
523 * One of the elements of ASN.1 module specification.
524 */
525ModuleSpecificationElement:
526 ImportsDefinition {
527 $$ = $1;
528 }
529 | ExportsDefinition {
530 $$ = asn1p_module_new();
531 checkmem($$);
532 if($1) {
533 TQ_ADD(&($$->exports), $1, xp_next);
534 } else {
535 /* "EXPORTS ALL;" ? */
536 }
537 }
538 | DataTypeReference {
539 $$ = asn1p_module_new();
540 checkmem($$);
541 assert($1->expr_type != A1TC_INVALID);
542 assert($1->meta_type != AMT_INVALID);
543 TQ_ADD(&($$->members), $1, next);
544 }
545 | ValueDefinition {
546 $$ = asn1p_module_new();
547 checkmem($$);
548 assert($1->expr_type != A1TC_INVALID);
549 assert($1->meta_type != AMT_INVALID);
550 TQ_ADD(&($$->members), $1, next);
551 }
552 /*
553 * Value set definition
554 * === EXAMPLE ===
555 * EvenNumbers INTEGER ::= { 2 | 4 | 6 | 8 }
556 * === EOF ===
557 */
558 | ValueSetDefinition {
559 $$ = asn1p_module_new();
560 checkmem($$);
561 assert($1->expr_type != A1TC_INVALID);
562 assert($1->meta_type != AMT_INVALID);
563 TQ_ADD(&($$->members), $1, next);
564 }
Lev Walkinf59d0752004-08-18 04:59:12 +0000565 | TOK_ENCODING_CONTROL TOK_capitalreference
566 { asn1p_lexer_hack_push_encoding_control(); }
567 {
568 fprintf(stderr,
569 "WARNING: ENCODING-CONTROL %s "
570 "specification at line %d ignored\n",
571 $2, yylineno);
572 free($2);
573 $$ = 0;
574 }
Lev Walkinf15320b2004-06-03 03:38:44 +0000575
576 /*
577 * Erroneous attemps
578 */
579 | BasicString {
580 return yyerror(
Lev Walkin70853052005-11-26 11:21:55 +0000581 "Attempt to redefine a standard basic string type, "
582 "please comment out or remove this type redefinition.");
Lev Walkinf15320b2004-06-03 03:38:44 +0000583 }
584 ;
585
586/*
587 * === EXAMPLE ===
588 * IMPORTS Type1, value FROM Module { iso standard(0) } ;
589 * === EOF ===
590 */
591ImportsDefinition:
592 TOK_IMPORTS ImportsBundleSet ';' {
Lev Walkin1ed22092005-08-12 10:06:17 +0000593 if(!saved_aid && 0)
594 return yyerror("Unterminated IMPORTS FROM, "
595 "expected semicolon ';'");
596 saved_aid = 0;
Lev Walkinf15320b2004-06-03 03:38:44 +0000597 $$ = $2;
598 }
599 /*
600 * Some error cases.
601 */
602 | TOK_IMPORTS TOK_FROM /* ... */ {
603 return yyerror("Empty IMPORTS list");
604 }
605 ;
606
607ImportsBundleSet:
608 ImportsBundle {
609 $$ = asn1p_module_new();
610 checkmem($$);
611 TQ_ADD(&($$->imports), $1, xp_next);
612 }
613 | ImportsBundleSet ImportsBundle {
614 $$ = $1;
615 TQ_ADD(&($$->imports), $2, xp_next);
616 }
617 ;
618
Lev Walkin1ed22092005-08-12 10:06:17 +0000619AssignedIdentifier:
620 { memset(&$$, 0, sizeof($$)); }
621 | ObjectIdentifier { $$.oid = $1; };
622 /* | DefinedValue { $$.value = $1; }; // Handled through saved_aid */
623
Lev Walkinf15320b2004-06-03 03:38:44 +0000624ImportsBundle:
Lev Walkin1ed22092005-08-12 10:06:17 +0000625 ImportsList TOK_FROM TypeRefName AssignedIdentifier {
Lev Walkinf15320b2004-06-03 03:38:44 +0000626 $$ = $1;
Lev Walkin1ed22092005-08-12 10:06:17 +0000627 $$->fromModuleName = $3;
628 $$->identifier = $4;
629 /* This stupid thing is used for look-back hack. */
630 saved_aid = $$->identifier.oid ? 0 : &($$->identifier);
Lev Walkinf15320b2004-06-03 03:38:44 +0000631 checkmem($$);
632 }
633 ;
634
635ImportsList:
636 ImportsElement {
637 $$ = asn1p_xports_new();
638 checkmem($$);
639 TQ_ADD(&($$->members), $1, next);
640 }
641 | ImportsList ',' ImportsElement {
642 $$ = $1;
643 TQ_ADD(&($$->members), $3, next);
644 }
645 ;
646
647ImportsElement:
648 TypeRefName {
649 $$ = asn1p_expr_new(yylineno);
650 checkmem($$);
651 $$->Identifier = $1;
652 $$->expr_type = A1TC_REFERENCE;
653 }
Lev Walkin144db9b2004-10-12 23:26:53 +0000654 | TypeRefName '{' '}' { /* Completely equivalent to above */
655 $$ = asn1p_expr_new(yylineno);
656 checkmem($$);
657 $$->Identifier = $1;
658 $$->expr_type = A1TC_REFERENCE;
659 }
Lev Walkinf15320b2004-06-03 03:38:44 +0000660 | Identifier {
661 $$ = asn1p_expr_new(yylineno);
662 checkmem($$);
663 $$->Identifier = $1;
664 $$->expr_type = A1TC_REFERENCE;
665 }
666 ;
667
668ExportsDefinition:
669 TOK_EXPORTS ExportsBody ';' {
670 $$ = $2;
671 }
672 | TOK_EXPORTS TOK_ALL ';' {
673 $$ = 0;
674 }
675 | TOK_EXPORTS ';' {
676 /* Empty EXPORTS clause effectively prohibits export. */
677 $$ = asn1p_xports_new();
678 checkmem($$);
679 }
680 ;
681
682ExportsBody:
683 ExportsElement {
684 $$ = asn1p_xports_new();
685 assert($$);
686 TQ_ADD(&($$->members), $1, next);
687 }
688 | ExportsBody ',' ExportsElement {
689 $$ = $1;
690 TQ_ADD(&($$->members), $3, next);
691 }
692 ;
693
694ExportsElement:
695 TypeRefName {
696 $$ = asn1p_expr_new(yylineno);
697 checkmem($$);
698 $$->Identifier = $1;
699 $$->expr_type = A1TC_EXPORTVAR;
700 }
Lev Walkin144db9b2004-10-12 23:26:53 +0000701 | TypeRefName '{' '}' {
702 $$ = asn1p_expr_new(yylineno);
703 checkmem($$);
704 $$->Identifier = $1;
705 $$->expr_type = A1TC_EXPORTVAR;
706 }
Lev Walkinf15320b2004-06-03 03:38:44 +0000707 | Identifier {
708 $$ = asn1p_expr_new(yylineno);
709 checkmem($$);
710 $$->Identifier = $1;
711 $$->expr_type = A1TC_EXPORTVAR;
712 }
713 ;
714
715
716ValueSetDefinition:
Lev Walkin8ea99482005-03-31 21:48:13 +0000717 TypeRefName DefinedTypeRef TOK_PPEQ
718 '{' { asn1p_lexer_hack_push_opaque_state(); } Opaque /* '}' */ {
Lev Walkinf15320b2004-06-03 03:38:44 +0000719 $$ = $2;
720 assert($$->Identifier == 0);
721 $$->Identifier = $1;
722 $$->meta_type = AMT_VALUESET;
Lev Walkin8ea99482005-03-31 21:48:13 +0000723 // take care of ValueSet body
Lev Walkinf15320b2004-06-03 03:38:44 +0000724 }
725 ;
726
727DefinedTypeRef:
728 ComplexTypeReference {
729 $$ = asn1p_expr_new(yylineno);
730 checkmem($$);
731 $$->reference = $1;
732 $$->expr_type = A1TC_REFERENCE;
733 $$->meta_type = AMT_TYPEREF;
734 }
735 | BasicTypeId {
736 $$ = asn1p_expr_new(yylineno);
737 checkmem($$);
738 $$->expr_type = $1;
739 $$->meta_type = AMT_TYPE;
740 }
741 ;
742
Lev Walkinf15320b2004-06-03 03:38:44 +0000743/*
744 * Data Type Reference.
745 * === EXAMPLE ===
746 * Type3 ::= CHOICE { a Type1, b Type 2 }
747 * === EOF ===
748 */
Lev Walkinf15320b2004-06-03 03:38:44 +0000749DataTypeReference:
750 /*
751 * Optionally tagged type definition.
752 */
Lev Walkin9c2285a2006-03-09 08:49:26 +0000753 TypeRefName TOK_PPEQ Type {
Lev Walkinaf120f72004-09-14 02:36:39 +0000754 $$ = $3;
Lev Walkinf15320b2004-06-03 03:38:44 +0000755 $$->Identifier = $1;
Lev Walkinf15320b2004-06-03 03:38:44 +0000756 assert($$->expr_type);
757 assert($$->meta_type);
758 }
Lev Walkin9c2285a2006-03-09 08:49:26 +0000759 | TypeRefName TOK_PPEQ ObjectClass {
Lev Walkinf15320b2004-06-03 03:38:44 +0000760 $$ = $3;
761 $$->Identifier = $1;
762 assert($$->expr_type == A1TC_CLASSDEF);
Lev Walkin9c2285a2006-03-09 08:49:26 +0000763 assert($$->meta_type == AMT_OBJECTCLASS);
Lev Walkinf15320b2004-06-03 03:38:44 +0000764 }
765 /*
766 * Parametrized <Type> declaration:
767 * === EXAMPLE ===
768 * SIGNED { ToBeSigned } ::= SEQUENCE {
769 * toBeSigned ToBeSigned,
770 * algorithm AlgorithmIdentifier,
771 * signature BIT STRING
772 * }
773 * === EOF ===
774 */
Lev Walkin070a52d2004-08-22 03:19:54 +0000775 | TypeRefName '{' ParameterArgumentList '}' TOK_PPEQ Type {
Lev Walkinf15320b2004-06-03 03:38:44 +0000776 $$ = $6;
777 assert($$->Identifier == 0);
778 $$->Identifier = $1;
779 $$->params = $3;
780 $$->meta_type = AMT_PARAMTYPE;
781 }
782 ;
783
784ParameterArgumentList:
785 ParameterArgumentName {
786 int ret;
787 $$ = asn1p_paramlist_new(yylineno);
788 checkmem($$);
789 ret = asn1p_paramlist_add_param($$, $1.governor, $1.argument);
790 checkmem(ret == 0);
791 if($1.governor) asn1p_ref_free($1.governor);
792 if($1.argument) free($1.argument);
793 }
794 | ParameterArgumentList ',' ParameterArgumentName {
795 int ret;
796 $$ = $1;
797 ret = asn1p_paramlist_add_param($$, $3.governor, $3.argument);
798 checkmem(ret == 0);
799 if($3.governor) asn1p_ref_free($3.governor);
800 if($3.argument) free($3.argument);
801 }
802 ;
803
804ParameterArgumentName:
805 TypeRefName {
806 $$.governor = NULL;
807 $$.argument = $1;
808 }
809 | TypeRefName ':' Identifier {
810 int ret;
811 $$.governor = asn1p_ref_new(yylineno);
812 ret = asn1p_ref_add_component($$.governor, $1, 0);
813 checkmem(ret == 0);
814 $$.argument = $3;
815 }
Lev Walkinc8092cb2005-02-18 16:34:21 +0000816 | TypeRefName ':' TypeRefName {
817 int ret;
818 $$.governor = asn1p_ref_new(yylineno);
819 ret = asn1p_ref_add_component($$.governor, $1, 0);
820 checkmem(ret == 0);
821 $$.argument = $3;
822 }
Lev Walkinf15320b2004-06-03 03:38:44 +0000823 | BasicTypeId ':' Identifier {
824 int ret;
825 $$.governor = asn1p_ref_new(yylineno);
826 ret = asn1p_ref_add_component($$.governor,
827 ASN_EXPR_TYPE2STR($1), 1);
828 checkmem(ret == 0);
829 $$.argument = $3;
830 }
831 ;
832
833ActualParameterList:
834 ActualParameter {
835 $$ = asn1p_expr_new(yylineno);
836 checkmem($$);
Lev Walkin1004aa92004-09-08 00:28:11 +0000837 asn1p_expr_add($$, $1);
Lev Walkinf15320b2004-06-03 03:38:44 +0000838 }
839 | ActualParameterList ',' ActualParameter {
840 $$ = $1;
Lev Walkin1004aa92004-09-08 00:28:11 +0000841 asn1p_expr_add($$, $3);
Lev Walkinf15320b2004-06-03 03:38:44 +0000842 }
843 ;
844
845ActualParameter:
Lev Walkin070a52d2004-08-22 03:19:54 +0000846 Type {
Lev Walkinf15320b2004-06-03 03:38:44 +0000847 $$ = $1;
848 }
849 | Identifier {
850 $$ = asn1p_expr_new(yylineno);
851 checkmem($$);
852 $$->Identifier = $1;
853 $$->expr_type = A1TC_REFERENCE;
854 $$->meta_type = AMT_VALUE;
855 }
856 ;
857
858/*
Lev Walkinc8092cb2005-02-18 16:34:21 +0000859 | '{' ActualParameter '}' {
860 $$ = asn1p_expr_new(yylineno);
861 checkmem($$);
862 asn1p_expr_add($$, $2);
863 $$->expr_type = A1TC_PARAMETRIZED;
864 $$->meta_type = AMT_TYPE;
865 }
866 ;
867*/
868
869/*
Lev Walkinf15320b2004-06-03 03:38:44 +0000870 * A collection of constructed data type members.
871 */
Lev Walkin144db9b2004-10-12 23:26:53 +0000872optComponentTypeLists:
873 { $$ = asn1p_expr_new(yylineno); }
874 | ComponentTypeLists { $$ = $1; };
875
Lev Walkin070a52d2004-08-22 03:19:54 +0000876ComponentTypeLists:
877 ComponentType {
Lev Walkinf15320b2004-06-03 03:38:44 +0000878 $$ = asn1p_expr_new(yylineno);
879 checkmem($$);
Lev Walkin1004aa92004-09-08 00:28:11 +0000880 asn1p_expr_add($$, $1);
Lev Walkinf15320b2004-06-03 03:38:44 +0000881 }
Lev Walkin070a52d2004-08-22 03:19:54 +0000882 | ComponentTypeLists ',' ComponentType {
Lev Walkinf15320b2004-06-03 03:38:44 +0000883 $$ = $1;
Lev Walkin1004aa92004-09-08 00:28:11 +0000884 asn1p_expr_add($$, $3);
Lev Walkinf15320b2004-06-03 03:38:44 +0000885 }
886 ;
887
Lev Walkin070a52d2004-08-22 03:19:54 +0000888ComponentType:
Lev Walkinaf120f72004-09-14 02:36:39 +0000889 Identifier Type optMarker {
Lev Walkin070a52d2004-08-22 03:19:54 +0000890 $$ = $2;
891 assert($$->Identifier == 0);
Lev Walkinaf120f72004-09-14 02:36:39 +0000892 $$->Identifier = $1;
Lev Walkinef625402005-09-05 05:17:57 +0000893 $3.flags |= $$->marker.flags;
Lev Walkin070a52d2004-08-22 03:19:54 +0000894 $$->marker = $3;
895 }
Lev Walkinef625402005-09-05 05:17:57 +0000896 | Type optMarker {
897 $$ = $1;
898 $2.flags |= $$->marker.flags;
899 $$->marker = $2;
900 _fixup_anonymous_identifier($$);
901 }
Lev Walkin070a52d2004-08-22 03:19:54 +0000902 | TOK_COMPONENTS TOK_OF Type {
903 $$ = asn1p_expr_new(yylineno);
904 checkmem($$);
905 $$->meta_type = $3->meta_type;
906 $$->expr_type = A1TC_COMPONENTS_OF;
Lev Walkin1004aa92004-09-08 00:28:11 +0000907 asn1p_expr_add($$, $3);
Lev Walkin070a52d2004-08-22 03:19:54 +0000908 }
909 | ExtensionAndException {
910 $$ = $1;
911 }
912 ;
913
914AlternativeTypeLists:
915 AlternativeType {
916 $$ = asn1p_expr_new(yylineno);
917 checkmem($$);
Lev Walkin1004aa92004-09-08 00:28:11 +0000918 asn1p_expr_add($$, $1);
Lev Walkin070a52d2004-08-22 03:19:54 +0000919 }
920 | AlternativeTypeLists ',' AlternativeType {
921 $$ = $1;
Lev Walkin1004aa92004-09-08 00:28:11 +0000922 asn1p_expr_add($$, $3);
Lev Walkin070a52d2004-08-22 03:19:54 +0000923 }
924 ;
925
926AlternativeType:
Lev Walkinaf120f72004-09-14 02:36:39 +0000927 Identifier Type {
Lev Walkin070a52d2004-08-22 03:19:54 +0000928 $$ = $2;
929 assert($$->Identifier == 0);
Lev Walkinaf120f72004-09-14 02:36:39 +0000930 $$->Identifier = $1;
Lev Walkin070a52d2004-08-22 03:19:54 +0000931 }
932 | ExtensionAndException {
933 $$ = $1;
934 }
Lev Walkin2e9bd5c2005-08-13 09:07:11 +0000935 | Type {
936 $$ = $1;
937 _fixup_anonymous_identifier($$);
938 }
Lev Walkin070a52d2004-08-22 03:19:54 +0000939 ;
940
Lev Walkin9c2285a2006-03-09 08:49:26 +0000941ObjectClass:
942 TOK_CLASS '{' FieldSpec '}' optWithSyntax {
Lev Walkinf15320b2004-06-03 03:38:44 +0000943 $$ = $3;
944 checkmem($$);
945 $$->with_syntax = $5;
946 assert($$->expr_type == A1TC_CLASSDEF);
Lev Walkin9c2285a2006-03-09 08:49:26 +0000947 assert($$->meta_type == AMT_OBJECTCLASS);
Lev Walkinf15320b2004-06-03 03:38:44 +0000948 }
949 ;
950
951optUnique:
952 { $$ = 0; }
953 | TOK_UNIQUE { $$ = 1; }
954 ;
955
Lev Walkin9c2285a2006-03-09 08:49:26 +0000956FieldSpec:
Lev Walkinf15320b2004-06-03 03:38:44 +0000957 ClassField {
958 $$ = asn1p_expr_new(yylineno);
959 checkmem($$);
960 $$->expr_type = A1TC_CLASSDEF;
Lev Walkin9c2285a2006-03-09 08:49:26 +0000961 $$->meta_type = AMT_OBJECTCLASS;
Lev Walkin1004aa92004-09-08 00:28:11 +0000962 asn1p_expr_add($$, $1);
Lev Walkinf15320b2004-06-03 03:38:44 +0000963 }
Lev Walkin9c2285a2006-03-09 08:49:26 +0000964 | FieldSpec ',' ClassField {
Lev Walkinf15320b2004-06-03 03:38:44 +0000965 $$ = $1;
Lev Walkin1004aa92004-09-08 00:28:11 +0000966 asn1p_expr_add($$, $3);
Lev Walkinf15320b2004-06-03 03:38:44 +0000967 }
968 ;
969
Lev Walkin9c2285a2006-03-09 08:49:26 +0000970 /* X.681 */
Lev Walkinf15320b2004-06-03 03:38:44 +0000971ClassField:
Lev Walkin9c2285a2006-03-09 08:49:26 +0000972
973 /* TypeFieldSpec ::= typefieldreference TypeOptionalitySpec? */
974 TOK_typefieldreference optMarker {
Lev Walkinf15320b2004-06-03 03:38:44 +0000975 $$ = asn1p_expr_new(yylineno);
976 checkmem($$);
Lev Walkin9c2285a2006-03-09 08:49:26 +0000977 $$->Identifier = $1;
Lev Walkinf15320b2004-06-03 03:38:44 +0000978 $$->meta_type = AMT_OBJECTFIELD;
Lev Walkin9c2285a2006-03-09 08:49:26 +0000979 $$->expr_type = A1TC_CLASSFIELD_TFS; /* TypeFieldSpec */
Lev Walkinf15320b2004-06-03 03:38:44 +0000980 $$->marker = $2;
981 }
Lev Walkin9c2285a2006-03-09 08:49:26 +0000982
983 /* FixedTypeValueFieldSpec ::= valuefieldreference Type UNIQUE ? ValueOptionalitySpec ? */
984 | TOK_valuefieldreference Type optUnique optMarker {
985 $$ = asn1p_expr_new(yylineno);
986 $$->Identifier = $1;
987 $$->meta_type = AMT_OBJECTFIELD;
988 $$->expr_type = A1TC_CLASSFIELD_FTVFS; /* FixedTypeValueFieldSpec */
Lev Walkinb7c45ca2004-11-24 17:43:29 +0000989 $$->unique = $3;
Lev Walkin9c2285a2006-03-09 08:49:26 +0000990 $$->marker = $4;
991 asn1p_expr_add($$, $2);
Lev Walkinf15320b2004-06-03 03:38:44 +0000992 }
Lev Walkin9c2285a2006-03-09 08:49:26 +0000993
994 /* VariableTypeValueFieldSpec ::= valuefieldreference FieldName ValueOptionalitySpec ? */
995 | TOK_valuefieldreference FieldName optMarker {
996 $$ = asn1p_expr_new(yylineno);
997 $$->Identifier = $1;
998 $$->meta_type = AMT_OBJECTFIELD;
999 $$->expr_type = A1TC_CLASSFIELD_VTVFS;
1000 $$->reference = $2;
1001 $$->marker = $3;
1002 }
1003
Lev Walkin9c2285a2006-03-09 08:49:26 +00001004 /* ObjectFieldSpec ::= objectfieldreference DefinedObjectClass ObjectOptionalitySpec ? */
1005 | TOK_valuefieldreference DefinedObjectClass optMarker {
Lev Walkinf15320b2004-06-03 03:38:44 +00001006 $$ = asn1p_expr_new(yylineno);
1007 checkmem($$);
Lev Walkin9c2285a2006-03-09 08:49:26 +00001008 $$->Identifier = $1;
1009 $$->reference = $2;
Lev Walkinf15320b2004-06-03 03:38:44 +00001010 $$->meta_type = AMT_OBJECTFIELD;
Lev Walkin9c2285a2006-03-09 08:49:26 +00001011 $$->expr_type = A1TC_CLASSFIELD_OFS;
1012 $$->marker = $3;
Lev Walkinf15320b2004-06-03 03:38:44 +00001013 }
Lev Walkin9c2285a2006-03-09 08:49:26 +00001014
Lev Walkin54868752006-03-09 09:08:49 +00001015 /* VariableTypeValueSetFieldSpec ::= valuesetfieldreference FieldName ValueOptionalitySpec ? */
1016 | TOK_typefieldreference FieldName optMarker {
Lev Walkin9c2285a2006-03-09 08:49:26 +00001017 $$ = asn1p_expr_new(yylineno);
Lev Walkin9c2285a2006-03-09 08:49:26 +00001018 $$->Identifier = $1;
Lev Walkin9c2285a2006-03-09 08:49:26 +00001019 $$->meta_type = AMT_OBJECTFIELD;
Lev Walkin54868752006-03-09 09:08:49 +00001020 $$->expr_type = A1TC_CLASSFIELD_VTVSFS;
1021 $$->reference = $2;
Lev Walkin9c2285a2006-03-09 08:49:26 +00001022 $$->marker = $3;
1023 }
1024
1025 /* FixedTypeValueSetFieldSpec ::= valuesetfieldreference Type ValueSetOptionalitySpec ? */
1026 | TOK_typefieldreference Type optMarker {
1027 $$ = asn1p_expr_new(yylineno);
1028 checkmem($$);
1029 $$->Identifier = $1;
1030 $$->meta_type = AMT_OBJECTFIELD;
1031 $$->expr_type = A1TC_CLASSFIELD_FTVSFS;
1032 asn1p_expr_add($$, $2);
1033 $$->marker = $3;
1034 }
1035
Lev Walkin54868752006-03-09 09:08:49 +00001036 /* ObjectSetFieldSpec ::= objectsetfieldreference DefinedObjectClass ObjectOptionalitySpec ? */
1037 | TOK_typefieldreference DefinedObjectClass optMarker {
1038 $$ = asn1p_expr_new(yylineno);
1039 checkmem($$);
1040 $$->Identifier = $1;
1041 $$->reference = $2;
1042 $$->meta_type = AMT_OBJECTFIELD;
1043 $$->expr_type = A1TC_CLASSFIELD_OSFS;
1044 $$->marker = $3;
1045 }
Lev Walkinf15320b2004-06-03 03:38:44 +00001046 ;
1047
1048optWithSyntax:
1049 { $$ = 0; }
1050 | WithSyntax {
1051 $$ = $1;
1052 }
1053 ;
1054
1055WithSyntax:
1056 TOK_WITH TOK_SYNTAX '{'
1057 { asn1p_lexer_hack_enable_with_syntax(); }
Lev Walkin9d542d22006-03-14 16:31:37 +00001058 WithSyntaxList
Lev Walkinf15320b2004-06-03 03:38:44 +00001059 '}' {
1060 $$ = $5;
1061 }
1062 ;
1063
Lev Walkin9d542d22006-03-14 16:31:37 +00001064WithSyntaxList:
1065 WithSyntaxToken {
Lev Walkinf15320b2004-06-03 03:38:44 +00001066 $$ = asn1p_wsyntx_new();
1067 TQ_ADD(&($$->chunks), $1, next);
1068 }
Lev Walkin9d542d22006-03-14 16:31:37 +00001069 | WithSyntaxList WithSyntaxToken {
Lev Walkinf15320b2004-06-03 03:38:44 +00001070 $$ = $1;
1071 TQ_ADD(&($$->chunks), $2, next);
1072 }
1073 ;
1074
Lev Walkin9d542d22006-03-14 16:31:37 +00001075WithSyntaxToken:
Lev Walkin57074f12006-03-16 05:11:14 +00001076 TOK_whitespace {
Lev Walkinf15320b2004-06-03 03:38:44 +00001077 $$ = asn1p_wsyntx_chunk_frombuf($1.buf, $1.len, 0);
Lev Walkin57074f12006-03-16 05:11:14 +00001078 $$->type = WC_WHITESPACE;
Lev Walkinf15320b2004-06-03 03:38:44 +00001079 }
Lev Walkin9d542d22006-03-14 16:31:37 +00001080 | TOK_Literal {
1081 $$ = asn1p_wsyntx_chunk_frombuf($1, strlen($1), 0);
1082 }
Lev Walkind370e9f2006-03-16 10:03:35 +00001083 | PrimitiveFieldReference {
1084 $$ = asn1p_wsyntx_chunk_frombuf($1.name, strlen($1.name), 0);
1085 $$->type = WC_FIELD;
Lev Walkinf15320b2004-06-03 03:38:44 +00001086 }
Lev Walkin9d542d22006-03-14 16:31:37 +00001087 | '[' WithSyntaxList ']' {
1088 $$ = asn1p_wsyntx_chunk_fromsyntax($2);
1089 }
Lev Walkinf15320b2004-06-03 03:38:44 +00001090 ;
1091
Lev Walkinf15320b2004-06-03 03:38:44 +00001092ExtensionAndException:
1093 TOK_ThreeDots {
Lev Walkinceb20e72004-09-05 10:40:41 +00001094 $$ = asn1p_expr_new(yylineno);
Lev Walkinf15320b2004-06-03 03:38:44 +00001095 checkmem($$);
1096 $$->Identifier = strdup("...");
1097 checkmem($$->Identifier);
1098 $$->expr_type = A1TC_EXTENSIBLE;
1099 $$->meta_type = AMT_TYPE;
1100 }
1101 | TOK_ThreeDots '!' DefinedValue {
Lev Walkinceb20e72004-09-05 10:40:41 +00001102 $$ = asn1p_expr_new(yylineno);
Lev Walkinf15320b2004-06-03 03:38:44 +00001103 checkmem($$);
1104 $$->Identifier = strdup("...");
1105 checkmem($$->Identifier);
1106 $$->value = $3;
1107 $$->expr_type = A1TC_EXTENSIBLE;
1108 $$->meta_type = AMT_TYPE;
1109 }
1110 | TOK_ThreeDots '!' SignedNumber {
Lev Walkinceb20e72004-09-05 10:40:41 +00001111 $$ = asn1p_expr_new(yylineno);
Lev Walkinf15320b2004-06-03 03:38:44 +00001112 checkmem($$);
1113 $$->Identifier = strdup("...");
1114 $$->value = $3;
1115 checkmem($$->Identifier);
1116 $$->expr_type = A1TC_EXTENSIBLE;
1117 $$->meta_type = AMT_TYPE;
1118 }
1119 ;
1120
Lev Walkin070a52d2004-08-22 03:19:54 +00001121Type:
Lev Walkinaf120f72004-09-14 02:36:39 +00001122 optTag TypeDeclaration optConstraints {
1123 $$ = $2;
1124 $$->tag = $1;
Lev Walkin070a52d2004-08-22 03:19:54 +00001125 /*
1126 * Outer constraint for SEQUENCE OF and SET OF applies
1127 * to the inner type.
1128 */
1129 if($$->expr_type == ASN_CONSTR_SEQUENCE_OF
1130 || $$->expr_type == ASN_CONSTR_SET_OF) {
1131 assert(!TQ_FIRST(&($$->members))->constraints);
Lev Walkinaf120f72004-09-14 02:36:39 +00001132 TQ_FIRST(&($$->members))->constraints = $3;
Lev Walkin070a52d2004-08-22 03:19:54 +00001133 } else {
1134 if($$->constraints) {
1135 assert(!$2);
1136 } else {
Lev Walkinaf120f72004-09-14 02:36:39 +00001137 $$->constraints = $3;
Lev Walkin070a52d2004-08-22 03:19:54 +00001138 }
1139 }
Lev Walkinef625402005-09-05 05:17:57 +00001140 }
1141 ;
1142
1143NSTD_IndirectMarker:
1144 {
1145 $$ = asn1p_as_pointer ? EM_INDIRECT : 0;
1146 asn1p_as_pointer = 0;
Lev Walkin070a52d2004-08-22 03:19:54 +00001147 }
1148 ;
1149
1150TypeDeclaration:
Lev Walkinef625402005-09-05 05:17:57 +00001151 NSTD_IndirectMarker TypeDeclarationSet {
Lev Walkin4696c742005-08-22 12:23:54 +00001152 $$ = $2;
Lev Walkinef625402005-09-05 05:17:57 +00001153 $$->marker.flags |= $1;
1154
1155 if(($$->marker.flags & EM_INDIRECT)
1156 && ($$->marker.flags & EM_OPTIONAL) != EM_OPTIONAL) {
1157 fprintf(stderr,
1158 "INFO: Directive <ASN1C:RepresentAsPointer> "
1159 "applied to %s at line %d\n",
1160 ASN_EXPR_TYPE2STR($$->expr_type)
1161 ? ASN_EXPR_TYPE2STR($$->expr_type)
1162 : "member",
1163 $$->_lineno
1164 );
1165 }
Lev Walkin4696c742005-08-22 12:23:54 +00001166 }
Lev Walkinef625402005-09-05 05:17:57 +00001167 ;
Lev Walkin4696c742005-08-22 12:23:54 +00001168
1169TypeDeclarationSet:
Lev Walkinf15320b2004-06-03 03:38:44 +00001170 BasicType {
1171 $$ = $1;
1172 }
Lev Walkinef625402005-09-05 05:17:57 +00001173 | TOK_CHOICE '{' AlternativeTypeLists '}' {
Lev Walkin070a52d2004-08-22 03:19:54 +00001174 $$ = $3;
1175 assert($$->expr_type == A1TC_INVALID);
1176 $$->expr_type = ASN_CONSTR_CHOICE;
1177 $$->meta_type = AMT_TYPE;
Lev Walkinf15320b2004-06-03 03:38:44 +00001178 }
Lev Walkinef625402005-09-05 05:17:57 +00001179 | TOK_SEQUENCE '{' optComponentTypeLists '}' {
Lev Walkin070a52d2004-08-22 03:19:54 +00001180 $$ = $3;
1181 assert($$->expr_type == A1TC_INVALID);
1182 $$->expr_type = ASN_CONSTR_SEQUENCE;
1183 $$->meta_type = AMT_TYPE;
1184 }
Lev Walkinef625402005-09-05 05:17:57 +00001185 | TOK_SET '{' optComponentTypeLists '}' {
Lev Walkin070a52d2004-08-22 03:19:54 +00001186 $$ = $3;
1187 assert($$->expr_type == A1TC_INVALID);
1188 $$->expr_type = ASN_CONSTR_SET;
1189 $$->meta_type = AMT_TYPE;
1190 }
Lev Walkin83cac2f2004-09-22 16:03:36 +00001191 | TOK_SEQUENCE optConstraints TOK_OF optIdentifier optTag TypeDeclaration {
Lev Walkinceb20e72004-09-05 10:40:41 +00001192 $$ = asn1p_expr_new(yylineno);
Lev Walkin070a52d2004-08-22 03:19:54 +00001193 checkmem($$);
1194 $$->constraints = $2;
1195 $$->expr_type = ASN_CONSTR_SEQUENCE_OF;
1196 $$->meta_type = AMT_TYPE;
Lev Walkin83cac2f2004-09-22 16:03:36 +00001197 $6->Identifier = $4;
1198 $6->tag = $5;
1199 asn1p_expr_add($$, $6);
Lev Walkin070a52d2004-08-22 03:19:54 +00001200 }
Lev Walkin83cac2f2004-09-22 16:03:36 +00001201 | TOK_SET optConstraints TOK_OF optIdentifier optTag TypeDeclaration {
Lev Walkinceb20e72004-09-05 10:40:41 +00001202 $$ = asn1p_expr_new(yylineno);
Lev Walkin070a52d2004-08-22 03:19:54 +00001203 checkmem($$);
1204 $$->constraints = $2;
1205 $$->expr_type = ASN_CONSTR_SET_OF;
1206 $$->meta_type = AMT_TYPE;
Lev Walkin83cac2f2004-09-22 16:03:36 +00001207 $6->Identifier = $4;
1208 $6->tag = $5;
1209 asn1p_expr_add($$, $6);
Lev Walkin070a52d2004-08-22 03:19:54 +00001210 }
1211 | TOK_ANY {
Lev Walkinceb20e72004-09-05 10:40:41 +00001212 $$ = asn1p_expr_new(yylineno);
Lev Walkin070a52d2004-08-22 03:19:54 +00001213 checkmem($$);
Lev Walkin609ccbb2004-09-04 04:49:21 +00001214 $$->expr_type = ASN_TYPE_ANY;
Lev Walkin070a52d2004-08-22 03:19:54 +00001215 $$->meta_type = AMT_TYPE;
1216 }
1217 | TOK_ANY TOK_DEFINED TOK_BY Identifier {
1218 int ret;
Lev Walkinceb20e72004-09-05 10:40:41 +00001219 $$ = asn1p_expr_new(yylineno);
Lev Walkin070a52d2004-08-22 03:19:54 +00001220 checkmem($$);
1221 $$->reference = asn1p_ref_new(yylineno);
1222 ret = asn1p_ref_add_component($$->reference,
1223 $4, RLT_lowercase);
1224 checkmem(ret == 0);
Lev Walkin609ccbb2004-09-04 04:49:21 +00001225 $$->expr_type = ASN_TYPE_ANY;
Lev Walkin070a52d2004-08-22 03:19:54 +00001226 $$->meta_type = AMT_TYPE;
1227 }
Lev Walkinf15320b2004-06-03 03:38:44 +00001228 /*
1229 * A parametrized assignment.
1230 */
1231 | TypeRefName '{' ActualParameterList '}' {
1232 int ret;
1233 $$ = $3;
1234 assert($$->expr_type == 0);
1235 assert($$->meta_type == 0);
1236 assert($$->reference == 0);
1237 $$->reference = asn1p_ref_new(yylineno);
1238 checkmem($$->reference);
1239 ret = asn1p_ref_add_component($$->reference, $1, RLT_UNKNOWN);
1240 checkmem(ret == 0);
1241 free($1);
1242 $$->expr_type = A1TC_PARAMETRIZED;
1243 $$->meta_type = AMT_TYPE;
1244 }
1245 /*
1246 * A DefinedType reference.
1247 * "CLASS1.&id.&id2"
1248 * or
1249 * "Module.Type"
1250 * or
1251 * "Module.identifier"
1252 * or
1253 * "Type"
1254 */
1255 | ComplexTypeReference {
1256 $$ = asn1p_expr_new(yylineno);
1257 checkmem($$);
1258 $$->reference = $1;
1259 $$->expr_type = A1TC_REFERENCE;
1260 $$->meta_type = AMT_TYPEREF;
1261 }
1262 | TOK_INSTANCE TOK_OF ComplexTypeReference {
1263 $$ = asn1p_expr_new(yylineno);
1264 checkmem($$);
1265 $$->reference = $3;
1266 $$->expr_type = A1TC_INSTANCE;
1267 $$->meta_type = AMT_TYPE;
1268 }
1269 ;
1270
1271/*
1272 * A type name consisting of several components.
1273 * === EXAMPLE ===
1274 * === EOF ===
1275 */
1276ComplexTypeReference:
1277 TOK_typereference {
1278 int ret;
1279 $$ = asn1p_ref_new(yylineno);
1280 checkmem($$);
1281 ret = asn1p_ref_add_component($$, $1, RLT_UNKNOWN);
1282 checkmem(ret == 0);
1283 free($1);
1284 }
1285 | TOK_typereference '.' TypeRefName {
1286 int ret;
1287 $$ = asn1p_ref_new(yylineno);
1288 checkmem($$);
1289 ret = asn1p_ref_add_component($$, $1, RLT_UNKNOWN);
1290 checkmem(ret == 0);
1291 ret = asn1p_ref_add_component($$, $3, RLT_UNKNOWN);
1292 checkmem(ret == 0);
1293 free($1);
1294 }
Lev Walkin9c974182004-09-15 11:59:51 +00001295 | ObjectClassReference '.' TypeRefName {
1296 int ret;
1297 $$ = asn1p_ref_new(yylineno);
1298 checkmem($$);
1299 ret = asn1p_ref_add_component($$, $1, RLT_UNKNOWN);
1300 checkmem(ret == 0);
1301 ret = asn1p_ref_add_component($$, $3, RLT_UNKNOWN);
1302 checkmem(ret == 0);
1303 free($1);
1304 }
Lev Walkinf15320b2004-06-03 03:38:44 +00001305 | TOK_typereference '.' Identifier {
1306 int ret;
1307 $$ = asn1p_ref_new(yylineno);
1308 checkmem($$);
1309 ret = asn1p_ref_add_component($$, $1, RLT_UNKNOWN);
1310 checkmem(ret == 0);
1311 ret = asn1p_ref_add_component($$, $3, RLT_lowercase);
1312 checkmem(ret == 0);
1313 free($1);
1314 }
1315 | ObjectClassReference {
1316 int ret;
1317 $$ = asn1p_ref_new(yylineno);
1318 checkmem($$);
1319 ret = asn1p_ref_add_component($$, $1, RLT_CAPITALS);
1320 free($1);
1321 checkmem(ret == 0);
1322 }
1323 | ObjectClassReference '.' ComplexTypeReferenceAmpList {
1324 int ret;
1325 $$ = $3;
1326 ret = asn1p_ref_add_component($$, $1, RLT_CAPITALS);
1327 free($1);
1328 checkmem(ret == 0);
1329 /*
1330 * Move the last element infront.
1331 */
1332 {
1333 struct asn1p_ref_component_s tmp_comp;
1334 tmp_comp = $$->components[$$->comp_count-1];
1335 memmove(&$$->components[1],
1336 &$$->components[0],
1337 sizeof($$->components[0])
1338 * ($$->comp_count - 1));
1339 $$->components[0] = tmp_comp;
1340 }
1341 }
1342 ;
1343
1344ComplexTypeReferenceAmpList:
1345 ComplexTypeReferenceElement {
1346 int ret;
1347 $$ = asn1p_ref_new(yylineno);
1348 checkmem($$);
1349 ret = asn1p_ref_add_component($$, $1.name, $1.lex_type);
1350 free($1.name);
1351 checkmem(ret == 0);
1352 }
1353 | ComplexTypeReferenceAmpList '.' ComplexTypeReferenceElement {
1354 int ret;
1355 $$ = $1;
1356 ret = asn1p_ref_add_component($$, $3.name, $3.lex_type);
1357 free($3.name);
1358 checkmem(ret == 0);
1359 }
1360 ;
1361
Lev Walkind370e9f2006-03-16 10:03:35 +00001362ComplexTypeReferenceElement: PrimitiveFieldReference;
Lev Walkinf15320b2004-06-03 03:38:44 +00001363
Lev Walkind370e9f2006-03-16 10:03:35 +00001364PrimitiveFieldReference:
Lev Walkinf15320b2004-06-03 03:38:44 +00001365 /* "&Type1" */
1366 TOK_typefieldreference {
1367 $$.lex_type = RLT_AmpUppercase;
1368 $$.name = $1;
1369 }
1370 /* "&id" */
1371 | TOK_valuefieldreference {
1372 $$.lex_type = RLT_Amplowercase;
1373 $$.name = $1;
1374 }
1375 ;
1376
1377
Lev Walkin9c2285a2006-03-09 08:49:26 +00001378FieldName:
1379 /* "&Type1" */
1380 TOK_typefieldreference {
1381 $$ = asn1p_ref_new(yylineno);
1382 asn1p_ref_add_component($$, $1, RLT_AmpUppercase);
1383 }
1384 | FieldName '.' TOK_typefieldreference {
1385 $$ = $$;
1386 asn1p_ref_add_component($$, $3, RLT_AmpUppercase);
1387 }
1388 | FieldName '.' TOK_valuefieldreference {
1389 $$ = $$;
1390 asn1p_ref_add_component($$, $3, RLT_Amplowercase);
1391 }
1392 ;
1393
1394DefinedObjectClass:
1395 TOK_capitalreference {
1396 $$ = asn1p_ref_new(yylineno);
1397 asn1p_ref_add_component($$, $1, RLT_CAPITALS);
1398 }
Lev Walkin54868752006-03-09 09:08:49 +00001399/*
Lev Walkin9c2285a2006-03-09 08:49:26 +00001400 | TypeRefName '.' TOK_capitalreference {
1401 $$ = asn1p_ref_new(yylineno);
1402 asn1p_ref_add_component($$, $1, RLT_AmpUppercase);
1403 asn1p_ref_add_component($$, $3, RLT_CAPITALS);
1404 }
Lev Walkin54868752006-03-09 09:08:49 +00001405*/
Lev Walkin9c2285a2006-03-09 08:49:26 +00001406 ;
1407
1408
Lev Walkinf15320b2004-06-03 03:38:44 +00001409/*
1410 * === EXAMPLE ===
1411 * value INTEGER ::= 1
1412 * === EOF ===
1413 */
1414ValueDefinition:
Lev Walkin9c974182004-09-15 11:59:51 +00001415 Identifier DefinedTypeRef TOK_PPEQ Value {
Lev Walkinf15320b2004-06-03 03:38:44 +00001416 $$ = $2;
1417 assert($$->Identifier == NULL);
1418 $$->Identifier = $1;
1419 $$->meta_type = AMT_VALUE;
1420 $$->value = $4;
1421 }
1422 ;
1423
Lev Walkin9c974182004-09-15 11:59:51 +00001424Value:
1425 Identifier ':' Value {
1426 $$ = asn1p_value_fromint(0);
1427 checkmem($$);
1428 $$->type = ATV_CHOICE_IDENTIFIER;
1429 $$->value.choice_identifier.identifier = $1;
1430 $$->value.choice_identifier.value = $3;
1431 }
Lev Walkincbad2512005-03-24 16:27:02 +00001432 | '{' { asn1p_lexer_hack_push_opaque_state(); } Opaque /* '}' */ {
Lev Walkinf15320b2004-06-03 03:38:44 +00001433 $$ = asn1p_value_frombuf($3.buf, $3.len, 0);
1434 checkmem($$);
1435 $$->type = ATV_UNPARSED;
1436 }
Lev Walkin9c974182004-09-15 11:59:51 +00001437 | TOK_NULL {
1438 $$ = asn1p_value_fromint(0);
1439 checkmem($$);
1440 $$->type = ATV_NULL;
1441 }
1442 | TOK_FALSE {
1443 $$ = asn1p_value_fromint(0);
1444 checkmem($$);
1445 $$->type = ATV_FALSE;
1446 }
1447 | TOK_TRUE {
1448 $$ = asn1p_value_fromint(0);
1449 checkmem($$);
1450 $$->type = ATV_TRUE;
1451 }
Lev Walkinf15320b2004-06-03 03:38:44 +00001452 | TOK_bstring {
1453 $$ = _convert_bitstring2binary($1, 'B');
1454 checkmem($$);
1455 }
1456 | TOK_hstring {
1457 $$ = _convert_bitstring2binary($1, 'H');
1458 checkmem($$);
1459 }
Lev Walkin1e448d32005-03-24 14:26:38 +00001460 | RestrictedCharacterStringValue {
1461 $$ = $$;
Lev Walkinf15320b2004-06-03 03:38:44 +00001462 }
1463 | SignedNumber {
1464 $$ = $1;
1465 }
1466 | DefinedValue {
1467 $$ = $1;
1468 }
1469 ;
1470
1471DefinedValue:
1472 Identifier {
1473 asn1p_ref_t *ref;
1474 int ret;
1475 ref = asn1p_ref_new(yylineno);
1476 checkmem(ref);
1477 ret = asn1p_ref_add_component(ref, $1, RLT_lowercase);
1478 checkmem(ret == 0);
1479 $$ = asn1p_value_fromref(ref, 0);
1480 checkmem($$);
1481 free($1);
1482 }
1483 | TypeRefName '.' Identifier {
1484 asn1p_ref_t *ref;
1485 int ret;
1486 ref = asn1p_ref_new(yylineno);
1487 checkmem(ref);
1488 ret = asn1p_ref_add_component(ref, $1, RLT_UNKNOWN);
1489 checkmem(ret == 0);
1490 ret = asn1p_ref_add_component(ref, $3, RLT_lowercase);
1491 checkmem(ret == 0);
1492 $$ = asn1p_value_fromref(ref, 0);
1493 checkmem($$);
1494 free($1);
1495 free($3);
1496 }
1497 ;
1498
Lev Walkin1e448d32005-03-24 14:26:38 +00001499
1500RestrictedCharacterStringValue:
1501 TOK_cstring {
1502 $$ = asn1p_value_frombuf($1.buf, $1.len, 0);
1503 checkmem($$);
1504 }
Lev Walkind9574ae2005-03-24 16:22:35 +00001505 | TOK_tuple {
1506 $$ = asn1p_value_fromint($1);
1507 checkmem($$);
1508 $$->type = ATV_TUPLE;
1509 }
1510 | TOK_quadruple {
1511 $$ = asn1p_value_fromint($1);
1512 checkmem($$);
1513 $$->type = ATV_QUADRUPLE;
1514 }
1515 /*
Lev Walkin1e448d32005-03-24 14:26:38 +00001516 | '{' TOK_number ',' TOK_number '}' {
1517 asn1c_integer_t v = ($2 << 4) + $4;
1518 if($2 > 7) return yyerror("X.680:2003, #37.14 "
1519 "mandates 0..7 range for Tuple's TableColumn");
1520 if($4 > 15) return yyerror("X.680:2003, #37.14 "
1521 "mandates 0..15 range for Tuple's TableRow");
1522 $$ = asn1p_value_fromint(v);
1523 checkmem($$);
1524 $$->type = ATV_TUPLE;
1525 }
1526 | '{' TOK_number ',' TOK_number ',' TOK_number ',' TOK_number '}' {
1527 asn1c_integer_t v = ($2 << 24) | ($4 << 16) | ($6 << 8) | $8;
1528 if($2 > 127) return yyerror("X.680:2003, #37.12 "
1529 "mandates 0..127 range for Quadruple's Group");
1530 if($4 > 255) return yyerror("X.680:2003, #37.12 "
1531 "mandates 0..255 range for Quadruple's Plane");
1532 if($6 > 255) return yyerror("X.680:2003, #37.12 "
1533 "mandates 0..255 range for Quadruple's Row");
1534 if($8 > 255) return yyerror("X.680:2003, #37.12 "
1535 "mandates 0..255 range for Quadruple's Cell");
1536 $$ = asn1p_value_fromint(v);
1537 checkmem($$);
1538 $$->type = ATV_QUADRUPLE;
1539 }
Lev Walkind9574ae2005-03-24 16:22:35 +00001540 */
Lev Walkin1e448d32005-03-24 14:26:38 +00001541 ;
1542
Lev Walkinf15320b2004-06-03 03:38:44 +00001543Opaque:
1544 TOK_opaque {
Lev Walkin1893ddf2005-03-20 14:28:32 +00001545 $$.len = $1.len + 1;
Lev Walkinf15320b2004-06-03 03:38:44 +00001546 $$.buf = malloc($$.len + 1);
1547 checkmem($$.buf);
1548 $$.buf[0] = '{';
Lev Walkin1893ddf2005-03-20 14:28:32 +00001549 memcpy($$.buf + 1, $1.buf, $1.len);
Lev Walkinf15320b2004-06-03 03:38:44 +00001550 $$.buf[$$.len] = '\0';
1551 free($1.buf);
1552 }
1553 | Opaque TOK_opaque {
1554 int newsize = $1.len + $2.len;
1555 char *p = malloc(newsize + 1);
1556 checkmem(p);
1557 memcpy(p , $1.buf, $1.len);
1558 memcpy(p + $1.len, $2.buf, $2.len);
1559 p[newsize] = '\0';
1560 free($1.buf);
1561 free($2.buf);
1562 $$.buf = p;
1563 $$.len = newsize;
1564 }
1565 ;
1566
1567BasicTypeId:
1568 TOK_BOOLEAN { $$ = ASN_BASIC_BOOLEAN; }
1569 | TOK_NULL { $$ = ASN_BASIC_NULL; }
1570 | TOK_REAL { $$ = ASN_BASIC_REAL; }
1571 | BasicTypeId_UniverationCompatible { $$ = $1; }
1572 | TOK_OCTET TOK_STRING { $$ = ASN_BASIC_OCTET_STRING; }
1573 | TOK_OBJECT TOK_IDENTIFIER { $$ = ASN_BASIC_OBJECT_IDENTIFIER; }
1574 | TOK_RELATIVE_OID { $$ = ASN_BASIC_RELATIVE_OID; }
1575 | TOK_EXTERNAL { $$ = ASN_BASIC_EXTERNAL; }
1576 | TOK_EMBEDDED TOK_PDV { $$ = ASN_BASIC_EMBEDDED_PDV; }
1577 | TOK_CHARACTER TOK_STRING { $$ = ASN_BASIC_CHARACTER_STRING; }
1578 | TOK_UTCTime { $$ = ASN_BASIC_UTCTime; }
1579 | TOK_GeneralizedTime { $$ = ASN_BASIC_GeneralizedTime; }
Lev Walkinc7d939d2005-03-20 11:12:40 +00001580 | BasicString { $$ = $1; }
Lev Walkinf15320b2004-06-03 03:38:44 +00001581 ;
1582
1583/*
1584 * A type identifier which may be used with "{ a(1), b(2) }" clause.
1585 */
1586BasicTypeId_UniverationCompatible:
1587 TOK_INTEGER { $$ = ASN_BASIC_INTEGER; }
1588 | TOK_ENUMERATED { $$ = ASN_BASIC_ENUMERATED; }
1589 | TOK_BIT TOK_STRING { $$ = ASN_BASIC_BIT_STRING; }
1590 ;
1591
1592BasicType:
1593 BasicTypeId {
Lev Walkinceb20e72004-09-05 10:40:41 +00001594 $$ = asn1p_expr_new(yylineno);
Lev Walkinf15320b2004-06-03 03:38:44 +00001595 checkmem($$);
1596 $$->expr_type = $1;
1597 $$->meta_type = AMT_TYPE;
1598 }
1599 | BasicTypeId_UniverationCompatible UniverationDefinition {
1600 if($2) {
1601 $$ = $2;
1602 } else {
Lev Walkinceb20e72004-09-05 10:40:41 +00001603 $$ = asn1p_expr_new(yylineno);
Lev Walkinf15320b2004-06-03 03:38:44 +00001604 checkmem($$);
1605 }
1606 $$->expr_type = $1;
1607 $$->meta_type = AMT_TYPE;
1608 }
1609 ;
1610
1611BasicString:
1612 TOK_BMPString { $$ = ASN_STRING_BMPString; }
1613 | TOK_GeneralString {
1614 $$ = ASN_STRING_GeneralString;
Lev Walkin9c974182004-09-15 11:59:51 +00001615 fprintf(stderr, "WARNING: GeneralString is not fully supported\n");
Lev Walkinf15320b2004-06-03 03:38:44 +00001616 }
1617 | TOK_GraphicString {
1618 $$ = ASN_STRING_GraphicString;
Lev Walkin9c974182004-09-15 11:59:51 +00001619 fprintf(stderr, "WARNING: GraphicString is not fully supported\n");
Lev Walkinf15320b2004-06-03 03:38:44 +00001620 }
1621 | TOK_IA5String { $$ = ASN_STRING_IA5String; }
1622 | TOK_ISO646String { $$ = ASN_STRING_ISO646String; }
1623 | TOK_NumericString { $$ = ASN_STRING_NumericString; }
1624 | TOK_PrintableString { $$ = ASN_STRING_PrintableString; }
1625 | TOK_T61String {
1626 $$ = ASN_STRING_T61String;
Lev Walkin9c974182004-09-15 11:59:51 +00001627 fprintf(stderr, "WARNING: T61String is not fully supported\n");
Lev Walkinf15320b2004-06-03 03:38:44 +00001628 }
1629 | TOK_TeletexString { $$ = ASN_STRING_TeletexString; }
1630 | TOK_UniversalString { $$ = ASN_STRING_UniversalString; }
1631 | TOK_UTF8String { $$ = ASN_STRING_UTF8String; }
1632 | TOK_VideotexString {
1633 $$ = ASN_STRING_VideotexString;
Lev Walkin9c974182004-09-15 11:59:51 +00001634 fprintf(stderr, "WARNING: VideotexString is not fully supported\n");
Lev Walkinf15320b2004-06-03 03:38:44 +00001635 }
1636 | TOK_VisibleString { $$ = ASN_STRING_VisibleString; }
1637 | TOK_ObjectDescriptor { $$ = ASN_STRING_ObjectDescriptor; }
1638 ;
1639
Lev Walkind2ea1de2004-08-20 13:25:29 +00001640
Lev Walkinf15320b2004-06-03 03:38:44 +00001641/*
1642 * Data type constraints.
1643 */
Lev Walkinf15320b2004-06-03 03:38:44 +00001644Union: '|' | TOK_UNION;
1645Intersection: '^' | TOK_INTERSECTION;
1646Except: TOK_EXCEPT;
1647
Lev Walkinf59d0752004-08-18 04:59:12 +00001648optConstraints:
1649 { $$ = 0; }
Lev Walkind2ea1de2004-08-20 13:25:29 +00001650 | Constraints {
1651 $$ = $1;
1652 }
1653 ;
1654
1655Constraints:
1656 SetOfConstraints {
Lev Walkin2c14a692005-08-12 10:08:45 +00001657 CONSTRAINT_INSERT($$, ACT_CA_SET, $1, 0);
Lev Walkinf59d0752004-08-18 04:59:12 +00001658 }
1659 | TOK_SIZE '(' ElementSetSpecs ')' {
Lev Walkinf15320b2004-06-03 03:38:44 +00001660 /*
1661 * This is a special case, for compatibility purposes.
Lev Walkinf59d0752004-08-18 04:59:12 +00001662 * It goes without parentheses.
Lev Walkinf15320b2004-06-03 03:38:44 +00001663 */
Lev Walkin2c14a692005-08-12 10:08:45 +00001664 CONSTRAINT_INSERT($$, ACT_CT_SIZE, $3, 0);
Lev Walkinf15320b2004-06-03 03:38:44 +00001665 }
Lev Walkinf15320b2004-06-03 03:38:44 +00001666 ;
1667
Lev Walkinf59d0752004-08-18 04:59:12 +00001668SetOfConstraints:
1669 '(' ElementSetSpecs ')' {
Lev Walkinf15320b2004-06-03 03:38:44 +00001670 $$ = $2;
1671 }
Lev Walkinf59d0752004-08-18 04:59:12 +00001672 | SetOfConstraints '(' ElementSetSpecs ')' {
Lev Walkin2c14a692005-08-12 10:08:45 +00001673 CONSTRAINT_INSERT($$, ACT_CA_SET, $1, $3);
Lev Walkinf59d0752004-08-18 04:59:12 +00001674 }
Lev Walkinf15320b2004-06-03 03:38:44 +00001675 ;
1676
Lev Walkinf59d0752004-08-18 04:59:12 +00001677ElementSetSpecs:
1678 ElementSetSpec {
Lev Walkinf15320b2004-06-03 03:38:44 +00001679 $$ = $1;
1680 }
Lev Walkinf59d0752004-08-18 04:59:12 +00001681 | ElementSetSpec ',' TOK_ThreeDots {
Lev Walkinf15320b2004-06-03 03:38:44 +00001682 asn1p_constraint_t *ct;
1683 ct = asn1p_constraint_new(yylineno);
Lev Walkinf15320b2004-06-03 03:38:44 +00001684 ct->type = ACT_EL_EXT;
Lev Walkin2c14a692005-08-12 10:08:45 +00001685 CONSTRAINT_INSERT($$, ACT_CA_CSV, $1, ct);
Lev Walkinf15320b2004-06-03 03:38:44 +00001686 }
Lev Walkinf59d0752004-08-18 04:59:12 +00001687 | ElementSetSpec ',' TOK_ThreeDots ',' ElementSetSpec {
Lev Walkinf15320b2004-06-03 03:38:44 +00001688 asn1p_constraint_t *ct;
1689 ct = asn1p_constraint_new(yylineno);
Lev Walkinf15320b2004-06-03 03:38:44 +00001690 ct->type = ACT_EL_EXT;
Lev Walkin2c14a692005-08-12 10:08:45 +00001691 CONSTRAINT_INSERT($$, ACT_CA_CSV, $1, ct);
Lev Walkinb4fcdd22004-08-13 12:35:09 +00001692 ct = $$;
Lev Walkin2c14a692005-08-12 10:08:45 +00001693 CONSTRAINT_INSERT($$, ACT_CA_CSV, ct, $5);
Lev Walkinf15320b2004-06-03 03:38:44 +00001694 }
Lev Walkinf15320b2004-06-03 03:38:44 +00001695 ;
1696
Lev Walkinf59d0752004-08-18 04:59:12 +00001697ElementSetSpec:
1698 ConstraintSubtypeElement {
1699 $$ = $1;
1700 }
Lev Walkin1e448d32005-03-24 14:26:38 +00001701 | TOK_ALL TOK_EXCEPT ConstraintSubtypeElement {
Lev Walkin2c14a692005-08-12 10:08:45 +00001702 CONSTRAINT_INSERT($$, ACT_CA_AEX, $3, 0);
Lev Walkin1e448d32005-03-24 14:26:38 +00001703 }
Lev Walkinf59d0752004-08-18 04:59:12 +00001704 | ElementSetSpec Union ConstraintSubtypeElement {
Lev Walkin2c14a692005-08-12 10:08:45 +00001705 CONSTRAINT_INSERT($$, ACT_CA_UNI, $1, $3);
Lev Walkinf15320b2004-06-03 03:38:44 +00001706 }
Lev Walkinf59d0752004-08-18 04:59:12 +00001707 | ElementSetSpec Intersection ConstraintSubtypeElement {
Lev Walkin2c14a692005-08-12 10:08:45 +00001708 CONSTRAINT_INSERT($$, ACT_CA_INT, $1, $3);
Lev Walkinf15320b2004-06-03 03:38:44 +00001709 }
Lev Walkinf59d0752004-08-18 04:59:12 +00001710 | ConstraintSubtypeElement Except ConstraintSubtypeElement {
Lev Walkin2c14a692005-08-12 10:08:45 +00001711 CONSTRAINT_INSERT($$, ACT_CA_EXC, $1, $3);
Lev Walkinf15320b2004-06-03 03:38:44 +00001712 }
1713 ;
1714
1715ConstraintSubtypeElement:
Lev Walkinf59d0752004-08-18 04:59:12 +00001716 ConstraintSpec '(' ElementSetSpecs ')' {
1717 int ret;
1718 $$ = asn1p_constraint_new(yylineno);
1719 checkmem($$);
1720 $$->type = $1;
1721 ret = asn1p_constraint_insert($$, $3);
1722 checkmem(ret == 0);
1723 }
1724 | '(' ElementSetSpecs ')' {
1725 int ret;
1726 $$ = asn1p_constraint_new(yylineno);
1727 checkmem($$);
1728 $$->type = ACT_CA_SET;
1729 ret = asn1p_constraint_insert($$, $2);
1730 checkmem(ret == 0);
1731 }
Lev Walkinff7dd142005-03-20 12:58:00 +00001732 | SingleValue {
Lev Walkinf15320b2004-06-03 03:38:44 +00001733 $$ = asn1p_constraint_new(yylineno);
1734 checkmem($$);
1735 $$->type = ACT_EL_VALUE;
1736 $$->value = $1;
1737 }
Lev Walkinff7dd142005-03-20 12:58:00 +00001738 | ContainedSubtype {
1739 $$ = asn1p_constraint_new(yylineno);
1740 checkmem($$);
1741 $$->type = ACT_EL_TYPE;
1742 $$->containedSubtype = $1;
1743 }
1744 | SingleValue ConstraintRangeSpec SingleValue {
Lev Walkinf15320b2004-06-03 03:38:44 +00001745 $$ = asn1p_constraint_new(yylineno);
1746 checkmem($$);
1747 $$->type = $2;
1748 $$->range_start = $1;
1749 $$->range_stop = $3;
1750 }
Lev Walkinff7dd142005-03-20 12:58:00 +00001751 | TOK_MIN ConstraintRangeSpec SingleValue {
Lev Walkinf15320b2004-06-03 03:38:44 +00001752 $$ = asn1p_constraint_new(yylineno);
1753 checkmem($$);
Lev Walkinf59d0752004-08-18 04:59:12 +00001754 $$->type = $2;
1755 $$->range_start = asn1p_value_fromint(-123);
1756 $$->range_stop = $3;
1757 $$->range_start->type = ATV_MIN;
1758 }
Lev Walkinff7dd142005-03-20 12:58:00 +00001759 | SingleValue ConstraintRangeSpec TOK_MAX {
Lev Walkinf59d0752004-08-18 04:59:12 +00001760 $$ = asn1p_constraint_new(yylineno);
1761 checkmem($$);
1762 $$->type = $2;
1763 $$->range_start = $1;
1764 $$->range_stop = asn1p_value_fromint(321);
1765 $$->range_stop->type = ATV_MAX;
1766 }
1767 | TOK_MIN ConstraintRangeSpec TOK_MAX {
1768 $$ = asn1p_constraint_new(yylineno);
1769 checkmem($$);
1770 $$->type = $2;
1771 $$->range_start = asn1p_value_fromint(-123);
1772 $$->range_stop = asn1p_value_fromint(321);
1773 $$->range_start->type = ATV_MIN;
1774 $$->range_stop->type = ATV_MAX;
Lev Walkinf15320b2004-06-03 03:38:44 +00001775 }
1776 | TableConstraint {
1777 $$ = $1;
1778 }
Lev Walkine596bf02005-03-28 15:01:27 +00001779 | InnerTypeConstraint {
Lev Walkinf15320b2004-06-03 03:38:44 +00001780 $$ = $1;
1781 }
Lev Walkin1893ddf2005-03-20 14:28:32 +00001782 | TOK_CONSTRAINED TOK_BY '{'
1783 { asn1p_lexer_hack_push_opaque_state(); } Opaque /* '}' */ {
1784 $$ = asn1p_constraint_new(yylineno);
1785 checkmem($$);
1786 $$->type = ACT_CT_CTDBY;
1787 $$->value = asn1p_value_frombuf($5.buf, $5.len, 0);
1788 checkmem($$->value);
1789 $$->value->type = ATV_UNPARSED;
1790 }
Lev Walkinf15320b2004-06-03 03:38:44 +00001791 ;
1792
1793ConstraintRangeSpec:
1794 TOK_TwoDots { $$ = ACT_EL_RANGE; }
1795 | TOK_TwoDots '<' { $$ = ACT_EL_RLRANGE; }
1796 | '<' TOK_TwoDots { $$ = ACT_EL_LLRANGE; }
1797 | '<' TOK_TwoDots '<' { $$ = ACT_EL_ULRANGE; }
1798 ;
1799
1800ConstraintSpec:
1801 TOK_SIZE {
1802 $$ = ACT_CT_SIZE;
1803 }
1804 | TOK_FROM {
1805 $$ = ACT_CT_FROM;
1806 }
1807 ;
1808
Lev Walkinff7dd142005-03-20 12:58:00 +00001809SingleValue:
Lev Walkinc8092cb2005-02-18 16:34:21 +00001810 TOK_FALSE {
1811 $$ = asn1p_value_fromint(0);
1812 checkmem($$);
1813 $$->type = ATV_FALSE;
1814 }
1815 | TOK_TRUE {
1816 $$ = asn1p_value_fromint(1);
1817 checkmem($$);
1818 $$->type = ATV_TRUE;
1819 }
1820 | SignedNumber {
Lev Walkinf15320b2004-06-03 03:38:44 +00001821 $$ = $1;
1822 }
Lev Walkin1e448d32005-03-24 14:26:38 +00001823 | RestrictedCharacterStringValue {
1824 $$ = $1;
Lev Walkinc8092cb2005-02-18 16:34:21 +00001825 }
Lev Walkinf15320b2004-06-03 03:38:44 +00001826 | Identifier {
1827 asn1p_ref_t *ref;
1828 int ret;
1829 ref = asn1p_ref_new(yylineno);
1830 checkmem(ref);
1831 ret = asn1p_ref_add_component(ref, $1, RLT_lowercase);
1832 checkmem(ret == 0);
1833 $$ = asn1p_value_fromref(ref, 0);
1834 checkmem($$);
1835 free($1);
1836 }
Lev Walkinff7dd142005-03-20 12:58:00 +00001837 ;
1838
1839ContainedSubtype:
1840 TypeRefName {
Lev Walkinc8092cb2005-02-18 16:34:21 +00001841 asn1p_ref_t *ref;
1842 int ret;
1843 ref = asn1p_ref_new(yylineno);
1844 checkmem(ref);
1845 ret = asn1p_ref_add_component(ref, $1, RLT_UNKNOWN);
1846 checkmem(ret == 0);
1847 $$ = asn1p_value_fromref(ref, 0);
Lev Walkinf15320b2004-06-03 03:38:44 +00001848 checkmem($$);
Lev Walkinc8092cb2005-02-18 16:34:21 +00001849 free($1);
Lev Walkinf15320b2004-06-03 03:38:44 +00001850 }
1851 ;
1852
Lev Walkine596bf02005-03-28 15:01:27 +00001853InnerTypeConstraint:
1854 TOK_WITH TOK_COMPONENT SetOfConstraints {
Lev Walkin2c14a692005-08-12 10:08:45 +00001855 CONSTRAINT_INSERT($$, ACT_CT_WCOMP, $3, 0);
Lev Walkine596bf02005-03-28 15:01:27 +00001856 }
1857 | TOK_WITH TOK_COMPONENTS '{' WithComponentsList '}' {
Lev Walkin2c14a692005-08-12 10:08:45 +00001858 CONSTRAINT_INSERT($$, ACT_CT_WCOMPS, $4, 0);
Lev Walkinf15320b2004-06-03 03:38:44 +00001859 }
1860 ;
1861
1862WithComponentsList:
1863 WithComponentsElement {
1864 $$ = $1;
1865 }
1866 | WithComponentsList ',' WithComponentsElement {
Lev Walkin2c14a692005-08-12 10:08:45 +00001867 CONSTRAINT_INSERT($$, ACT_CT_WCOMPS, $1, $3);
Lev Walkinf15320b2004-06-03 03:38:44 +00001868 }
1869 ;
1870
1871WithComponentsElement:
1872 TOK_ThreeDots {
1873 $$ = asn1p_constraint_new(yylineno);
1874 checkmem($$);
1875 $$->type = ACT_EL_EXT;
Lev Walkine596bf02005-03-28 15:01:27 +00001876 $$->value = asn1p_value_frombuf("...", 3, 0);
Lev Walkinf15320b2004-06-03 03:38:44 +00001877 }
1878 | Identifier optConstraints optPresenceConstraint {
1879 $$ = asn1p_constraint_new(yylineno);
1880 checkmem($$);
1881 $$->type = ACT_EL_VALUE;
1882 $$->value = asn1p_value_frombuf($1, strlen($1), 0);
1883 $$->presence = $3;
Lev Walkine596bf02005-03-28 15:01:27 +00001884 if($2) asn1p_constraint_insert($$, $2);
Lev Walkinf15320b2004-06-03 03:38:44 +00001885 }
1886 ;
1887
1888/*
1889 * presence constraint for WithComponents
1890 */
1891optPresenceConstraint:
1892 { $$ = ACPRES_DEFAULT; }
1893 | PresenceConstraint { $$ = $1; }
1894 ;
1895
1896PresenceConstraint:
1897 TOK_PRESENT {
1898 $$ = ACPRES_PRESENT;
1899 }
1900 | TOK_ABSENT {
1901 $$ = ACPRES_ABSENT;
1902 }
1903 | TOK_OPTIONAL {
1904 $$ = ACPRES_OPTIONAL;
1905 }
1906 ;
1907
1908TableConstraint:
1909 SimpleTableConstraint {
1910 $$ = $1;
1911 }
1912 | ComponentRelationConstraint {
1913 $$ = $1;
1914 }
1915 ;
1916
1917/*
1918 * "{ExtensionSet}"
1919 */
1920SimpleTableConstraint:
1921 '{' TypeRefName '}' {
1922 asn1p_ref_t *ref = asn1p_ref_new(yylineno);
1923 asn1p_constraint_t *ct;
1924 int ret;
1925 ret = asn1p_ref_add_component(ref, $2, 0);
1926 checkmem(ret == 0);
1927 ct = asn1p_constraint_new(yylineno);
1928 checkmem($$);
1929 ct->type = ACT_EL_VALUE;
1930 ct->value = asn1p_value_fromref(ref, 0);
Lev Walkin2c14a692005-08-12 10:08:45 +00001931 CONSTRAINT_INSERT($$, ACT_CA_CRC, ct, 0);
Lev Walkinf15320b2004-06-03 03:38:44 +00001932 }
1933 ;
1934
1935ComponentRelationConstraint:
1936 SimpleTableConstraint '{' AtNotationList '}' {
Lev Walkin2c14a692005-08-12 10:08:45 +00001937 CONSTRAINT_INSERT($$, ACT_CA_CRC, $1, $3);
Lev Walkinf15320b2004-06-03 03:38:44 +00001938 }
1939 ;
1940
1941AtNotationList:
1942 AtNotationElement {
1943 $$ = asn1p_constraint_new(yylineno);
1944 checkmem($$);
1945 $$->type = ACT_EL_VALUE;
1946 $$->value = asn1p_value_fromref($1, 0);
1947 }
1948 | AtNotationList ',' AtNotationElement {
1949 asn1p_constraint_t *ct;
1950 ct = asn1p_constraint_new(yylineno);
1951 checkmem(ct);
1952 ct->type = ACT_EL_VALUE;
1953 ct->value = asn1p_value_fromref($3, 0);
Lev Walkin2c14a692005-08-12 10:08:45 +00001954 CONSTRAINT_INSERT($$, ACT_CA_CSV, $1, ct);
Lev Walkinf15320b2004-06-03 03:38:44 +00001955 }
1956 ;
1957
1958/*
1959 * @blah
1960 */
1961AtNotationElement:
1962 '@' ComponentIdList {
1963 char *p = malloc(strlen($2) + 2);
1964 int ret;
1965 *p = '@';
1966 strcpy(p + 1, $2);
1967 $$ = asn1p_ref_new(yylineno);
1968 ret = asn1p_ref_add_component($$, p, 0);
1969 checkmem(ret == 0);
1970 free(p);
1971 free($2);
1972 }
1973 | '@' '.' ComponentIdList {
1974 char *p = malloc(strlen($3) + 3);
1975 int ret;
1976 p[0] = '@';
1977 p[1] = '.';
1978 strcpy(p + 2, $3);
1979 $$ = asn1p_ref_new(yylineno);
1980 ret = asn1p_ref_add_component($$, p, 0);
1981 checkmem(ret == 0);
1982 free(p);
1983 free($3);
1984 }
1985 ;
1986
1987/* identifier "." ... */
1988ComponentIdList:
1989 Identifier {
1990 $$ = $1;
1991 }
1992 | ComponentIdList '.' Identifier {
1993 int l1 = strlen($1);
1994 int l3 = strlen($3);
1995 $$ = malloc(l1 + 1 + l3 + 1);
1996 memcpy($$, $1, l1);
1997 $$[l1] = '.';
1998 memcpy($$ + l1 + 1, $3, l3);
1999 $$[l1 + 1 + l3] = '\0';
2000 }
2001 ;
2002
2003
2004
2005/*
2006 * MARKERS
2007 */
2008
2009optMarker:
Lev Walkin9c974182004-09-15 11:59:51 +00002010 {
2011 $$.flags = EM_NOMARK;
2012 $$.default_value = 0;
2013 }
Lev Walkinf15320b2004-06-03 03:38:44 +00002014 | Marker { $$ = $1; }
2015 ;
2016
2017Marker:
2018 TOK_OPTIONAL {
Lev Walkin70853052005-11-26 11:21:55 +00002019 $$.flags = EM_OPTIONAL | EM_INDIRECT;
Lev Walkin9c974182004-09-15 11:59:51 +00002020 $$.default_value = 0;
Lev Walkinf15320b2004-06-03 03:38:44 +00002021 }
Lev Walkin9c974182004-09-15 11:59:51 +00002022 | TOK_DEFAULT Value {
2023 $$.flags = EM_DEFAULT;
2024 $$.default_value = $2;
Lev Walkinf15320b2004-06-03 03:38:44 +00002025 }
2026 ;
2027
2028/*
2029 * Universal enumeration definition to use in INTEGER and ENUMERATED.
2030 * === EXAMPLE ===
2031 * Gender ::= ENUMERATED { unknown(0), male(1), female(2) }
2032 * Temperature ::= INTEGER { absolute-zero(-273), freezing(0), boiling(100) }
2033 * === EOF ===
2034 */
2035/*
2036optUniverationDefinition:
2037 { $$ = 0; }
2038 | UniverationDefinition {
2039 $$ = $1;
2040 }
2041 ;
2042*/
2043
2044UniverationDefinition:
2045 '{' '}' {
Lev Walkinceb20e72004-09-05 10:40:41 +00002046 $$ = asn1p_expr_new(yylineno);
Lev Walkinf15320b2004-06-03 03:38:44 +00002047 checkmem($$);
2048 }
2049 | '{' UniverationList '}' {
2050 $$ = $2;
2051 }
2052 ;
2053
2054UniverationList:
2055 UniverationElement {
Lev Walkinceb20e72004-09-05 10:40:41 +00002056 $$ = asn1p_expr_new(yylineno);
Lev Walkinf15320b2004-06-03 03:38:44 +00002057 checkmem($$);
Lev Walkin1004aa92004-09-08 00:28:11 +00002058 asn1p_expr_add($$, $1);
Lev Walkinf15320b2004-06-03 03:38:44 +00002059 }
2060 | UniverationList ',' UniverationElement {
2061 $$ = $1;
Lev Walkin1004aa92004-09-08 00:28:11 +00002062 asn1p_expr_add($$, $3);
Lev Walkinf15320b2004-06-03 03:38:44 +00002063 }
2064 ;
2065
2066UniverationElement:
2067 Identifier {
Lev Walkinceb20e72004-09-05 10:40:41 +00002068 $$ = asn1p_expr_new(yylineno);
Lev Walkinf15320b2004-06-03 03:38:44 +00002069 checkmem($$);
2070 $$->expr_type = A1TC_UNIVERVAL;
2071 $$->meta_type = AMT_VALUE;
2072 $$->Identifier = $1;
2073 }
2074 | Identifier '(' SignedNumber ')' {
Lev Walkinceb20e72004-09-05 10:40:41 +00002075 $$ = asn1p_expr_new(yylineno);
Lev Walkinf15320b2004-06-03 03:38:44 +00002076 checkmem($$);
2077 $$->expr_type = A1TC_UNIVERVAL;
2078 $$->meta_type = AMT_VALUE;
2079 $$->Identifier = $1;
2080 $$->value = $3;
2081 }
2082 | Identifier '(' DefinedValue ')' {
Lev Walkinceb20e72004-09-05 10:40:41 +00002083 $$ = asn1p_expr_new(yylineno);
Lev Walkinf15320b2004-06-03 03:38:44 +00002084 checkmem($$);
2085 $$->expr_type = A1TC_UNIVERVAL;
2086 $$->meta_type = AMT_VALUE;
2087 $$->Identifier = $1;
2088 $$->value = $3;
2089 }
2090 | SignedNumber {
Lev Walkinceb20e72004-09-05 10:40:41 +00002091 $$ = asn1p_expr_new(yylineno);
Lev Walkinf15320b2004-06-03 03:38:44 +00002092 checkmem($$);
2093 $$->expr_type = A1TC_UNIVERVAL;
2094 $$->meta_type = AMT_VALUE;
2095 $$->value = $1;
2096 }
2097 | TOK_ThreeDots {
Lev Walkinceb20e72004-09-05 10:40:41 +00002098 $$ = asn1p_expr_new(yylineno);
Lev Walkinf15320b2004-06-03 03:38:44 +00002099 checkmem($$);
2100 $$->Identifier = strdup("...");
2101 checkmem($$->Identifier);
2102 $$->expr_type = A1TC_EXTENSIBLE;
2103 $$->meta_type = AMT_VALUE;
2104 }
2105 ;
2106
2107SignedNumber:
2108 TOK_number {
2109 $$ = asn1p_value_fromint($1);
2110 checkmem($$);
2111 }
2112 | TOK_number_negative {
2113 $$ = asn1p_value_fromint($1);
2114 checkmem($$);
2115 }
2116 ;
2117
2118/*
2119 * SEQUENCE definition.
2120 * === EXAMPLE ===
2121 * Struct1 ::= SEQUENCE {
2122 * memb1 Struct2,
2123 * memb2 SEQUENCE OF {
2124 * memb2-1 Struct 3
2125 * }
2126 * }
2127 * === EOF ===
2128 */
2129
2130
2131
2132/*
2133 * SET definition.
2134 * === EXAMPLE ===
2135 * Person ::= SET {
2136 * name [0] PrintableString (SIZE(1..20)),
2137 * country [1] PrintableString (SIZE(1..20)) DEFAULT default-country,
2138 * }
2139 * === EOF ===
2140 */
2141
2142optTag:
2143 { memset(&$$, 0, sizeof($$)); }
2144 | Tag { $$ = $1; }
2145 ;
2146
2147Tag:
Lev Walkinc603f102005-01-23 09:51:44 +00002148 TagTypeValue TagPlicit {
Lev Walkinf15320b2004-06-03 03:38:44 +00002149 $$ = $1;
Lev Walkinc603f102005-01-23 09:51:44 +00002150 $$.tag_mode = $2.tag_mode;
Lev Walkinf15320b2004-06-03 03:38:44 +00002151 }
Lev Walkinc603f102005-01-23 09:51:44 +00002152 ;
2153
2154TagTypeValue:
2155 '[' TagClass TOK_number ']' {
2156 $$ = $2;
2157 $$.tag_value = $3;
2158 };
2159
2160TagClass:
2161 { $$.tag_class = TC_CONTEXT_SPECIFIC; }
2162 | TOK_UNIVERSAL { $$.tag_class = TC_UNIVERSAL; }
2163 | TOK_APPLICATION { $$.tag_class = TC_APPLICATION; }
2164 | TOK_PRIVATE { $$.tag_class = TC_PRIVATE; }
2165 ;
2166
2167TagPlicit:
2168 { $$.tag_mode = TM_DEFAULT; }
2169 | TOK_IMPLICIT { $$.tag_mode = TM_IMPLICIT; }
2170 | TOK_EXPLICIT { $$.tag_mode = TM_EXPLICIT; }
Lev Walkinf15320b2004-06-03 03:38:44 +00002171 ;
2172
2173TypeRefName:
2174 TOK_typereference {
2175 checkmem($1);
2176 $$ = $1;
2177 }
Lev Walkinf59d0752004-08-18 04:59:12 +00002178 | TOK_capitalreference {
Lev Walkinf15320b2004-06-03 03:38:44 +00002179 checkmem($1);
2180 $$ = $1;
2181 }
2182 ;
2183
Lev Walkinf59d0752004-08-18 04:59:12 +00002184
Lev Walkinf15320b2004-06-03 03:38:44 +00002185ObjectClassReference:
Lev Walkinf59d0752004-08-18 04:59:12 +00002186 TOK_capitalreference {
Lev Walkinf15320b2004-06-03 03:38:44 +00002187 checkmem($1);
2188 $$ = $1;
2189 }
2190 ;
2191
Lev Walkin83cac2f2004-09-22 16:03:36 +00002192optIdentifier:
2193 { $$ = 0; }
2194 | Identifier {
2195 $$ = $1;
2196 }
Lev Walkin8f294e02005-06-06 08:28:58 +00002197 ;
Lev Walkin83cac2f2004-09-22 16:03:36 +00002198
Lev Walkinf15320b2004-06-03 03:38:44 +00002199Identifier:
2200 TOK_identifier {
2201 checkmem($1);
2202 $$ = $1;
2203 }
2204 ;
2205
Lev Walkinf15320b2004-06-03 03:38:44 +00002206%%
2207
2208
2209/*
2210 * Convert Xstring ('0101'B or '5'H) to the binary vector.
2211 */
2212static asn1p_value_t *
2213_convert_bitstring2binary(char *str, int base) {
2214 asn1p_value_t *val;
2215 int slen;
2216 int memlen;
2217 int baselen;
2218 int bits;
2219 uint8_t *binary_vector;
2220 uint8_t *bv_ptr;
2221 uint8_t cur_val;
2222
2223 assert(str);
2224 assert(str[0] == '\'');
2225
2226 switch(base) {
2227 case 'B':
2228 baselen = 1;
2229 break;
2230 case 'H':
2231 baselen = 4;
2232 break;
2233 default:
2234 assert(base == 'B' || base == 'H');
2235 errno = EINVAL;
2236 return NULL;
2237 }
2238
2239 slen = strlen(str);
2240 assert(str[slen - 1] == base);
2241 assert(str[slen - 2] == '\'');
2242
2243 memlen = slen / (8 / baselen); /* Conservative estimate */
2244
2245 bv_ptr = binary_vector = malloc(memlen + 1);
2246 if(bv_ptr == NULL)
2247 /* ENOMEM */
2248 return NULL;
2249
2250 cur_val = 0;
2251 bits = 0;
2252 while(*(++str) != '\'') {
2253 switch(baselen) {
2254 case 1:
2255 switch(*str) {
2256 case '1':
2257 cur_val |= 1 << (7 - (bits % 8));
2258 case '0':
2259 break;
2260 default:
2261 assert(!"_y UNREACH1");
2262 case ' ': case '\r': case '\n':
2263 continue;
2264 }
2265 break;
2266 case 4:
2267 switch(*str) {
2268 case '0': case '1': case '2': case '3': case '4':
2269 case '5': case '6': case '7': case '8': case '9':
2270 cur_val |= (*str - '0') << (4 - (bits % 8));
2271 break;
2272 case 'A': case 'B': case 'C':
2273 case 'D': case 'E': case 'F':
2274 cur_val |= ((*str - 'A') + 10)
2275 << (4 - (bits % 8));
2276 break;
2277 default:
2278 assert(!"_y UNREACH2");
2279 case ' ': case '\r': case '\n':
2280 continue;
2281 }
2282 break;
2283 }
2284
2285 bits += baselen;
2286 if((bits % 8) == 0) {
2287 *bv_ptr++ = cur_val;
2288 cur_val = 0;
2289 }
2290 }
2291
2292 *bv_ptr = cur_val;
2293 assert((bv_ptr - binary_vector) <= memlen);
2294
2295 val = asn1p_value_frombits(binary_vector, bits, 0);
2296 if(val == NULL) {
2297 free(binary_vector);
2298 }
2299
2300 return val;
2301}
2302
Lev Walkin2e9bd5c2005-08-13 09:07:11 +00002303/*
2304 * For unnamed types (used in old X.208 compliant modules)
2305 * generate some sort of interim names, to not to force human being to fix
2306 * the specification's compliance to modern ASN.1 standards.
2307 */
2308static void
2309_fixup_anonymous_identifier(asn1p_expr_t *expr) {
2310 char *p;
2311 assert(expr->Identifier == 0);
2312
2313 /*
2314 * Try to figure out the type name
2315 * without going too much into details
2316 */
2317 expr->Identifier = ASN_EXPR_TYPE2STR(expr->expr_type);
2318 if(expr->reference && expr->reference->comp_count > 0)
2319 expr->Identifier = expr->reference->components[0].name;
2320
2321 fprintf(stderr,
2322 "WARNING: Line %d: expected lower-case member identifier, "
2323 "found an unnamed %s.\n"
2324 "WARNING: Obsolete X.208 syntax detected, "
2325 "please give the member a name.\n",
2326 yylineno, expr->Identifier ? expr->Identifier : "type");
2327
2328 if(!expr->Identifier)
2329 expr->Identifier = "unnamed";
2330 expr->Identifier = strdup(expr->Identifier);
2331 assert(expr->Identifier);
2332 /* Make a lowercase identifier from the type name */
2333 for(p = expr->Identifier; *p; p++) {
2334 switch(*p) {
2335 case 'A' ... 'Z': *p += 32; break;
2336 case ' ': *p = '_'; break;
2337 case '-': *p = '_'; break;
2338 }
2339 }
2340 fprintf(stderr, "NOTE: Assigning temporary identifier \"%s\". "
2341 "Name clash may occur later.\n",
2342 expr->Identifier);
2343}
2344
Lev Walkinf15320b2004-06-03 03:38:44 +00002345int
2346yyerror(const char *msg) {
Lev Walkin9d542d22006-03-14 16:31:37 +00002347 extern char *asn1p_text;
Lev Walkinf15320b2004-06-03 03:38:44 +00002348 fprintf(stderr,
2349 "ASN.1 grammar parse error "
2350 "near line %d (token \"%s\"): %s\n",
Lev Walkinceb20e72004-09-05 10:40:41 +00002351 yylineno, asn1p_text, msg);
Lev Walkinf15320b2004-06-03 03:38:44 +00002352 return -1;
2353}
2354