blob: 41f566d7e9bbe6f88b834dbcca27f0381b53d923 [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 */
110%token <tv_opaque> TOK_opaque /* opaque data (driven from .y) */
111%token <tv_str> TOK_bstring
112%token <tv_opaque> TOK_cstring
113%token <tv_str> TOK_hstring
114%token <tv_str> TOK_identifier
115%token <a_int> TOK_number
Lev Walkind9574ae2005-03-24 16:22:35 +0000116%token <a_int> TOK_tuple
117%token <a_int> TOK_quadruple
Lev Walkinf15320b2004-06-03 03:38:44 +0000118%token <a_int> TOK_number_negative
119%token <tv_str> TOK_typereference
Lev Walkinf59d0752004-08-18 04:59:12 +0000120%token <tv_str> TOK_capitalreference /* "CLASS1" */
Lev Walkinf15320b2004-06-03 03:38:44 +0000121%token <tv_str> TOK_typefieldreference /* "&Pork" */
122%token <tv_str> TOK_valuefieldreference /* "&id" */
123
124/*
125 * Token types representing ASN.1 standard keywords.
126 */
127%token TOK_ABSENT
128%token TOK_ABSTRACT_SYNTAX
129%token TOK_ALL
130%token TOK_ANY
131%token TOK_APPLICATION
132%token TOK_AUTOMATIC
133%token TOK_BEGIN
134%token TOK_BIT
135%token TOK_BMPString
136%token TOK_BOOLEAN
137%token TOK_BY
138%token TOK_CHARACTER
139%token TOK_CHOICE
140%token TOK_CLASS
141%token TOK_COMPONENT
142%token TOK_COMPONENTS
143%token TOK_CONSTRAINED
144%token TOK_CONTAINING
145%token TOK_DEFAULT
146%token TOK_DEFINITIONS
147%token TOK_DEFINED
148%token TOK_EMBEDDED
149%token TOK_ENCODED
Lev Walkinf59d0752004-08-18 04:59:12 +0000150%token TOK_ENCODING_CONTROL
Lev Walkinf15320b2004-06-03 03:38:44 +0000151%token TOK_END
152%token TOK_ENUMERATED
153%token TOK_EXPLICIT
154%token TOK_EXPORTS
155%token TOK_EXTENSIBILITY
156%token TOK_EXTERNAL
157%token TOK_FALSE
158%token TOK_FROM
159%token TOK_GeneralizedTime
160%token TOK_GeneralString
161%token TOK_GraphicString
162%token TOK_IA5String
163%token TOK_IDENTIFIER
164%token TOK_IMPLICIT
165%token TOK_IMPLIED
166%token TOK_IMPORTS
167%token TOK_INCLUDES
168%token TOK_INSTANCE
Lev Walkinf59d0752004-08-18 04:59:12 +0000169%token TOK_INSTRUCTIONS
Lev Walkinf15320b2004-06-03 03:38:44 +0000170%token TOK_INTEGER
171%token TOK_ISO646String
172%token TOK_MAX
173%token TOK_MIN
174%token TOK_MINUS_INFINITY
175%token TOK_NULL
176%token TOK_NumericString
177%token TOK_OBJECT
178%token TOK_ObjectDescriptor
179%token TOK_OCTET
180%token TOK_OF
181%token TOK_OPTIONAL
182%token TOK_PATTERN
183%token TOK_PDV
184%token TOK_PLUS_INFINITY
185%token TOK_PRESENT
186%token TOK_PrintableString
187%token TOK_PRIVATE
188%token TOK_REAL
189%token TOK_RELATIVE_OID
190%token TOK_SEQUENCE
191%token TOK_SET
192%token TOK_SIZE
193%token TOK_STRING
194%token TOK_SYNTAX
195%token TOK_T61String
196%token TOK_TAGS
197%token TOK_TeletexString
198%token TOK_TRUE
199%token TOK_TYPE_IDENTIFIER
200%token TOK_UNIQUE
201%token TOK_UNIVERSAL
202%token TOK_UniversalString
203%token TOK_UTCTime
204%token TOK_UTF8String
205%token TOK_VideotexString
206%token TOK_VisibleString
207%token TOK_WITH
208
Lev Walkinf15320b2004-06-03 03:38:44 +0000209%left TOK_EXCEPT
Lev Walkinf59d0752004-08-18 04:59:12 +0000210%left '^' TOK_INTERSECTION
211%left '|' TOK_UNION
Lev Walkinf15320b2004-06-03 03:38:44 +0000212
213/* Misc tags */
214%token TOK_TwoDots /* .. */
215%token TOK_ThreeDots /* ... */
Lev Walkinf15320b2004-06-03 03:38:44 +0000216
217
218/*
219 * Types defined herein.
220 */
221%type <a_grammar> ModuleList
222%type <a_module> ModuleSpecification
223%type <a_module> ModuleSpecificationBody
224%type <a_module> ModuleSpecificationElement
225%type <a_module> optModuleSpecificationBody /* Optional */
226%type <a_module_flags> optModuleSpecificationFlags
227%type <a_module_flags> ModuleSpecificationFlags /* Set of FL */
228%type <a_module_flags> ModuleSpecificationFlag /* Single FL */
229%type <a_module> ImportsDefinition
230%type <a_module> ImportsBundleSet
231%type <a_xports> ImportsBundle
232%type <a_xports> ImportsList
233%type <a_xports> ExportsDefinition
234%type <a_xports> ExportsBody
235%type <a_expr> ImportsElement
236%type <a_expr> ExportsElement
Lev Walkinf15320b2004-06-03 03:38:44 +0000237%type <a_expr> ExtensionAndException
Lev Walkin070a52d2004-08-22 03:19:54 +0000238%type <a_expr> TypeDeclaration
Lev Walkin4696c742005-08-22 12:23:54 +0000239%type <a_expr> TypeDeclarationSet
Lev Walkinf15320b2004-06-03 03:38:44 +0000240%type <a_ref> ComplexTypeReference
241%type <a_ref> ComplexTypeReferenceAmpList
242%type <a_refcomp> ComplexTypeReferenceElement
243%type <a_refcomp> ClassFieldIdentifier
244%type <a_refcomp> ClassFieldName
Lev Walkin9c2285a2006-03-09 08:49:26 +0000245%type <a_expr> FieldSpec
246%type <a_ref> FieldName
247%type <a_ref> DefinedObjectClass
Lev Walkinf15320b2004-06-03 03:38:44 +0000248%type <a_expr> ClassField
Lev Walkin9c2285a2006-03-09 08:49:26 +0000249%type <a_expr> ObjectClass
Lev Walkin070a52d2004-08-22 03:19:54 +0000250%type <a_expr> Type
Lev Walkinf15320b2004-06-03 03:38:44 +0000251%type <a_expr> DataTypeReference /* Type1 ::= Type2 */
252%type <a_expr> DefinedTypeRef
253%type <a_expr> ValueSetDefinition /* Val INTEGER ::= {1|2} */
254%type <a_expr> ValueDefinition /* val INTEGER ::= 1*/
Lev Walkin9c974182004-09-15 11:59:51 +0000255%type <a_value> Value
Lev Walkinf15320b2004-06-03 03:38:44 +0000256%type <a_value> DefinedValue
257%type <a_value> SignedNumber
Lev Walkin144db9b2004-10-12 23:26:53 +0000258%type <a_expr> optComponentTypeLists
Lev Walkin070a52d2004-08-22 03:19:54 +0000259%type <a_expr> ComponentTypeLists
260%type <a_expr> ComponentType
261%type <a_expr> AlternativeTypeLists
262%type <a_expr> AlternativeType
Lev Walkinf15320b2004-06-03 03:38:44 +0000263//%type <a_expr> optUniverationDefinition
264%type <a_expr> UniverationDefinition
265%type <a_expr> UniverationList
266%type <a_expr> UniverationElement
267%type <tv_str> TypeRefName
268%type <tv_str> ObjectClassReference
Lev Walkinf15320b2004-06-03 03:38:44 +0000269%type <tv_str> Identifier
Lev Walkin83cac2f2004-09-22 16:03:36 +0000270%type <tv_str> optIdentifier
Lev Walkinf15320b2004-06-03 03:38:44 +0000271%type <a_parg> ParameterArgumentName
272%type <a_plist> ParameterArgumentList
273%type <a_expr> ActualParameter
274%type <a_expr> ActualParameterList
Lev Walkin1ed22092005-08-12 10:06:17 +0000275%type <a_aid> AssignedIdentifier /* OID/DefinedValue */
Lev Walkinf15320b2004-06-03 03:38:44 +0000276%type <a_oid> ObjectIdentifier /* OID */
277%type <a_oid> optObjectIdentifier /* Optional OID */
278%type <a_oid> ObjectIdentifierBody
279%type <a_oid_arc> ObjectIdentifierElement
280%type <a_expr> BasicType
281%type <a_type> BasicTypeId
282%type <a_type> BasicTypeId_UniverationCompatible
283%type <a_type> BasicString
284%type <tv_opaque> Opaque
285//%type <tv_opaque> StringValue
Lev Walkinc603f102005-01-23 09:51:44 +0000286%type <a_tag> Tag /* [UNIVERSAL 0] IMPLICIT */
287%type <a_tag> TagClass TagTypeValue TagPlicit
Lev Walkinf15320b2004-06-03 03:38:44 +0000288%type <a_tag> optTag /* [UNIVERSAL 0] IMPLICIT */
289%type <a_constr> optConstraints
Lev Walkind2ea1de2004-08-20 13:25:29 +0000290%type <a_constr> Constraints
Lev Walkinf59d0752004-08-18 04:59:12 +0000291%type <a_constr> SetOfConstraints
292%type <a_constr> ElementSetSpecs /* 1..2,...,3 */
293%type <a_constr> ElementSetSpec /* 1..2,...,3 */
Lev Walkinf15320b2004-06-03 03:38:44 +0000294%type <a_constr> ConstraintSubtypeElement /* 1..2 */
Lev Walkinf15320b2004-06-03 03:38:44 +0000295%type <a_constr> SimpleTableConstraint
296%type <a_constr> TableConstraint
Lev Walkine596bf02005-03-28 15:01:27 +0000297%type <a_constr> InnerTypeConstraint
Lev Walkinf15320b2004-06-03 03:38:44 +0000298%type <a_constr> WithComponentsList
299%type <a_constr> WithComponentsElement
300%type <a_constr> ComponentRelationConstraint
301%type <a_constr> AtNotationList
302%type <a_ref> AtNotationElement
Lev Walkinff7dd142005-03-20 12:58:00 +0000303%type <a_value> SingleValue
304%type <a_value> ContainedSubtype
Lev Walkinf15320b2004-06-03 03:38:44 +0000305%type <a_ctype> ConstraintSpec
306%type <a_ctype> ConstraintRangeSpec
Lev Walkin1e448d32005-03-24 14:26:38 +0000307%type <a_value> RestrictedCharacterStringValue
Lev Walkinf15320b2004-06-03 03:38:44 +0000308%type <a_wsynt> optWithSyntax
309%type <a_wsynt> WithSyntax
310%type <a_wsynt> WithSyntaxFormat
311%type <a_wchunk> WithSyntaxFormatToken
312%type <a_marker> optMarker Marker
313%type <a_int> optUnique
314%type <a_pres> optPresenceConstraint PresenceConstraint
315%type <tv_str> ComponentIdList
Lev Walkinef625402005-09-05 05:17:57 +0000316%type <a_int> NSTD_IndirectMarker
Lev Walkinf15320b2004-06-03 03:38:44 +0000317
318
319%%
320
321
322ParsedGrammar:
323 ModuleList {
324 *(void **)param = $1;
325 }
326 ;
327
328ModuleList:
329 ModuleSpecification {
330 $$ = asn1p_new();
331 checkmem($$);
332 TQ_ADD(&($$->modules), $1, mod_next);
333 }
334 | ModuleList ModuleSpecification {
335 $$ = $1;
336 TQ_ADD(&($$->modules), $2, mod_next);
337 }
338 ;
339
340/*
341 * ASN module definition.
342 * === EXAMPLE ===
343 * MySyntax DEFINITIONS AUTOMATIC TAGS ::=
344 * BEGIN
345 * ...
346 * END
347 * === EOF ===
348 */
349
350ModuleSpecification:
351 TypeRefName optObjectIdentifier TOK_DEFINITIONS
352 optModuleSpecificationFlags
353 TOK_PPEQ TOK_BEGIN
354 optModuleSpecificationBody
355 TOK_END {
356
357 if($7) {
358 $$ = $7;
359 } else {
360 /* There's a chance that a module is just plain empty */
361 $$ = asn1p_module_new();
362 }
363 checkmem($$);
364
Lev Walkin1ed22092005-08-12 10:06:17 +0000365 $$->ModuleName = $1;
Lev Walkinf15320b2004-06-03 03:38:44 +0000366 $$->module_oid = $2;
367 $$->module_flags = $4;
368 }
369 ;
370
371/*
372 * Object Identifier Definition
373 * { iso member-body(2) 3 }
374 */
375optObjectIdentifier:
376 { $$ = 0; }
377 | ObjectIdentifier { $$ = $1; }
378 ;
379
380ObjectIdentifier:
381 '{' ObjectIdentifierBody '}' {
382 $$ = $2;
383 }
384 | '{' '}' {
385 $$ = 0;
386 }
387 ;
388
389ObjectIdentifierBody:
390 ObjectIdentifierElement {
391 $$ = asn1p_oid_new();
392 asn1p_oid_add_arc($$, &$1);
393 if($1.name)
394 free($1.name);
395 }
396 | ObjectIdentifierBody ObjectIdentifierElement {
397 $$ = $1;
398 asn1p_oid_add_arc($$, &$2);
399 if($2.name)
400 free($2.name);
401 }
402 ;
403
404ObjectIdentifierElement:
405 Identifier { /* iso */
406 $$.name = $1;
407 $$.number = -1;
408 }
409 | Identifier '(' TOK_number ')' { /* iso(1) */
410 $$.name = $1;
411 $$.number = $3;
412 }
413 | TOK_number { /* 1 */
414 $$.name = 0;
415 $$.number = $1;
416 }
417 ;
418
419/*
420 * Optional module flags.
421 */
422optModuleSpecificationFlags:
423 { $$ = MSF_NOFLAGS; }
424 | ModuleSpecificationFlags {
425 $$ = $1;
426 }
427 ;
428
429/*
430 * Module flags.
431 */
432ModuleSpecificationFlags:
433 ModuleSpecificationFlag {
434 $$ = $1;
435 }
436 | ModuleSpecificationFlags ModuleSpecificationFlag {
437 $$ = $1 | $2;
438 }
439 ;
440
441/*
442 * Single module flag.
443 */
444ModuleSpecificationFlag:
445 TOK_EXPLICIT TOK_TAGS {
446 $$ = MSF_EXPLICIT_TAGS;
447 }
448 | TOK_IMPLICIT TOK_TAGS {
449 $$ = MSF_IMPLICIT_TAGS;
450 }
451 | TOK_AUTOMATIC TOK_TAGS {
452 $$ = MSF_AUTOMATIC_TAGS;
453 }
454 | TOK_EXTENSIBILITY TOK_IMPLIED {
455 $$ = MSF_EXTENSIBILITY_IMPLIED;
456 }
Lev Walkinf59d0752004-08-18 04:59:12 +0000457 /* EncodingReferenceDefault */
458 | TOK_capitalreference TOK_INSTRUCTIONS {
459 /* X.680Amd1 specifies TAG and XER */
460 if(strcmp($1, "TAG") == 0) {
461 $$ = MSF_TAG_INSTRUCTIONS;
462 } else if(strcmp($1, "XER") == 0) {
463 $$ = MSF_XER_INSTRUCTIONS;
464 } else {
465 fprintf(stderr,
466 "WARNING: %s INSTRUCTIONS at line %d: "
467 "Unrecognized encoding reference\n",
468 $1, yylineno);
469 $$ = MSF_unk_INSTRUCTIONS;
470 }
471 free($1);
472 }
Lev Walkinf15320b2004-06-03 03:38:44 +0000473 ;
474
475/*
476 * Optional module body.
477 */
478optModuleSpecificationBody:
479 { $$ = 0; }
480 | ModuleSpecificationBody {
Lev Walkinf15320b2004-06-03 03:38:44 +0000481 $$ = $1;
482 }
483 ;
484
485/*
486 * ASN.1 Module body.
487 */
488ModuleSpecificationBody:
489 ModuleSpecificationElement {
490 $$ = $1;
491 }
492 | ModuleSpecificationBody ModuleSpecificationElement {
493 $$ = $1;
494
Lev Walkinf59d0752004-08-18 04:59:12 +0000495 /* Behave well when one of them is skipped. */
496 if(!($1)) {
497 if($2) $$ = $2;
498 break;
499 }
500
Lev Walkinf15320b2004-06-03 03:38:44 +0000501#ifdef MY_IMPORT
502#error MY_IMPORT DEFINED ELSEWHERE!
503#endif
504#define MY_IMPORT(foo,field) do { \
Lev Walkinbc55d232004-08-13 12:31:09 +0000505 while(TQ_FIRST(&($2->foo))) { \
Lev Walkinf15320b2004-06-03 03:38:44 +0000506 TQ_ADD(&($$->foo), \
507 TQ_REMOVE(&($2->foo), field), \
508 field); \
Lev Walkinbc55d232004-08-13 12:31:09 +0000509 } \
510 assert(TQ_FIRST(&($2->foo)) == 0); \
511 } while(0)
Lev Walkinf15320b2004-06-03 03:38:44 +0000512
513 MY_IMPORT(imports, xp_next);
514 MY_IMPORT(exports, xp_next);
515 MY_IMPORT(members, next);
516#undef MY_IMPORT
517
518 }
519 ;
520
521/*
522 * One of the elements of ASN.1 module specification.
523 */
524ModuleSpecificationElement:
525 ImportsDefinition {
526 $$ = $1;
527 }
528 | ExportsDefinition {
529 $$ = asn1p_module_new();
530 checkmem($$);
531 if($1) {
532 TQ_ADD(&($$->exports), $1, xp_next);
533 } else {
534 /* "EXPORTS ALL;" ? */
535 }
536 }
537 | DataTypeReference {
538 $$ = asn1p_module_new();
539 checkmem($$);
540 assert($1->expr_type != A1TC_INVALID);
541 assert($1->meta_type != AMT_INVALID);
542 TQ_ADD(&($$->members), $1, next);
543 }
544 | ValueDefinition {
545 $$ = asn1p_module_new();
546 checkmem($$);
547 assert($1->expr_type != A1TC_INVALID);
548 assert($1->meta_type != AMT_INVALID);
549 TQ_ADD(&($$->members), $1, next);
550 }
551 /*
552 * Value set definition
553 * === EXAMPLE ===
554 * EvenNumbers INTEGER ::= { 2 | 4 | 6 | 8 }
555 * === EOF ===
556 */
557 | ValueSetDefinition {
558 $$ = asn1p_module_new();
559 checkmem($$);
560 assert($1->expr_type != A1TC_INVALID);
561 assert($1->meta_type != AMT_INVALID);
562 TQ_ADD(&($$->members), $1, next);
563 }
Lev Walkinf59d0752004-08-18 04:59:12 +0000564 | TOK_ENCODING_CONTROL TOK_capitalreference
565 { asn1p_lexer_hack_push_encoding_control(); }
566 {
567 fprintf(stderr,
568 "WARNING: ENCODING-CONTROL %s "
569 "specification at line %d ignored\n",
570 $2, yylineno);
571 free($2);
572 $$ = 0;
573 }
Lev Walkinf15320b2004-06-03 03:38:44 +0000574
575 /*
576 * Erroneous attemps
577 */
578 | BasicString {
579 return yyerror(
Lev Walkin70853052005-11-26 11:21:55 +0000580 "Attempt to redefine a standard basic string type, "
581 "please comment out or remove this type redefinition.");
Lev Walkinf15320b2004-06-03 03:38:44 +0000582 }
583 ;
584
585/*
586 * === EXAMPLE ===
587 * IMPORTS Type1, value FROM Module { iso standard(0) } ;
588 * === EOF ===
589 */
590ImportsDefinition:
591 TOK_IMPORTS ImportsBundleSet ';' {
Lev Walkin1ed22092005-08-12 10:06:17 +0000592 if(!saved_aid && 0)
593 return yyerror("Unterminated IMPORTS FROM, "
594 "expected semicolon ';'");
595 saved_aid = 0;
Lev Walkinf15320b2004-06-03 03:38:44 +0000596 $$ = $2;
597 }
598 /*
599 * Some error cases.
600 */
601 | TOK_IMPORTS TOK_FROM /* ... */ {
602 return yyerror("Empty IMPORTS list");
603 }
604 ;
605
606ImportsBundleSet:
607 ImportsBundle {
608 $$ = asn1p_module_new();
609 checkmem($$);
610 TQ_ADD(&($$->imports), $1, xp_next);
611 }
612 | ImportsBundleSet ImportsBundle {
613 $$ = $1;
614 TQ_ADD(&($$->imports), $2, xp_next);
615 }
616 ;
617
Lev Walkin1ed22092005-08-12 10:06:17 +0000618AssignedIdentifier:
619 { memset(&$$, 0, sizeof($$)); }
620 | ObjectIdentifier { $$.oid = $1; };
621 /* | DefinedValue { $$.value = $1; }; // Handled through saved_aid */
622
Lev Walkinf15320b2004-06-03 03:38:44 +0000623ImportsBundle:
Lev Walkin1ed22092005-08-12 10:06:17 +0000624 ImportsList TOK_FROM TypeRefName AssignedIdentifier {
Lev Walkinf15320b2004-06-03 03:38:44 +0000625 $$ = $1;
Lev Walkin1ed22092005-08-12 10:06:17 +0000626 $$->fromModuleName = $3;
627 $$->identifier = $4;
628 /* This stupid thing is used for look-back hack. */
629 saved_aid = $$->identifier.oid ? 0 : &($$->identifier);
Lev Walkinf15320b2004-06-03 03:38:44 +0000630 checkmem($$);
631 }
632 ;
633
634ImportsList:
635 ImportsElement {
636 $$ = asn1p_xports_new();
637 checkmem($$);
638 TQ_ADD(&($$->members), $1, next);
639 }
640 | ImportsList ',' ImportsElement {
641 $$ = $1;
642 TQ_ADD(&($$->members), $3, next);
643 }
644 ;
645
646ImportsElement:
647 TypeRefName {
648 $$ = asn1p_expr_new(yylineno);
649 checkmem($$);
650 $$->Identifier = $1;
651 $$->expr_type = A1TC_REFERENCE;
652 }
Lev Walkin144db9b2004-10-12 23:26:53 +0000653 | TypeRefName '{' '}' { /* Completely equivalent to above */
654 $$ = asn1p_expr_new(yylineno);
655 checkmem($$);
656 $$->Identifier = $1;
657 $$->expr_type = A1TC_REFERENCE;
658 }
Lev Walkinf15320b2004-06-03 03:38:44 +0000659 | Identifier {
660 $$ = asn1p_expr_new(yylineno);
661 checkmem($$);
662 $$->Identifier = $1;
663 $$->expr_type = A1TC_REFERENCE;
664 }
665 ;
666
667ExportsDefinition:
668 TOK_EXPORTS ExportsBody ';' {
669 $$ = $2;
670 }
671 | TOK_EXPORTS TOK_ALL ';' {
672 $$ = 0;
673 }
674 | TOK_EXPORTS ';' {
675 /* Empty EXPORTS clause effectively prohibits export. */
676 $$ = asn1p_xports_new();
677 checkmem($$);
678 }
679 ;
680
681ExportsBody:
682 ExportsElement {
683 $$ = asn1p_xports_new();
684 assert($$);
685 TQ_ADD(&($$->members), $1, next);
686 }
687 | ExportsBody ',' ExportsElement {
688 $$ = $1;
689 TQ_ADD(&($$->members), $3, next);
690 }
691 ;
692
693ExportsElement:
694 TypeRefName {
695 $$ = asn1p_expr_new(yylineno);
696 checkmem($$);
697 $$->Identifier = $1;
698 $$->expr_type = A1TC_EXPORTVAR;
699 }
Lev Walkin144db9b2004-10-12 23:26:53 +0000700 | TypeRefName '{' '}' {
701 $$ = asn1p_expr_new(yylineno);
702 checkmem($$);
703 $$->Identifier = $1;
704 $$->expr_type = A1TC_EXPORTVAR;
705 }
Lev Walkinf15320b2004-06-03 03:38:44 +0000706 | Identifier {
707 $$ = asn1p_expr_new(yylineno);
708 checkmem($$);
709 $$->Identifier = $1;
710 $$->expr_type = A1TC_EXPORTVAR;
711 }
712 ;
713
714
715ValueSetDefinition:
Lev Walkin8ea99482005-03-31 21:48:13 +0000716 TypeRefName DefinedTypeRef TOK_PPEQ
717 '{' { asn1p_lexer_hack_push_opaque_state(); } Opaque /* '}' */ {
Lev Walkinf15320b2004-06-03 03:38:44 +0000718 $$ = $2;
719 assert($$->Identifier == 0);
720 $$->Identifier = $1;
721 $$->meta_type = AMT_VALUESET;
Lev Walkin8ea99482005-03-31 21:48:13 +0000722 // take care of ValueSet body
Lev Walkinf15320b2004-06-03 03:38:44 +0000723 }
724 ;
725
726DefinedTypeRef:
727 ComplexTypeReference {
728 $$ = asn1p_expr_new(yylineno);
729 checkmem($$);
730 $$->reference = $1;
731 $$->expr_type = A1TC_REFERENCE;
732 $$->meta_type = AMT_TYPEREF;
733 }
734 | BasicTypeId {
735 $$ = asn1p_expr_new(yylineno);
736 checkmem($$);
737 $$->expr_type = $1;
738 $$->meta_type = AMT_TYPE;
739 }
740 ;
741
Lev Walkinf15320b2004-06-03 03:38:44 +0000742/*
743 * Data Type Reference.
744 * === EXAMPLE ===
745 * Type3 ::= CHOICE { a Type1, b Type 2 }
746 * === EOF ===
747 */
Lev Walkinf15320b2004-06-03 03:38:44 +0000748DataTypeReference:
749 /*
750 * Optionally tagged type definition.
751 */
Lev Walkin9c2285a2006-03-09 08:49:26 +0000752 TypeRefName TOK_PPEQ Type {
Lev Walkinaf120f72004-09-14 02:36:39 +0000753 $$ = $3;
Lev Walkinf15320b2004-06-03 03:38:44 +0000754 $$->Identifier = $1;
Lev Walkinf15320b2004-06-03 03:38:44 +0000755 assert($$->expr_type);
756 assert($$->meta_type);
757 }
Lev Walkin9c2285a2006-03-09 08:49:26 +0000758 | TypeRefName TOK_PPEQ ObjectClass {
Lev Walkinf15320b2004-06-03 03:38:44 +0000759 $$ = $3;
760 $$->Identifier = $1;
761 assert($$->expr_type == A1TC_CLASSDEF);
Lev Walkin9c2285a2006-03-09 08:49:26 +0000762 assert($$->meta_type == AMT_OBJECTCLASS);
Lev Walkinf15320b2004-06-03 03:38:44 +0000763 }
764 /*
765 * Parametrized <Type> declaration:
766 * === EXAMPLE ===
767 * SIGNED { ToBeSigned } ::= SEQUENCE {
768 * toBeSigned ToBeSigned,
769 * algorithm AlgorithmIdentifier,
770 * signature BIT STRING
771 * }
772 * === EOF ===
773 */
Lev Walkin070a52d2004-08-22 03:19:54 +0000774 | TypeRefName '{' ParameterArgumentList '}' TOK_PPEQ Type {
Lev Walkinf15320b2004-06-03 03:38:44 +0000775 $$ = $6;
776 assert($$->Identifier == 0);
777 $$->Identifier = $1;
778 $$->params = $3;
779 $$->meta_type = AMT_PARAMTYPE;
780 }
781 ;
782
783ParameterArgumentList:
784 ParameterArgumentName {
785 int ret;
786 $$ = asn1p_paramlist_new(yylineno);
787 checkmem($$);
788 ret = asn1p_paramlist_add_param($$, $1.governor, $1.argument);
789 checkmem(ret == 0);
790 if($1.governor) asn1p_ref_free($1.governor);
791 if($1.argument) free($1.argument);
792 }
793 | ParameterArgumentList ',' ParameterArgumentName {
794 int ret;
795 $$ = $1;
796 ret = asn1p_paramlist_add_param($$, $3.governor, $3.argument);
797 checkmem(ret == 0);
798 if($3.governor) asn1p_ref_free($3.governor);
799 if($3.argument) free($3.argument);
800 }
801 ;
802
803ParameterArgumentName:
804 TypeRefName {
805 $$.governor = NULL;
806 $$.argument = $1;
807 }
808 | TypeRefName ':' Identifier {
809 int ret;
810 $$.governor = asn1p_ref_new(yylineno);
811 ret = asn1p_ref_add_component($$.governor, $1, 0);
812 checkmem(ret == 0);
813 $$.argument = $3;
814 }
Lev Walkinc8092cb2005-02-18 16:34:21 +0000815 | TypeRefName ':' TypeRefName {
816 int ret;
817 $$.governor = asn1p_ref_new(yylineno);
818 ret = asn1p_ref_add_component($$.governor, $1, 0);
819 checkmem(ret == 0);
820 $$.argument = $3;
821 }
Lev Walkinf15320b2004-06-03 03:38:44 +0000822 | BasicTypeId ':' Identifier {
823 int ret;
824 $$.governor = asn1p_ref_new(yylineno);
825 ret = asn1p_ref_add_component($$.governor,
826 ASN_EXPR_TYPE2STR($1), 1);
827 checkmem(ret == 0);
828 $$.argument = $3;
829 }
830 ;
831
832ActualParameterList:
833 ActualParameter {
834 $$ = asn1p_expr_new(yylineno);
835 checkmem($$);
Lev Walkin1004aa92004-09-08 00:28:11 +0000836 asn1p_expr_add($$, $1);
Lev Walkinf15320b2004-06-03 03:38:44 +0000837 }
838 | ActualParameterList ',' ActualParameter {
839 $$ = $1;
Lev Walkin1004aa92004-09-08 00:28:11 +0000840 asn1p_expr_add($$, $3);
Lev Walkinf15320b2004-06-03 03:38:44 +0000841 }
842 ;
843
844ActualParameter:
Lev Walkin070a52d2004-08-22 03:19:54 +0000845 Type {
Lev Walkinf15320b2004-06-03 03:38:44 +0000846 $$ = $1;
847 }
848 | Identifier {
849 $$ = asn1p_expr_new(yylineno);
850 checkmem($$);
851 $$->Identifier = $1;
852 $$->expr_type = A1TC_REFERENCE;
853 $$->meta_type = AMT_VALUE;
854 }
855 ;
856
857/*
Lev Walkinc8092cb2005-02-18 16:34:21 +0000858 | '{' ActualParameter '}' {
859 $$ = asn1p_expr_new(yylineno);
860 checkmem($$);
861 asn1p_expr_add($$, $2);
862 $$->expr_type = A1TC_PARAMETRIZED;
863 $$->meta_type = AMT_TYPE;
864 }
865 ;
866*/
867
868/*
Lev Walkinf15320b2004-06-03 03:38:44 +0000869 * A collection of constructed data type members.
870 */
Lev Walkin144db9b2004-10-12 23:26:53 +0000871optComponentTypeLists:
872 { $$ = asn1p_expr_new(yylineno); }
873 | ComponentTypeLists { $$ = $1; };
874
Lev Walkin070a52d2004-08-22 03:19:54 +0000875ComponentTypeLists:
876 ComponentType {
Lev Walkinf15320b2004-06-03 03:38:44 +0000877 $$ = asn1p_expr_new(yylineno);
878 checkmem($$);
Lev Walkin1004aa92004-09-08 00:28:11 +0000879 asn1p_expr_add($$, $1);
Lev Walkinf15320b2004-06-03 03:38:44 +0000880 }
Lev Walkin070a52d2004-08-22 03:19:54 +0000881 | ComponentTypeLists ',' ComponentType {
Lev Walkinf15320b2004-06-03 03:38:44 +0000882 $$ = $1;
Lev Walkin1004aa92004-09-08 00:28:11 +0000883 asn1p_expr_add($$, $3);
Lev Walkinf15320b2004-06-03 03:38:44 +0000884 }
885 ;
886
Lev Walkin070a52d2004-08-22 03:19:54 +0000887ComponentType:
Lev Walkinaf120f72004-09-14 02:36:39 +0000888 Identifier Type optMarker {
Lev Walkin070a52d2004-08-22 03:19:54 +0000889 $$ = $2;
890 assert($$->Identifier == 0);
Lev Walkinaf120f72004-09-14 02:36:39 +0000891 $$->Identifier = $1;
Lev Walkinef625402005-09-05 05:17:57 +0000892 $3.flags |= $$->marker.flags;
Lev Walkin070a52d2004-08-22 03:19:54 +0000893 $$->marker = $3;
894 }
Lev Walkinef625402005-09-05 05:17:57 +0000895 | Type optMarker {
896 $$ = $1;
897 $2.flags |= $$->marker.flags;
898 $$->marker = $2;
899 _fixup_anonymous_identifier($$);
900 }
Lev Walkin070a52d2004-08-22 03:19:54 +0000901 | TOK_COMPONENTS TOK_OF Type {
902 $$ = asn1p_expr_new(yylineno);
903 checkmem($$);
904 $$->meta_type = $3->meta_type;
905 $$->expr_type = A1TC_COMPONENTS_OF;
Lev Walkin1004aa92004-09-08 00:28:11 +0000906 asn1p_expr_add($$, $3);
Lev Walkin070a52d2004-08-22 03:19:54 +0000907 }
908 | ExtensionAndException {
909 $$ = $1;
910 }
911 ;
912
913AlternativeTypeLists:
914 AlternativeType {
915 $$ = asn1p_expr_new(yylineno);
916 checkmem($$);
Lev Walkin1004aa92004-09-08 00:28:11 +0000917 asn1p_expr_add($$, $1);
Lev Walkin070a52d2004-08-22 03:19:54 +0000918 }
919 | AlternativeTypeLists ',' AlternativeType {
920 $$ = $1;
Lev Walkin1004aa92004-09-08 00:28:11 +0000921 asn1p_expr_add($$, $3);
Lev Walkin070a52d2004-08-22 03:19:54 +0000922 }
923 ;
924
925AlternativeType:
Lev Walkinaf120f72004-09-14 02:36:39 +0000926 Identifier Type {
Lev Walkin070a52d2004-08-22 03:19:54 +0000927 $$ = $2;
928 assert($$->Identifier == 0);
Lev Walkinaf120f72004-09-14 02:36:39 +0000929 $$->Identifier = $1;
Lev Walkin070a52d2004-08-22 03:19:54 +0000930 }
931 | ExtensionAndException {
932 $$ = $1;
933 }
Lev Walkin2e9bd5c2005-08-13 09:07:11 +0000934 | Type {
935 $$ = $1;
936 _fixup_anonymous_identifier($$);
937 }
Lev Walkin070a52d2004-08-22 03:19:54 +0000938 ;
939
Lev Walkin9c2285a2006-03-09 08:49:26 +0000940ObjectClass:
941 TOK_CLASS '{' FieldSpec '}' optWithSyntax {
Lev Walkinf15320b2004-06-03 03:38:44 +0000942 $$ = $3;
943 checkmem($$);
944 $$->with_syntax = $5;
945 assert($$->expr_type == A1TC_CLASSDEF);
Lev Walkin9c2285a2006-03-09 08:49:26 +0000946 assert($$->meta_type == AMT_OBJECTCLASS);
Lev Walkinf15320b2004-06-03 03:38:44 +0000947 }
948 ;
949
950optUnique:
951 { $$ = 0; }
952 | TOK_UNIQUE { $$ = 1; }
953 ;
954
Lev Walkin9c2285a2006-03-09 08:49:26 +0000955FieldSpec:
Lev Walkinf15320b2004-06-03 03:38:44 +0000956 ClassField {
957 $$ = asn1p_expr_new(yylineno);
958 checkmem($$);
959 $$->expr_type = A1TC_CLASSDEF;
Lev Walkin9c2285a2006-03-09 08:49:26 +0000960 $$->meta_type = AMT_OBJECTCLASS;
Lev Walkin1004aa92004-09-08 00:28:11 +0000961 asn1p_expr_add($$, $1);
Lev Walkinf15320b2004-06-03 03:38:44 +0000962 }
Lev Walkin9c2285a2006-03-09 08:49:26 +0000963 | FieldSpec ',' ClassField {
Lev Walkinf15320b2004-06-03 03:38:44 +0000964 $$ = $1;
Lev Walkin1004aa92004-09-08 00:28:11 +0000965 asn1p_expr_add($$, $3);
Lev Walkinf15320b2004-06-03 03:38:44 +0000966 }
967 ;
968
Lev Walkin9c2285a2006-03-09 08:49:26 +0000969 /* X.681 */
Lev Walkinf15320b2004-06-03 03:38:44 +0000970ClassField:
Lev Walkin9c2285a2006-03-09 08:49:26 +0000971
972 /* TypeFieldSpec ::= typefieldreference TypeOptionalitySpec? */
973 TOK_typefieldreference optMarker {
Lev Walkinf15320b2004-06-03 03:38:44 +0000974 $$ = asn1p_expr_new(yylineno);
975 checkmem($$);
Lev Walkin9c2285a2006-03-09 08:49:26 +0000976 $$->Identifier = $1;
Lev Walkinf15320b2004-06-03 03:38:44 +0000977 $$->meta_type = AMT_OBJECTFIELD;
Lev Walkin9c2285a2006-03-09 08:49:26 +0000978 $$->expr_type = A1TC_CLASSFIELD_TFS; /* TypeFieldSpec */
Lev Walkinf15320b2004-06-03 03:38:44 +0000979 $$->marker = $2;
980 }
Lev Walkin9c2285a2006-03-09 08:49:26 +0000981
982 /* FixedTypeValueFieldSpec ::= valuefieldreference Type UNIQUE ? ValueOptionalitySpec ? */
983 | TOK_valuefieldreference Type optUnique optMarker {
984 $$ = asn1p_expr_new(yylineno);
985 $$->Identifier = $1;
986 $$->meta_type = AMT_OBJECTFIELD;
987 $$->expr_type = A1TC_CLASSFIELD_FTVFS; /* FixedTypeValueFieldSpec */
Lev Walkinb7c45ca2004-11-24 17:43:29 +0000988 $$->unique = $3;
Lev Walkin9c2285a2006-03-09 08:49:26 +0000989 $$->marker = $4;
990 asn1p_expr_add($$, $2);
Lev Walkinf15320b2004-06-03 03:38:44 +0000991 }
Lev Walkin9c2285a2006-03-09 08:49:26 +0000992
993 /* VariableTypeValueFieldSpec ::= valuefieldreference FieldName ValueOptionalitySpec ? */
994 | TOK_valuefieldreference FieldName optMarker {
995 $$ = asn1p_expr_new(yylineno);
996 $$->Identifier = $1;
997 $$->meta_type = AMT_OBJECTFIELD;
998 $$->expr_type = A1TC_CLASSFIELD_VTVFS;
999 $$->reference = $2;
1000 $$->marker = $3;
1001 }
1002
1003 /* VariableTypeValueSetFieldSpec ::= valuesetfieldreference FieldName ValueOptionalitySpec ? */
1004 | TOK_typefieldreference FieldName optMarker {
1005 $$ = asn1p_expr_new(yylineno);
1006 $$->Identifier = $1;
1007 $$->meta_type = AMT_OBJECTFIELD;
1008 $$->expr_type = A1TC_CLASSFIELD_VTVSFS;
1009 $$->reference = $2;
1010 $$->marker = $3;
1011 }
1012
1013 /* ObjectFieldSpec ::= objectfieldreference DefinedObjectClass ObjectOptionalitySpec ? */
1014 | TOK_valuefieldreference DefinedObjectClass optMarker {
Lev Walkinf15320b2004-06-03 03:38:44 +00001015 $$ = asn1p_expr_new(yylineno);
1016 checkmem($$);
Lev Walkin9c2285a2006-03-09 08:49:26 +00001017 $$->Identifier = $1;
1018 $$->reference = $2;
Lev Walkinf15320b2004-06-03 03:38:44 +00001019 $$->meta_type = AMT_OBJECTFIELD;
Lev Walkin9c2285a2006-03-09 08:49:26 +00001020 $$->expr_type = A1TC_CLASSFIELD_OFS;
1021 $$->marker = $3;
Lev Walkinf15320b2004-06-03 03:38:44 +00001022 }
Lev Walkin9c2285a2006-03-09 08:49:26 +00001023
1024 /* ObjectSetFieldSpec ::= objectsetfieldreference DefinedObjectClass ObjectOptionalitySpec ? */
1025 | TOK_typefieldreference DefinedObjectClass optMarker {
1026 $$ = asn1p_expr_new(yylineno);
1027 checkmem($$);
1028 $$->Identifier = $1;
1029 $$->reference = $2;
1030 $$->meta_type = AMT_OBJECTFIELD;
1031 $$->expr_type = A1TC_CLASSFIELD_OSFS;
1032 $$->marker = $3;
1033 }
1034
1035 /* FixedTypeValueSetFieldSpec ::= valuesetfieldreference Type ValueSetOptionalitySpec ? */
1036 | TOK_typefieldreference Type optMarker {
1037 $$ = asn1p_expr_new(yylineno);
1038 checkmem($$);
1039 $$->Identifier = $1;
1040 $$->meta_type = AMT_OBJECTFIELD;
1041 $$->expr_type = A1TC_CLASSFIELD_FTVSFS;
1042 asn1p_expr_add($$, $2);
1043 $$->marker = $3;
1044 }
1045
1046 /*
1047 DefinedObjectClass:
1048 TOK_capitalreference {
1049 $$ = asn1p_ref_new(yylineno);
1050 asn1p_ref_add_component($$, $1, RLT_CAPITALS);
1051 }
1052 | TypeRefName '.' TOK_capitalreference {
1053 $$ = asn1p_ref_new(yylineno);
1054 asn1p_ref_add_component($$, $1, RLT_AmpUppercase);
1055 asn1p_ref_add_component($$, $3, RLT_CAPITALS);
1056 }
1057 ;
1058 */
1059
Lev Walkinf15320b2004-06-03 03:38:44 +00001060 ;
1061
1062optWithSyntax:
1063 { $$ = 0; }
1064 | WithSyntax {
1065 $$ = $1;
1066 }
1067 ;
1068
1069WithSyntax:
1070 TOK_WITH TOK_SYNTAX '{'
1071 { asn1p_lexer_hack_enable_with_syntax(); }
1072 WithSyntaxFormat
1073 '}' {
1074 $$ = $5;
1075 }
1076 ;
1077
1078WithSyntaxFormat:
1079 WithSyntaxFormatToken {
1080 $$ = asn1p_wsyntx_new();
1081 TQ_ADD(&($$->chunks), $1, next);
1082 }
1083 | WithSyntaxFormat WithSyntaxFormatToken {
1084 $$ = $1;
1085 TQ_ADD(&($$->chunks), $2, next);
1086 }
1087 ;
1088
1089WithSyntaxFormatToken:
1090 TOK_opaque {
1091 $$ = asn1p_wsyntx_chunk_frombuf($1.buf, $1.len, 0);
1092 }
1093 | ClassFieldIdentifier {
1094 asn1p_ref_t *ref;
1095 int ret;
1096 ref = asn1p_ref_new(yylineno);
1097 checkmem(ref);
1098 ret = asn1p_ref_add_component(ref, $1.name, $1.lex_type);
1099 checkmem(ret == 0);
1100 $$ = asn1p_wsyntx_chunk_fromref(ref, 0);
1101 }
1102 ;
1103
Lev Walkinf15320b2004-06-03 03:38:44 +00001104ExtensionAndException:
1105 TOK_ThreeDots {
Lev Walkinceb20e72004-09-05 10:40:41 +00001106 $$ = asn1p_expr_new(yylineno);
Lev Walkinf15320b2004-06-03 03:38:44 +00001107 checkmem($$);
1108 $$->Identifier = strdup("...");
1109 checkmem($$->Identifier);
1110 $$->expr_type = A1TC_EXTENSIBLE;
1111 $$->meta_type = AMT_TYPE;
1112 }
1113 | TOK_ThreeDots '!' DefinedValue {
Lev Walkinceb20e72004-09-05 10:40:41 +00001114 $$ = asn1p_expr_new(yylineno);
Lev Walkinf15320b2004-06-03 03:38:44 +00001115 checkmem($$);
1116 $$->Identifier = strdup("...");
1117 checkmem($$->Identifier);
1118 $$->value = $3;
1119 $$->expr_type = A1TC_EXTENSIBLE;
1120 $$->meta_type = AMT_TYPE;
1121 }
1122 | TOK_ThreeDots '!' SignedNumber {
Lev Walkinceb20e72004-09-05 10:40:41 +00001123 $$ = asn1p_expr_new(yylineno);
Lev Walkinf15320b2004-06-03 03:38:44 +00001124 checkmem($$);
1125 $$->Identifier = strdup("...");
1126 $$->value = $3;
1127 checkmem($$->Identifier);
1128 $$->expr_type = A1TC_EXTENSIBLE;
1129 $$->meta_type = AMT_TYPE;
1130 }
1131 ;
1132
Lev Walkin070a52d2004-08-22 03:19:54 +00001133Type:
Lev Walkinaf120f72004-09-14 02:36:39 +00001134 optTag TypeDeclaration optConstraints {
1135 $$ = $2;
1136 $$->tag = $1;
Lev Walkin070a52d2004-08-22 03:19:54 +00001137 /*
1138 * Outer constraint for SEQUENCE OF and SET OF applies
1139 * to the inner type.
1140 */
1141 if($$->expr_type == ASN_CONSTR_SEQUENCE_OF
1142 || $$->expr_type == ASN_CONSTR_SET_OF) {
1143 assert(!TQ_FIRST(&($$->members))->constraints);
Lev Walkinaf120f72004-09-14 02:36:39 +00001144 TQ_FIRST(&($$->members))->constraints = $3;
Lev Walkin070a52d2004-08-22 03:19:54 +00001145 } else {
1146 if($$->constraints) {
1147 assert(!$2);
1148 } else {
Lev Walkinaf120f72004-09-14 02:36:39 +00001149 $$->constraints = $3;
Lev Walkin070a52d2004-08-22 03:19:54 +00001150 }
1151 }
Lev Walkinef625402005-09-05 05:17:57 +00001152 }
1153 ;
1154
1155NSTD_IndirectMarker:
1156 {
1157 $$ = asn1p_as_pointer ? EM_INDIRECT : 0;
1158 asn1p_as_pointer = 0;
Lev Walkin070a52d2004-08-22 03:19:54 +00001159 }
1160 ;
1161
1162TypeDeclaration:
Lev Walkinef625402005-09-05 05:17:57 +00001163 NSTD_IndirectMarker TypeDeclarationSet {
Lev Walkin4696c742005-08-22 12:23:54 +00001164 $$ = $2;
Lev Walkinef625402005-09-05 05:17:57 +00001165 $$->marker.flags |= $1;
1166
1167 if(($$->marker.flags & EM_INDIRECT)
1168 && ($$->marker.flags & EM_OPTIONAL) != EM_OPTIONAL) {
1169 fprintf(stderr,
1170 "INFO: Directive <ASN1C:RepresentAsPointer> "
1171 "applied to %s at line %d\n",
1172 ASN_EXPR_TYPE2STR($$->expr_type)
1173 ? ASN_EXPR_TYPE2STR($$->expr_type)
1174 : "member",
1175 $$->_lineno
1176 );
1177 }
Lev Walkin4696c742005-08-22 12:23:54 +00001178 }
Lev Walkinef625402005-09-05 05:17:57 +00001179 ;
Lev Walkin4696c742005-08-22 12:23:54 +00001180
1181TypeDeclarationSet:
Lev Walkinf15320b2004-06-03 03:38:44 +00001182 BasicType {
1183 $$ = $1;
1184 }
Lev Walkinef625402005-09-05 05:17:57 +00001185 | TOK_CHOICE '{' AlternativeTypeLists '}' {
Lev Walkin070a52d2004-08-22 03:19:54 +00001186 $$ = $3;
1187 assert($$->expr_type == A1TC_INVALID);
1188 $$->expr_type = ASN_CONSTR_CHOICE;
1189 $$->meta_type = AMT_TYPE;
Lev Walkinf15320b2004-06-03 03:38:44 +00001190 }
Lev Walkinef625402005-09-05 05:17:57 +00001191 | TOK_SEQUENCE '{' optComponentTypeLists '}' {
Lev Walkin070a52d2004-08-22 03:19:54 +00001192 $$ = $3;
1193 assert($$->expr_type == A1TC_INVALID);
1194 $$->expr_type = ASN_CONSTR_SEQUENCE;
1195 $$->meta_type = AMT_TYPE;
1196 }
Lev Walkinef625402005-09-05 05:17:57 +00001197 | TOK_SET '{' optComponentTypeLists '}' {
Lev Walkin070a52d2004-08-22 03:19:54 +00001198 $$ = $3;
1199 assert($$->expr_type == A1TC_INVALID);
1200 $$->expr_type = ASN_CONSTR_SET;
1201 $$->meta_type = AMT_TYPE;
1202 }
Lev Walkin83cac2f2004-09-22 16:03:36 +00001203 | TOK_SEQUENCE optConstraints TOK_OF optIdentifier optTag TypeDeclaration {
Lev Walkinceb20e72004-09-05 10:40:41 +00001204 $$ = asn1p_expr_new(yylineno);
Lev Walkin070a52d2004-08-22 03:19:54 +00001205 checkmem($$);
1206 $$->constraints = $2;
1207 $$->expr_type = ASN_CONSTR_SEQUENCE_OF;
1208 $$->meta_type = AMT_TYPE;
Lev Walkin83cac2f2004-09-22 16:03:36 +00001209 $6->Identifier = $4;
1210 $6->tag = $5;
1211 asn1p_expr_add($$, $6);
Lev Walkin070a52d2004-08-22 03:19:54 +00001212 }
Lev Walkin83cac2f2004-09-22 16:03:36 +00001213 | TOK_SET optConstraints TOK_OF optIdentifier optTag TypeDeclaration {
Lev Walkinceb20e72004-09-05 10:40:41 +00001214 $$ = asn1p_expr_new(yylineno);
Lev Walkin070a52d2004-08-22 03:19:54 +00001215 checkmem($$);
1216 $$->constraints = $2;
1217 $$->expr_type = ASN_CONSTR_SET_OF;
1218 $$->meta_type = AMT_TYPE;
Lev Walkin83cac2f2004-09-22 16:03:36 +00001219 $6->Identifier = $4;
1220 $6->tag = $5;
1221 asn1p_expr_add($$, $6);
Lev Walkin070a52d2004-08-22 03:19:54 +00001222 }
1223 | TOK_ANY {
Lev Walkinceb20e72004-09-05 10:40:41 +00001224 $$ = asn1p_expr_new(yylineno);
Lev Walkin070a52d2004-08-22 03:19:54 +00001225 checkmem($$);
Lev Walkin609ccbb2004-09-04 04:49:21 +00001226 $$->expr_type = ASN_TYPE_ANY;
Lev Walkin070a52d2004-08-22 03:19:54 +00001227 $$->meta_type = AMT_TYPE;
1228 }
1229 | TOK_ANY TOK_DEFINED TOK_BY Identifier {
1230 int ret;
Lev Walkinceb20e72004-09-05 10:40:41 +00001231 $$ = asn1p_expr_new(yylineno);
Lev Walkin070a52d2004-08-22 03:19:54 +00001232 checkmem($$);
1233 $$->reference = asn1p_ref_new(yylineno);
1234 ret = asn1p_ref_add_component($$->reference,
1235 $4, RLT_lowercase);
1236 checkmem(ret == 0);
Lev Walkin609ccbb2004-09-04 04:49:21 +00001237 $$->expr_type = ASN_TYPE_ANY;
Lev Walkin070a52d2004-08-22 03:19:54 +00001238 $$->meta_type = AMT_TYPE;
1239 }
Lev Walkinf15320b2004-06-03 03:38:44 +00001240 /*
1241 * A parametrized assignment.
1242 */
1243 | TypeRefName '{' ActualParameterList '}' {
1244 int ret;
1245 $$ = $3;
1246 assert($$->expr_type == 0);
1247 assert($$->meta_type == 0);
1248 assert($$->reference == 0);
1249 $$->reference = asn1p_ref_new(yylineno);
1250 checkmem($$->reference);
1251 ret = asn1p_ref_add_component($$->reference, $1, RLT_UNKNOWN);
1252 checkmem(ret == 0);
1253 free($1);
1254 $$->expr_type = A1TC_PARAMETRIZED;
1255 $$->meta_type = AMT_TYPE;
1256 }
1257 /*
1258 * A DefinedType reference.
1259 * "CLASS1.&id.&id2"
1260 * or
1261 * "Module.Type"
1262 * or
1263 * "Module.identifier"
1264 * or
1265 * "Type"
1266 */
1267 | ComplexTypeReference {
1268 $$ = asn1p_expr_new(yylineno);
1269 checkmem($$);
1270 $$->reference = $1;
1271 $$->expr_type = A1TC_REFERENCE;
1272 $$->meta_type = AMT_TYPEREF;
1273 }
1274 | TOK_INSTANCE TOK_OF ComplexTypeReference {
1275 $$ = asn1p_expr_new(yylineno);
1276 checkmem($$);
1277 $$->reference = $3;
1278 $$->expr_type = A1TC_INSTANCE;
1279 $$->meta_type = AMT_TYPE;
1280 }
1281 ;
1282
1283/*
1284 * A type name consisting of several components.
1285 * === EXAMPLE ===
1286 * === EOF ===
1287 */
1288ComplexTypeReference:
1289 TOK_typereference {
1290 int ret;
1291 $$ = asn1p_ref_new(yylineno);
1292 checkmem($$);
1293 ret = asn1p_ref_add_component($$, $1, RLT_UNKNOWN);
1294 checkmem(ret == 0);
1295 free($1);
1296 }
1297 | TOK_typereference '.' TypeRefName {
1298 int ret;
1299 $$ = asn1p_ref_new(yylineno);
1300 checkmem($$);
1301 ret = asn1p_ref_add_component($$, $1, RLT_UNKNOWN);
1302 checkmem(ret == 0);
1303 ret = asn1p_ref_add_component($$, $3, RLT_UNKNOWN);
1304 checkmem(ret == 0);
1305 free($1);
1306 }
Lev Walkin9c974182004-09-15 11:59:51 +00001307 | ObjectClassReference '.' TypeRefName {
1308 int ret;
1309 $$ = asn1p_ref_new(yylineno);
1310 checkmem($$);
1311 ret = asn1p_ref_add_component($$, $1, RLT_UNKNOWN);
1312 checkmem(ret == 0);
1313 ret = asn1p_ref_add_component($$, $3, RLT_UNKNOWN);
1314 checkmem(ret == 0);
1315 free($1);
1316 }
Lev Walkinf15320b2004-06-03 03:38:44 +00001317 | TOK_typereference '.' Identifier {
1318 int ret;
1319 $$ = asn1p_ref_new(yylineno);
1320 checkmem($$);
1321 ret = asn1p_ref_add_component($$, $1, RLT_UNKNOWN);
1322 checkmem(ret == 0);
1323 ret = asn1p_ref_add_component($$, $3, RLT_lowercase);
1324 checkmem(ret == 0);
1325 free($1);
1326 }
1327 | ObjectClassReference {
1328 int ret;
1329 $$ = asn1p_ref_new(yylineno);
1330 checkmem($$);
1331 ret = asn1p_ref_add_component($$, $1, RLT_CAPITALS);
1332 free($1);
1333 checkmem(ret == 0);
1334 }
1335 | ObjectClassReference '.' ComplexTypeReferenceAmpList {
1336 int ret;
1337 $$ = $3;
1338 ret = asn1p_ref_add_component($$, $1, RLT_CAPITALS);
1339 free($1);
1340 checkmem(ret == 0);
1341 /*
1342 * Move the last element infront.
1343 */
1344 {
1345 struct asn1p_ref_component_s tmp_comp;
1346 tmp_comp = $$->components[$$->comp_count-1];
1347 memmove(&$$->components[1],
1348 &$$->components[0],
1349 sizeof($$->components[0])
1350 * ($$->comp_count - 1));
1351 $$->components[0] = tmp_comp;
1352 }
1353 }
1354 ;
1355
1356ComplexTypeReferenceAmpList:
1357 ComplexTypeReferenceElement {
1358 int ret;
1359 $$ = asn1p_ref_new(yylineno);
1360 checkmem($$);
1361 ret = asn1p_ref_add_component($$, $1.name, $1.lex_type);
1362 free($1.name);
1363 checkmem(ret == 0);
1364 }
1365 | ComplexTypeReferenceAmpList '.' ComplexTypeReferenceElement {
1366 int ret;
1367 $$ = $1;
1368 ret = asn1p_ref_add_component($$, $3.name, $3.lex_type);
1369 free($3.name);
1370 checkmem(ret == 0);
1371 }
1372 ;
1373
1374ComplexTypeReferenceElement: ClassFieldName;
1375ClassFieldIdentifier: ClassFieldName;
1376
1377ClassFieldName:
1378 /* "&Type1" */
1379 TOK_typefieldreference {
1380 $$.lex_type = RLT_AmpUppercase;
1381 $$.name = $1;
1382 }
1383 /* "&id" */
1384 | TOK_valuefieldreference {
1385 $$.lex_type = RLT_Amplowercase;
1386 $$.name = $1;
1387 }
1388 ;
1389
1390
Lev Walkin9c2285a2006-03-09 08:49:26 +00001391FieldName:
1392 /* "&Type1" */
1393 TOK_typefieldreference {
1394 $$ = asn1p_ref_new(yylineno);
1395 asn1p_ref_add_component($$, $1, RLT_AmpUppercase);
1396 }
1397 | FieldName '.' TOK_typefieldreference {
1398 $$ = $$;
1399 asn1p_ref_add_component($$, $3, RLT_AmpUppercase);
1400 }
1401 | FieldName '.' TOK_valuefieldreference {
1402 $$ = $$;
1403 asn1p_ref_add_component($$, $3, RLT_Amplowercase);
1404 }
1405 ;
1406
1407DefinedObjectClass:
1408 TOK_capitalreference {
1409 $$ = asn1p_ref_new(yylineno);
1410 asn1p_ref_add_component($$, $1, RLT_CAPITALS);
1411 }
1412 | TypeRefName '.' TOK_capitalreference {
1413 $$ = asn1p_ref_new(yylineno);
1414 asn1p_ref_add_component($$, $1, RLT_AmpUppercase);
1415 asn1p_ref_add_component($$, $3, RLT_CAPITALS);
1416 }
1417 ;
1418
1419
Lev Walkinf15320b2004-06-03 03:38:44 +00001420/*
1421 * === EXAMPLE ===
1422 * value INTEGER ::= 1
1423 * === EOF ===
1424 */
1425ValueDefinition:
Lev Walkin9c974182004-09-15 11:59:51 +00001426 Identifier DefinedTypeRef TOK_PPEQ Value {
Lev Walkinf15320b2004-06-03 03:38:44 +00001427 $$ = $2;
1428 assert($$->Identifier == NULL);
1429 $$->Identifier = $1;
1430 $$->meta_type = AMT_VALUE;
1431 $$->value = $4;
1432 }
1433 ;
1434
Lev Walkin9c974182004-09-15 11:59:51 +00001435Value:
1436 Identifier ':' Value {
1437 $$ = asn1p_value_fromint(0);
1438 checkmem($$);
1439 $$->type = ATV_CHOICE_IDENTIFIER;
1440 $$->value.choice_identifier.identifier = $1;
1441 $$->value.choice_identifier.value = $3;
1442 }
Lev Walkincbad2512005-03-24 16:27:02 +00001443 | '{' { asn1p_lexer_hack_push_opaque_state(); } Opaque /* '}' */ {
Lev Walkinf15320b2004-06-03 03:38:44 +00001444 $$ = asn1p_value_frombuf($3.buf, $3.len, 0);
1445 checkmem($$);
1446 $$->type = ATV_UNPARSED;
1447 }
Lev Walkin9c974182004-09-15 11:59:51 +00001448 | TOK_NULL {
1449 $$ = asn1p_value_fromint(0);
1450 checkmem($$);
1451 $$->type = ATV_NULL;
1452 }
1453 | TOK_FALSE {
1454 $$ = asn1p_value_fromint(0);
1455 checkmem($$);
1456 $$->type = ATV_FALSE;
1457 }
1458 | TOK_TRUE {
1459 $$ = asn1p_value_fromint(0);
1460 checkmem($$);
1461 $$->type = ATV_TRUE;
1462 }
Lev Walkinf15320b2004-06-03 03:38:44 +00001463 | TOK_bstring {
1464 $$ = _convert_bitstring2binary($1, 'B');
1465 checkmem($$);
1466 }
1467 | TOK_hstring {
1468 $$ = _convert_bitstring2binary($1, 'H');
1469 checkmem($$);
1470 }
Lev Walkin1e448d32005-03-24 14:26:38 +00001471 | RestrictedCharacterStringValue {
1472 $$ = $$;
Lev Walkinf15320b2004-06-03 03:38:44 +00001473 }
1474 | SignedNumber {
1475 $$ = $1;
1476 }
1477 | DefinedValue {
1478 $$ = $1;
1479 }
1480 ;
1481
1482DefinedValue:
1483 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_lowercase);
1489 checkmem(ret == 0);
1490 $$ = asn1p_value_fromref(ref, 0);
1491 checkmem($$);
1492 free($1);
1493 }
1494 | TypeRefName '.' Identifier {
1495 asn1p_ref_t *ref;
1496 int ret;
1497 ref = asn1p_ref_new(yylineno);
1498 checkmem(ref);
1499 ret = asn1p_ref_add_component(ref, $1, RLT_UNKNOWN);
1500 checkmem(ret == 0);
1501 ret = asn1p_ref_add_component(ref, $3, RLT_lowercase);
1502 checkmem(ret == 0);
1503 $$ = asn1p_value_fromref(ref, 0);
1504 checkmem($$);
1505 free($1);
1506 free($3);
1507 }
1508 ;
1509
Lev Walkin1e448d32005-03-24 14:26:38 +00001510
1511RestrictedCharacterStringValue:
1512 TOK_cstring {
1513 $$ = asn1p_value_frombuf($1.buf, $1.len, 0);
1514 checkmem($$);
1515 }
Lev Walkind9574ae2005-03-24 16:22:35 +00001516 | TOK_tuple {
1517 $$ = asn1p_value_fromint($1);
1518 checkmem($$);
1519 $$->type = ATV_TUPLE;
1520 }
1521 | TOK_quadruple {
1522 $$ = asn1p_value_fromint($1);
1523 checkmem($$);
1524 $$->type = ATV_QUADRUPLE;
1525 }
1526 /*
Lev Walkin1e448d32005-03-24 14:26:38 +00001527 | '{' TOK_number ',' TOK_number '}' {
1528 asn1c_integer_t v = ($2 << 4) + $4;
1529 if($2 > 7) return yyerror("X.680:2003, #37.14 "
1530 "mandates 0..7 range for Tuple's TableColumn");
1531 if($4 > 15) return yyerror("X.680:2003, #37.14 "
1532 "mandates 0..15 range for Tuple's TableRow");
1533 $$ = asn1p_value_fromint(v);
1534 checkmem($$);
1535 $$->type = ATV_TUPLE;
1536 }
1537 | '{' TOK_number ',' TOK_number ',' TOK_number ',' TOK_number '}' {
1538 asn1c_integer_t v = ($2 << 24) | ($4 << 16) | ($6 << 8) | $8;
1539 if($2 > 127) return yyerror("X.680:2003, #37.12 "
1540 "mandates 0..127 range for Quadruple's Group");
1541 if($4 > 255) return yyerror("X.680:2003, #37.12 "
1542 "mandates 0..255 range for Quadruple's Plane");
1543 if($6 > 255) return yyerror("X.680:2003, #37.12 "
1544 "mandates 0..255 range for Quadruple's Row");
1545 if($8 > 255) return yyerror("X.680:2003, #37.12 "
1546 "mandates 0..255 range for Quadruple's Cell");
1547 $$ = asn1p_value_fromint(v);
1548 checkmem($$);
1549 $$->type = ATV_QUADRUPLE;
1550 }
Lev Walkind9574ae2005-03-24 16:22:35 +00001551 */
Lev Walkin1e448d32005-03-24 14:26:38 +00001552 ;
1553
Lev Walkinf15320b2004-06-03 03:38:44 +00001554Opaque:
1555 TOK_opaque {
Lev Walkin1893ddf2005-03-20 14:28:32 +00001556 $$.len = $1.len + 1;
Lev Walkinf15320b2004-06-03 03:38:44 +00001557 $$.buf = malloc($$.len + 1);
1558 checkmem($$.buf);
1559 $$.buf[0] = '{';
Lev Walkin1893ddf2005-03-20 14:28:32 +00001560 memcpy($$.buf + 1, $1.buf, $1.len);
Lev Walkinf15320b2004-06-03 03:38:44 +00001561 $$.buf[$$.len] = '\0';
1562 free($1.buf);
1563 }
1564 | Opaque TOK_opaque {
1565 int newsize = $1.len + $2.len;
1566 char *p = malloc(newsize + 1);
1567 checkmem(p);
1568 memcpy(p , $1.buf, $1.len);
1569 memcpy(p + $1.len, $2.buf, $2.len);
1570 p[newsize] = '\0';
1571 free($1.buf);
1572 free($2.buf);
1573 $$.buf = p;
1574 $$.len = newsize;
1575 }
1576 ;
1577
1578BasicTypeId:
1579 TOK_BOOLEAN { $$ = ASN_BASIC_BOOLEAN; }
1580 | TOK_NULL { $$ = ASN_BASIC_NULL; }
1581 | TOK_REAL { $$ = ASN_BASIC_REAL; }
1582 | BasicTypeId_UniverationCompatible { $$ = $1; }
1583 | TOK_OCTET TOK_STRING { $$ = ASN_BASIC_OCTET_STRING; }
1584 | TOK_OBJECT TOK_IDENTIFIER { $$ = ASN_BASIC_OBJECT_IDENTIFIER; }
1585 | TOK_RELATIVE_OID { $$ = ASN_BASIC_RELATIVE_OID; }
1586 | TOK_EXTERNAL { $$ = ASN_BASIC_EXTERNAL; }
1587 | TOK_EMBEDDED TOK_PDV { $$ = ASN_BASIC_EMBEDDED_PDV; }
1588 | TOK_CHARACTER TOK_STRING { $$ = ASN_BASIC_CHARACTER_STRING; }
1589 | TOK_UTCTime { $$ = ASN_BASIC_UTCTime; }
1590 | TOK_GeneralizedTime { $$ = ASN_BASIC_GeneralizedTime; }
Lev Walkinc7d939d2005-03-20 11:12:40 +00001591 | BasicString { $$ = $1; }
Lev Walkinf15320b2004-06-03 03:38:44 +00001592 ;
1593
1594/*
1595 * A type identifier which may be used with "{ a(1), b(2) }" clause.
1596 */
1597BasicTypeId_UniverationCompatible:
1598 TOK_INTEGER { $$ = ASN_BASIC_INTEGER; }
1599 | TOK_ENUMERATED { $$ = ASN_BASIC_ENUMERATED; }
1600 | TOK_BIT TOK_STRING { $$ = ASN_BASIC_BIT_STRING; }
1601 ;
1602
1603BasicType:
1604 BasicTypeId {
Lev Walkinceb20e72004-09-05 10:40:41 +00001605 $$ = asn1p_expr_new(yylineno);
Lev Walkinf15320b2004-06-03 03:38:44 +00001606 checkmem($$);
1607 $$->expr_type = $1;
1608 $$->meta_type = AMT_TYPE;
1609 }
1610 | BasicTypeId_UniverationCompatible UniverationDefinition {
1611 if($2) {
1612 $$ = $2;
1613 } else {
Lev Walkinceb20e72004-09-05 10:40:41 +00001614 $$ = asn1p_expr_new(yylineno);
Lev Walkinf15320b2004-06-03 03:38:44 +00001615 checkmem($$);
1616 }
1617 $$->expr_type = $1;
1618 $$->meta_type = AMT_TYPE;
1619 }
1620 ;
1621
1622BasicString:
1623 TOK_BMPString { $$ = ASN_STRING_BMPString; }
1624 | TOK_GeneralString {
1625 $$ = ASN_STRING_GeneralString;
Lev Walkin9c974182004-09-15 11:59:51 +00001626 fprintf(stderr, "WARNING: GeneralString is not fully supported\n");
Lev Walkinf15320b2004-06-03 03:38:44 +00001627 }
1628 | TOK_GraphicString {
1629 $$ = ASN_STRING_GraphicString;
Lev Walkin9c974182004-09-15 11:59:51 +00001630 fprintf(stderr, "WARNING: GraphicString is not fully supported\n");
Lev Walkinf15320b2004-06-03 03:38:44 +00001631 }
1632 | TOK_IA5String { $$ = ASN_STRING_IA5String; }
1633 | TOK_ISO646String { $$ = ASN_STRING_ISO646String; }
1634 | TOK_NumericString { $$ = ASN_STRING_NumericString; }
1635 | TOK_PrintableString { $$ = ASN_STRING_PrintableString; }
1636 | TOK_T61String {
1637 $$ = ASN_STRING_T61String;
Lev Walkin9c974182004-09-15 11:59:51 +00001638 fprintf(stderr, "WARNING: T61String is not fully supported\n");
Lev Walkinf15320b2004-06-03 03:38:44 +00001639 }
1640 | TOK_TeletexString { $$ = ASN_STRING_TeletexString; }
1641 | TOK_UniversalString { $$ = ASN_STRING_UniversalString; }
1642 | TOK_UTF8String { $$ = ASN_STRING_UTF8String; }
1643 | TOK_VideotexString {
1644 $$ = ASN_STRING_VideotexString;
Lev Walkin9c974182004-09-15 11:59:51 +00001645 fprintf(stderr, "WARNING: VideotexString is not fully supported\n");
Lev Walkinf15320b2004-06-03 03:38:44 +00001646 }
1647 | TOK_VisibleString { $$ = ASN_STRING_VisibleString; }
1648 | TOK_ObjectDescriptor { $$ = ASN_STRING_ObjectDescriptor; }
1649 ;
1650
Lev Walkind2ea1de2004-08-20 13:25:29 +00001651
Lev Walkinf15320b2004-06-03 03:38:44 +00001652/*
1653 * Data type constraints.
1654 */
Lev Walkinf15320b2004-06-03 03:38:44 +00001655Union: '|' | TOK_UNION;
1656Intersection: '^' | TOK_INTERSECTION;
1657Except: TOK_EXCEPT;
1658
Lev Walkinf59d0752004-08-18 04:59:12 +00001659optConstraints:
1660 { $$ = 0; }
Lev Walkind2ea1de2004-08-20 13:25:29 +00001661 | Constraints {
1662 $$ = $1;
1663 }
1664 ;
1665
1666Constraints:
1667 SetOfConstraints {
Lev Walkin2c14a692005-08-12 10:08:45 +00001668 CONSTRAINT_INSERT($$, ACT_CA_SET, $1, 0);
Lev Walkinf59d0752004-08-18 04:59:12 +00001669 }
1670 | TOK_SIZE '(' ElementSetSpecs ')' {
Lev Walkinf15320b2004-06-03 03:38:44 +00001671 /*
1672 * This is a special case, for compatibility purposes.
Lev Walkinf59d0752004-08-18 04:59:12 +00001673 * It goes without parentheses.
Lev Walkinf15320b2004-06-03 03:38:44 +00001674 */
Lev Walkin2c14a692005-08-12 10:08:45 +00001675 CONSTRAINT_INSERT($$, ACT_CT_SIZE, $3, 0);
Lev Walkinf15320b2004-06-03 03:38:44 +00001676 }
Lev Walkinf15320b2004-06-03 03:38:44 +00001677 ;
1678
Lev Walkinf59d0752004-08-18 04:59:12 +00001679SetOfConstraints:
1680 '(' ElementSetSpecs ')' {
Lev Walkinf15320b2004-06-03 03:38:44 +00001681 $$ = $2;
1682 }
Lev Walkinf59d0752004-08-18 04:59:12 +00001683 | SetOfConstraints '(' ElementSetSpecs ')' {
Lev Walkin2c14a692005-08-12 10:08:45 +00001684 CONSTRAINT_INSERT($$, ACT_CA_SET, $1, $3);
Lev Walkinf59d0752004-08-18 04:59:12 +00001685 }
Lev Walkinf15320b2004-06-03 03:38:44 +00001686 ;
1687
Lev Walkinf59d0752004-08-18 04:59:12 +00001688ElementSetSpecs:
1689 ElementSetSpec {
Lev Walkinf15320b2004-06-03 03:38:44 +00001690 $$ = $1;
1691 }
Lev Walkinf59d0752004-08-18 04:59:12 +00001692 | ElementSetSpec ',' TOK_ThreeDots {
Lev Walkinf15320b2004-06-03 03:38:44 +00001693 asn1p_constraint_t *ct;
1694 ct = asn1p_constraint_new(yylineno);
Lev Walkinf15320b2004-06-03 03:38:44 +00001695 ct->type = ACT_EL_EXT;
Lev Walkin2c14a692005-08-12 10:08:45 +00001696 CONSTRAINT_INSERT($$, ACT_CA_CSV, $1, ct);
Lev Walkinf15320b2004-06-03 03:38:44 +00001697 }
Lev Walkinf59d0752004-08-18 04:59:12 +00001698 | ElementSetSpec ',' TOK_ThreeDots ',' ElementSetSpec {
Lev Walkinf15320b2004-06-03 03:38:44 +00001699 asn1p_constraint_t *ct;
1700 ct = asn1p_constraint_new(yylineno);
Lev Walkinf15320b2004-06-03 03:38:44 +00001701 ct->type = ACT_EL_EXT;
Lev Walkin2c14a692005-08-12 10:08:45 +00001702 CONSTRAINT_INSERT($$, ACT_CA_CSV, $1, ct);
Lev Walkinb4fcdd22004-08-13 12:35:09 +00001703 ct = $$;
Lev Walkin2c14a692005-08-12 10:08:45 +00001704 CONSTRAINT_INSERT($$, ACT_CA_CSV, ct, $5);
Lev Walkinf15320b2004-06-03 03:38:44 +00001705 }
Lev Walkinf15320b2004-06-03 03:38:44 +00001706 ;
1707
Lev Walkinf59d0752004-08-18 04:59:12 +00001708ElementSetSpec:
1709 ConstraintSubtypeElement {
1710 $$ = $1;
1711 }
Lev Walkin1e448d32005-03-24 14:26:38 +00001712 | TOK_ALL TOK_EXCEPT ConstraintSubtypeElement {
Lev Walkin2c14a692005-08-12 10:08:45 +00001713 CONSTRAINT_INSERT($$, ACT_CA_AEX, $3, 0);
Lev Walkin1e448d32005-03-24 14:26:38 +00001714 }
Lev Walkinf59d0752004-08-18 04:59:12 +00001715 | ElementSetSpec Union ConstraintSubtypeElement {
Lev Walkin2c14a692005-08-12 10:08:45 +00001716 CONSTRAINT_INSERT($$, ACT_CA_UNI, $1, $3);
Lev Walkinf15320b2004-06-03 03:38:44 +00001717 }
Lev Walkinf59d0752004-08-18 04:59:12 +00001718 | ElementSetSpec Intersection ConstraintSubtypeElement {
Lev Walkin2c14a692005-08-12 10:08:45 +00001719 CONSTRAINT_INSERT($$, ACT_CA_INT, $1, $3);
Lev Walkinf15320b2004-06-03 03:38:44 +00001720 }
Lev Walkinf59d0752004-08-18 04:59:12 +00001721 | ConstraintSubtypeElement Except ConstraintSubtypeElement {
Lev Walkin2c14a692005-08-12 10:08:45 +00001722 CONSTRAINT_INSERT($$, ACT_CA_EXC, $1, $3);
Lev Walkinf15320b2004-06-03 03:38:44 +00001723 }
1724 ;
1725
1726ConstraintSubtypeElement:
Lev Walkinf59d0752004-08-18 04:59:12 +00001727 ConstraintSpec '(' ElementSetSpecs ')' {
1728 int ret;
1729 $$ = asn1p_constraint_new(yylineno);
1730 checkmem($$);
1731 $$->type = $1;
1732 ret = asn1p_constraint_insert($$, $3);
1733 checkmem(ret == 0);
1734 }
1735 | '(' ElementSetSpecs ')' {
1736 int ret;
1737 $$ = asn1p_constraint_new(yylineno);
1738 checkmem($$);
1739 $$->type = ACT_CA_SET;
1740 ret = asn1p_constraint_insert($$, $2);
1741 checkmem(ret == 0);
1742 }
Lev Walkinff7dd142005-03-20 12:58:00 +00001743 | SingleValue {
Lev Walkinf15320b2004-06-03 03:38:44 +00001744 $$ = asn1p_constraint_new(yylineno);
1745 checkmem($$);
1746 $$->type = ACT_EL_VALUE;
1747 $$->value = $1;
1748 }
Lev Walkinff7dd142005-03-20 12:58:00 +00001749 | ContainedSubtype {
1750 $$ = asn1p_constraint_new(yylineno);
1751 checkmem($$);
1752 $$->type = ACT_EL_TYPE;
1753 $$->containedSubtype = $1;
1754 }
1755 | SingleValue ConstraintRangeSpec SingleValue {
Lev Walkinf15320b2004-06-03 03:38:44 +00001756 $$ = asn1p_constraint_new(yylineno);
1757 checkmem($$);
1758 $$->type = $2;
1759 $$->range_start = $1;
1760 $$->range_stop = $3;
1761 }
Lev Walkinff7dd142005-03-20 12:58:00 +00001762 | TOK_MIN ConstraintRangeSpec SingleValue {
Lev Walkinf15320b2004-06-03 03:38:44 +00001763 $$ = asn1p_constraint_new(yylineno);
1764 checkmem($$);
Lev Walkinf59d0752004-08-18 04:59:12 +00001765 $$->type = $2;
1766 $$->range_start = asn1p_value_fromint(-123);
1767 $$->range_stop = $3;
1768 $$->range_start->type = ATV_MIN;
1769 }
Lev Walkinff7dd142005-03-20 12:58:00 +00001770 | SingleValue ConstraintRangeSpec TOK_MAX {
Lev Walkinf59d0752004-08-18 04:59:12 +00001771 $$ = asn1p_constraint_new(yylineno);
1772 checkmem($$);
1773 $$->type = $2;
1774 $$->range_start = $1;
1775 $$->range_stop = asn1p_value_fromint(321);
1776 $$->range_stop->type = ATV_MAX;
1777 }
1778 | TOK_MIN ConstraintRangeSpec TOK_MAX {
1779 $$ = asn1p_constraint_new(yylineno);
1780 checkmem($$);
1781 $$->type = $2;
1782 $$->range_start = asn1p_value_fromint(-123);
1783 $$->range_stop = asn1p_value_fromint(321);
1784 $$->range_start->type = ATV_MIN;
1785 $$->range_stop->type = ATV_MAX;
Lev Walkinf15320b2004-06-03 03:38:44 +00001786 }
1787 | TableConstraint {
1788 $$ = $1;
1789 }
Lev Walkine596bf02005-03-28 15:01:27 +00001790 | InnerTypeConstraint {
Lev Walkinf15320b2004-06-03 03:38:44 +00001791 $$ = $1;
1792 }
Lev Walkin1893ddf2005-03-20 14:28:32 +00001793 | TOK_CONSTRAINED TOK_BY '{'
1794 { asn1p_lexer_hack_push_opaque_state(); } Opaque /* '}' */ {
1795 $$ = asn1p_constraint_new(yylineno);
1796 checkmem($$);
1797 $$->type = ACT_CT_CTDBY;
1798 $$->value = asn1p_value_frombuf($5.buf, $5.len, 0);
1799 checkmem($$->value);
1800 $$->value->type = ATV_UNPARSED;
1801 }
Lev Walkinf15320b2004-06-03 03:38:44 +00001802 ;
1803
1804ConstraintRangeSpec:
1805 TOK_TwoDots { $$ = ACT_EL_RANGE; }
1806 | TOK_TwoDots '<' { $$ = ACT_EL_RLRANGE; }
1807 | '<' TOK_TwoDots { $$ = ACT_EL_LLRANGE; }
1808 | '<' TOK_TwoDots '<' { $$ = ACT_EL_ULRANGE; }
1809 ;
1810
1811ConstraintSpec:
1812 TOK_SIZE {
1813 $$ = ACT_CT_SIZE;
1814 }
1815 | TOK_FROM {
1816 $$ = ACT_CT_FROM;
1817 }
1818 ;
1819
Lev Walkinff7dd142005-03-20 12:58:00 +00001820SingleValue:
Lev Walkinc8092cb2005-02-18 16:34:21 +00001821 TOK_FALSE {
1822 $$ = asn1p_value_fromint(0);
1823 checkmem($$);
1824 $$->type = ATV_FALSE;
1825 }
1826 | TOK_TRUE {
1827 $$ = asn1p_value_fromint(1);
1828 checkmem($$);
1829 $$->type = ATV_TRUE;
1830 }
1831 | SignedNumber {
Lev Walkinf15320b2004-06-03 03:38:44 +00001832 $$ = $1;
1833 }
Lev Walkin1e448d32005-03-24 14:26:38 +00001834 | RestrictedCharacterStringValue {
1835 $$ = $1;
Lev Walkinc8092cb2005-02-18 16:34:21 +00001836 }
Lev Walkinf15320b2004-06-03 03:38:44 +00001837 | Identifier {
1838 asn1p_ref_t *ref;
1839 int ret;
1840 ref = asn1p_ref_new(yylineno);
1841 checkmem(ref);
1842 ret = asn1p_ref_add_component(ref, $1, RLT_lowercase);
1843 checkmem(ret == 0);
1844 $$ = asn1p_value_fromref(ref, 0);
1845 checkmem($$);
1846 free($1);
1847 }
Lev Walkinff7dd142005-03-20 12:58:00 +00001848 ;
1849
1850ContainedSubtype:
1851 TypeRefName {
Lev Walkinc8092cb2005-02-18 16:34:21 +00001852 asn1p_ref_t *ref;
1853 int ret;
1854 ref = asn1p_ref_new(yylineno);
1855 checkmem(ref);
1856 ret = asn1p_ref_add_component(ref, $1, RLT_UNKNOWN);
1857 checkmem(ret == 0);
1858 $$ = asn1p_value_fromref(ref, 0);
Lev Walkinf15320b2004-06-03 03:38:44 +00001859 checkmem($$);
Lev Walkinc8092cb2005-02-18 16:34:21 +00001860 free($1);
Lev Walkinf15320b2004-06-03 03:38:44 +00001861 }
1862 ;
1863
Lev Walkine596bf02005-03-28 15:01:27 +00001864InnerTypeConstraint:
1865 TOK_WITH TOK_COMPONENT SetOfConstraints {
Lev Walkin2c14a692005-08-12 10:08:45 +00001866 CONSTRAINT_INSERT($$, ACT_CT_WCOMP, $3, 0);
Lev Walkine596bf02005-03-28 15:01:27 +00001867 }
1868 | TOK_WITH TOK_COMPONENTS '{' WithComponentsList '}' {
Lev Walkin2c14a692005-08-12 10:08:45 +00001869 CONSTRAINT_INSERT($$, ACT_CT_WCOMPS, $4, 0);
Lev Walkinf15320b2004-06-03 03:38:44 +00001870 }
1871 ;
1872
1873WithComponentsList:
1874 WithComponentsElement {
1875 $$ = $1;
1876 }
1877 | WithComponentsList ',' WithComponentsElement {
Lev Walkin2c14a692005-08-12 10:08:45 +00001878 CONSTRAINT_INSERT($$, ACT_CT_WCOMPS, $1, $3);
Lev Walkinf15320b2004-06-03 03:38:44 +00001879 }
1880 ;
1881
1882WithComponentsElement:
1883 TOK_ThreeDots {
1884 $$ = asn1p_constraint_new(yylineno);
1885 checkmem($$);
1886 $$->type = ACT_EL_EXT;
Lev Walkine596bf02005-03-28 15:01:27 +00001887 $$->value = asn1p_value_frombuf("...", 3, 0);
Lev Walkinf15320b2004-06-03 03:38:44 +00001888 }
1889 | Identifier optConstraints optPresenceConstraint {
1890 $$ = asn1p_constraint_new(yylineno);
1891 checkmem($$);
1892 $$->type = ACT_EL_VALUE;
1893 $$->value = asn1p_value_frombuf($1, strlen($1), 0);
1894 $$->presence = $3;
Lev Walkine596bf02005-03-28 15:01:27 +00001895 if($2) asn1p_constraint_insert($$, $2);
Lev Walkinf15320b2004-06-03 03:38:44 +00001896 }
1897 ;
1898
1899/*
1900 * presence constraint for WithComponents
1901 */
1902optPresenceConstraint:
1903 { $$ = ACPRES_DEFAULT; }
1904 | PresenceConstraint { $$ = $1; }
1905 ;
1906
1907PresenceConstraint:
1908 TOK_PRESENT {
1909 $$ = ACPRES_PRESENT;
1910 }
1911 | TOK_ABSENT {
1912 $$ = ACPRES_ABSENT;
1913 }
1914 | TOK_OPTIONAL {
1915 $$ = ACPRES_OPTIONAL;
1916 }
1917 ;
1918
1919TableConstraint:
1920 SimpleTableConstraint {
1921 $$ = $1;
1922 }
1923 | ComponentRelationConstraint {
1924 $$ = $1;
1925 }
1926 ;
1927
1928/*
1929 * "{ExtensionSet}"
1930 */
1931SimpleTableConstraint:
1932 '{' TypeRefName '}' {
1933 asn1p_ref_t *ref = asn1p_ref_new(yylineno);
1934 asn1p_constraint_t *ct;
1935 int ret;
1936 ret = asn1p_ref_add_component(ref, $2, 0);
1937 checkmem(ret == 0);
1938 ct = asn1p_constraint_new(yylineno);
1939 checkmem($$);
1940 ct->type = ACT_EL_VALUE;
1941 ct->value = asn1p_value_fromref(ref, 0);
Lev Walkin2c14a692005-08-12 10:08:45 +00001942 CONSTRAINT_INSERT($$, ACT_CA_CRC, ct, 0);
Lev Walkinf15320b2004-06-03 03:38:44 +00001943 }
1944 ;
1945
1946ComponentRelationConstraint:
1947 SimpleTableConstraint '{' AtNotationList '}' {
Lev Walkin2c14a692005-08-12 10:08:45 +00001948 CONSTRAINT_INSERT($$, ACT_CA_CRC, $1, $3);
Lev Walkinf15320b2004-06-03 03:38:44 +00001949 }
1950 ;
1951
1952AtNotationList:
1953 AtNotationElement {
1954 $$ = asn1p_constraint_new(yylineno);
1955 checkmem($$);
1956 $$->type = ACT_EL_VALUE;
1957 $$->value = asn1p_value_fromref($1, 0);
1958 }
1959 | AtNotationList ',' AtNotationElement {
1960 asn1p_constraint_t *ct;
1961 ct = asn1p_constraint_new(yylineno);
1962 checkmem(ct);
1963 ct->type = ACT_EL_VALUE;
1964 ct->value = asn1p_value_fromref($3, 0);
Lev Walkin2c14a692005-08-12 10:08:45 +00001965 CONSTRAINT_INSERT($$, ACT_CA_CSV, $1, ct);
Lev Walkinf15320b2004-06-03 03:38:44 +00001966 }
1967 ;
1968
1969/*
1970 * @blah
1971 */
1972AtNotationElement:
1973 '@' ComponentIdList {
1974 char *p = malloc(strlen($2) + 2);
1975 int ret;
1976 *p = '@';
1977 strcpy(p + 1, $2);
1978 $$ = asn1p_ref_new(yylineno);
1979 ret = asn1p_ref_add_component($$, p, 0);
1980 checkmem(ret == 0);
1981 free(p);
1982 free($2);
1983 }
1984 | '@' '.' ComponentIdList {
1985 char *p = malloc(strlen($3) + 3);
1986 int ret;
1987 p[0] = '@';
1988 p[1] = '.';
1989 strcpy(p + 2, $3);
1990 $$ = asn1p_ref_new(yylineno);
1991 ret = asn1p_ref_add_component($$, p, 0);
1992 checkmem(ret == 0);
1993 free(p);
1994 free($3);
1995 }
1996 ;
1997
1998/* identifier "." ... */
1999ComponentIdList:
2000 Identifier {
2001 $$ = $1;
2002 }
2003 | ComponentIdList '.' Identifier {
2004 int l1 = strlen($1);
2005 int l3 = strlen($3);
2006 $$ = malloc(l1 + 1 + l3 + 1);
2007 memcpy($$, $1, l1);
2008 $$[l1] = '.';
2009 memcpy($$ + l1 + 1, $3, l3);
2010 $$[l1 + 1 + l3] = '\0';
2011 }
2012 ;
2013
2014
2015
2016/*
2017 * MARKERS
2018 */
2019
2020optMarker:
Lev Walkin9c974182004-09-15 11:59:51 +00002021 {
2022 $$.flags = EM_NOMARK;
2023 $$.default_value = 0;
2024 }
Lev Walkinf15320b2004-06-03 03:38:44 +00002025 | Marker { $$ = $1; }
2026 ;
2027
2028Marker:
2029 TOK_OPTIONAL {
Lev Walkin70853052005-11-26 11:21:55 +00002030 $$.flags = EM_OPTIONAL | EM_INDIRECT;
Lev Walkin9c974182004-09-15 11:59:51 +00002031 $$.default_value = 0;
Lev Walkinf15320b2004-06-03 03:38:44 +00002032 }
Lev Walkin9c974182004-09-15 11:59:51 +00002033 | TOK_DEFAULT Value {
2034 $$.flags = EM_DEFAULT;
2035 $$.default_value = $2;
Lev Walkinf15320b2004-06-03 03:38:44 +00002036 }
2037 ;
2038
2039/*
2040 * Universal enumeration definition to use in INTEGER and ENUMERATED.
2041 * === EXAMPLE ===
2042 * Gender ::= ENUMERATED { unknown(0), male(1), female(2) }
2043 * Temperature ::= INTEGER { absolute-zero(-273), freezing(0), boiling(100) }
2044 * === EOF ===
2045 */
2046/*
2047optUniverationDefinition:
2048 { $$ = 0; }
2049 | UniverationDefinition {
2050 $$ = $1;
2051 }
2052 ;
2053*/
2054
2055UniverationDefinition:
2056 '{' '}' {
Lev Walkinceb20e72004-09-05 10:40:41 +00002057 $$ = asn1p_expr_new(yylineno);
Lev Walkinf15320b2004-06-03 03:38:44 +00002058 checkmem($$);
2059 }
2060 | '{' UniverationList '}' {
2061 $$ = $2;
2062 }
2063 ;
2064
2065UniverationList:
2066 UniverationElement {
Lev Walkinceb20e72004-09-05 10:40:41 +00002067 $$ = asn1p_expr_new(yylineno);
Lev Walkinf15320b2004-06-03 03:38:44 +00002068 checkmem($$);
Lev Walkin1004aa92004-09-08 00:28:11 +00002069 asn1p_expr_add($$, $1);
Lev Walkinf15320b2004-06-03 03:38:44 +00002070 }
2071 | UniverationList ',' UniverationElement {
2072 $$ = $1;
Lev Walkin1004aa92004-09-08 00:28:11 +00002073 asn1p_expr_add($$, $3);
Lev Walkinf15320b2004-06-03 03:38:44 +00002074 }
2075 ;
2076
2077UniverationElement:
2078 Identifier {
Lev Walkinceb20e72004-09-05 10:40:41 +00002079 $$ = asn1p_expr_new(yylineno);
Lev Walkinf15320b2004-06-03 03:38:44 +00002080 checkmem($$);
2081 $$->expr_type = A1TC_UNIVERVAL;
2082 $$->meta_type = AMT_VALUE;
2083 $$->Identifier = $1;
2084 }
2085 | Identifier '(' SignedNumber ')' {
Lev Walkinceb20e72004-09-05 10:40:41 +00002086 $$ = asn1p_expr_new(yylineno);
Lev Walkinf15320b2004-06-03 03:38:44 +00002087 checkmem($$);
2088 $$->expr_type = A1TC_UNIVERVAL;
2089 $$->meta_type = AMT_VALUE;
2090 $$->Identifier = $1;
2091 $$->value = $3;
2092 }
2093 | Identifier '(' DefinedValue ')' {
Lev Walkinceb20e72004-09-05 10:40:41 +00002094 $$ = asn1p_expr_new(yylineno);
Lev Walkinf15320b2004-06-03 03:38:44 +00002095 checkmem($$);
2096 $$->expr_type = A1TC_UNIVERVAL;
2097 $$->meta_type = AMT_VALUE;
2098 $$->Identifier = $1;
2099 $$->value = $3;
2100 }
2101 | SignedNumber {
Lev Walkinceb20e72004-09-05 10:40:41 +00002102 $$ = asn1p_expr_new(yylineno);
Lev Walkinf15320b2004-06-03 03:38:44 +00002103 checkmem($$);
2104 $$->expr_type = A1TC_UNIVERVAL;
2105 $$->meta_type = AMT_VALUE;
2106 $$->value = $1;
2107 }
2108 | TOK_ThreeDots {
Lev Walkinceb20e72004-09-05 10:40:41 +00002109 $$ = asn1p_expr_new(yylineno);
Lev Walkinf15320b2004-06-03 03:38:44 +00002110 checkmem($$);
2111 $$->Identifier = strdup("...");
2112 checkmem($$->Identifier);
2113 $$->expr_type = A1TC_EXTENSIBLE;
2114 $$->meta_type = AMT_VALUE;
2115 }
2116 ;
2117
2118SignedNumber:
2119 TOK_number {
2120 $$ = asn1p_value_fromint($1);
2121 checkmem($$);
2122 }
2123 | TOK_number_negative {
2124 $$ = asn1p_value_fromint($1);
2125 checkmem($$);
2126 }
2127 ;
2128
2129/*
2130 * SEQUENCE definition.
2131 * === EXAMPLE ===
2132 * Struct1 ::= SEQUENCE {
2133 * memb1 Struct2,
2134 * memb2 SEQUENCE OF {
2135 * memb2-1 Struct 3
2136 * }
2137 * }
2138 * === EOF ===
2139 */
2140
2141
2142
2143/*
2144 * SET definition.
2145 * === EXAMPLE ===
2146 * Person ::= SET {
2147 * name [0] PrintableString (SIZE(1..20)),
2148 * country [1] PrintableString (SIZE(1..20)) DEFAULT default-country,
2149 * }
2150 * === EOF ===
2151 */
2152
2153optTag:
2154 { memset(&$$, 0, sizeof($$)); }
2155 | Tag { $$ = $1; }
2156 ;
2157
2158Tag:
Lev Walkinc603f102005-01-23 09:51:44 +00002159 TagTypeValue TagPlicit {
Lev Walkinf15320b2004-06-03 03:38:44 +00002160 $$ = $1;
Lev Walkinc603f102005-01-23 09:51:44 +00002161 $$.tag_mode = $2.tag_mode;
Lev Walkinf15320b2004-06-03 03:38:44 +00002162 }
Lev Walkinc603f102005-01-23 09:51:44 +00002163 ;
2164
2165TagTypeValue:
2166 '[' TagClass TOK_number ']' {
2167 $$ = $2;
2168 $$.tag_value = $3;
2169 };
2170
2171TagClass:
2172 { $$.tag_class = TC_CONTEXT_SPECIFIC; }
2173 | TOK_UNIVERSAL { $$.tag_class = TC_UNIVERSAL; }
2174 | TOK_APPLICATION { $$.tag_class = TC_APPLICATION; }
2175 | TOK_PRIVATE { $$.tag_class = TC_PRIVATE; }
2176 ;
2177
2178TagPlicit:
2179 { $$.tag_mode = TM_DEFAULT; }
2180 | TOK_IMPLICIT { $$.tag_mode = TM_IMPLICIT; }
2181 | TOK_EXPLICIT { $$.tag_mode = TM_EXPLICIT; }
Lev Walkinf15320b2004-06-03 03:38:44 +00002182 ;
2183
2184TypeRefName:
2185 TOK_typereference {
2186 checkmem($1);
2187 $$ = $1;
2188 }
Lev Walkinf59d0752004-08-18 04:59:12 +00002189 | TOK_capitalreference {
Lev Walkinf15320b2004-06-03 03:38:44 +00002190 checkmem($1);
2191 $$ = $1;
2192 }
2193 ;
2194
Lev Walkinf59d0752004-08-18 04:59:12 +00002195
Lev Walkinf15320b2004-06-03 03:38:44 +00002196ObjectClassReference:
Lev Walkinf59d0752004-08-18 04:59:12 +00002197 TOK_capitalreference {
Lev Walkinf15320b2004-06-03 03:38:44 +00002198 checkmem($1);
2199 $$ = $1;
2200 }
2201 ;
2202
Lev Walkin83cac2f2004-09-22 16:03:36 +00002203optIdentifier:
2204 { $$ = 0; }
2205 | Identifier {
2206 $$ = $1;
2207 }
Lev Walkin8f294e02005-06-06 08:28:58 +00002208 ;
Lev Walkin83cac2f2004-09-22 16:03:36 +00002209
Lev Walkinf15320b2004-06-03 03:38:44 +00002210Identifier:
2211 TOK_identifier {
2212 checkmem($1);
2213 $$ = $1;
2214 }
2215 ;
2216
Lev Walkinf15320b2004-06-03 03:38:44 +00002217%%
2218
2219
2220/*
2221 * Convert Xstring ('0101'B or '5'H) to the binary vector.
2222 */
2223static asn1p_value_t *
2224_convert_bitstring2binary(char *str, int base) {
2225 asn1p_value_t *val;
2226 int slen;
2227 int memlen;
2228 int baselen;
2229 int bits;
2230 uint8_t *binary_vector;
2231 uint8_t *bv_ptr;
2232 uint8_t cur_val;
2233
2234 assert(str);
2235 assert(str[0] == '\'');
2236
2237 switch(base) {
2238 case 'B':
2239 baselen = 1;
2240 break;
2241 case 'H':
2242 baselen = 4;
2243 break;
2244 default:
2245 assert(base == 'B' || base == 'H');
2246 errno = EINVAL;
2247 return NULL;
2248 }
2249
2250 slen = strlen(str);
2251 assert(str[slen - 1] == base);
2252 assert(str[slen - 2] == '\'');
2253
2254 memlen = slen / (8 / baselen); /* Conservative estimate */
2255
2256 bv_ptr = binary_vector = malloc(memlen + 1);
2257 if(bv_ptr == NULL)
2258 /* ENOMEM */
2259 return NULL;
2260
2261 cur_val = 0;
2262 bits = 0;
2263 while(*(++str) != '\'') {
2264 switch(baselen) {
2265 case 1:
2266 switch(*str) {
2267 case '1':
2268 cur_val |= 1 << (7 - (bits % 8));
2269 case '0':
2270 break;
2271 default:
2272 assert(!"_y UNREACH1");
2273 case ' ': case '\r': case '\n':
2274 continue;
2275 }
2276 break;
2277 case 4:
2278 switch(*str) {
2279 case '0': case '1': case '2': case '3': case '4':
2280 case '5': case '6': case '7': case '8': case '9':
2281 cur_val |= (*str - '0') << (4 - (bits % 8));
2282 break;
2283 case 'A': case 'B': case 'C':
2284 case 'D': case 'E': case 'F':
2285 cur_val |= ((*str - 'A') + 10)
2286 << (4 - (bits % 8));
2287 break;
2288 default:
2289 assert(!"_y UNREACH2");
2290 case ' ': case '\r': case '\n':
2291 continue;
2292 }
2293 break;
2294 }
2295
2296 bits += baselen;
2297 if((bits % 8) == 0) {
2298 *bv_ptr++ = cur_val;
2299 cur_val = 0;
2300 }
2301 }
2302
2303 *bv_ptr = cur_val;
2304 assert((bv_ptr - binary_vector) <= memlen);
2305
2306 val = asn1p_value_frombits(binary_vector, bits, 0);
2307 if(val == NULL) {
2308 free(binary_vector);
2309 }
2310
2311 return val;
2312}
2313
Lev Walkin2e9bd5c2005-08-13 09:07:11 +00002314/*
2315 * For unnamed types (used in old X.208 compliant modules)
2316 * generate some sort of interim names, to not to force human being to fix
2317 * the specification's compliance to modern ASN.1 standards.
2318 */
2319static void
2320_fixup_anonymous_identifier(asn1p_expr_t *expr) {
2321 char *p;
2322 assert(expr->Identifier == 0);
2323
2324 /*
2325 * Try to figure out the type name
2326 * without going too much into details
2327 */
2328 expr->Identifier = ASN_EXPR_TYPE2STR(expr->expr_type);
2329 if(expr->reference && expr->reference->comp_count > 0)
2330 expr->Identifier = expr->reference->components[0].name;
2331
2332 fprintf(stderr,
2333 "WARNING: Line %d: expected lower-case member identifier, "
2334 "found an unnamed %s.\n"
2335 "WARNING: Obsolete X.208 syntax detected, "
2336 "please give the member a name.\n",
2337 yylineno, expr->Identifier ? expr->Identifier : "type");
2338
2339 if(!expr->Identifier)
2340 expr->Identifier = "unnamed";
2341 expr->Identifier = strdup(expr->Identifier);
2342 assert(expr->Identifier);
2343 /* Make a lowercase identifier from the type name */
2344 for(p = expr->Identifier; *p; p++) {
2345 switch(*p) {
2346 case 'A' ... 'Z': *p += 32; break;
2347 case ' ': *p = '_'; break;
2348 case '-': *p = '_'; break;
2349 }
2350 }
2351 fprintf(stderr, "NOTE: Assigning temporary identifier \"%s\". "
2352 "Name clash may occur later.\n",
2353 expr->Identifier);
2354}
2355
Lev Walkinf15320b2004-06-03 03:38:44 +00002356extern char *asn1p_text;
2357
2358int
2359yyerror(const char *msg) {
2360 fprintf(stderr,
2361 "ASN.1 grammar parse error "
2362 "near line %d (token \"%s\"): %s\n",
Lev Walkinceb20e72004-09-05 10:40:41 +00002363 yylineno, asn1p_text, msg);
Lev Walkinf15320b2004-06-03 03:38:44 +00002364 return -1;
2365}
2366
2367