better support for subtype constraints and parametrization

git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@255 59561ff5-6e30-0410-9f3c-9617f08c8826
This commit is contained in:
vlm 2004-09-05 10:40:41 +00:00
parent 36a76d6304
commit 39e5ed7da0
4 changed files with 2551 additions and 3297 deletions

View File

@ -14,12 +14,12 @@ typedef struct asn1p_value_s {
enum {
ATV_NOVALUE,
ATV_REFERENCED,
ATV_REAL,
ATV_INTEGER,
ATV_MIN,
ATV_REAL,
ATV_MAX,
ATV_FALSE,
ATV_MIN,
ATV_TRUE,
ATV_FALSE,
ATV_STRING,
ATV_UNPARSED,
ATV_BITVECTOR,

File diff suppressed because it is too large Load Diff

View File

@ -1,243 +1,3 @@
/* A Bison parser, made from asn1p_y.y, by GNU bison 1.75. */
/* Skeleton parser for Yacc-like parsing with Bison,
Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* As a special exception, when this file is copied by Bison into a
Bison output file, you may use that output file without restriction.
This special exception was added by the Free Software Foundation
in version 1.24 of Bison. */
#ifndef BISON_ASN_P_Y_H
# define BISON_ASN_P_Y_H
/* Tokens. */
#ifndef YYTOKENTYPE
# define YYTOKENTYPE
/* Put the tokens into the symbol table, so that GDB and other debuggers
know about them. */
enum yytokentype {
TOK_PPEQ = 258,
TOK_opaque = 259,
TOK_bstring = 260,
TOK_cstring = 261,
TOK_hstring = 262,
TOK_identifier = 263,
TOK_number = 264,
TOK_number_negative = 265,
TOK_typereference = 266,
TOK_capitalreference = 267,
TOK_typefieldreference = 268,
TOK_valuefieldreference = 269,
TOK_ABSENT = 270,
TOK_ABSTRACT_SYNTAX = 271,
TOK_ALL = 272,
TOK_ANY = 273,
TOK_APPLICATION = 274,
TOK_AUTOMATIC = 275,
TOK_BEGIN = 276,
TOK_BIT = 277,
TOK_BMPString = 278,
TOK_BOOLEAN = 279,
TOK_BY = 280,
TOK_CHARACTER = 281,
TOK_CHOICE = 282,
TOK_CLASS = 283,
TOK_COMPONENT = 284,
TOK_COMPONENTS = 285,
TOK_CONSTRAINED = 286,
TOK_CONTAINING = 287,
TOK_DEFAULT = 288,
TOK_DEFINITIONS = 289,
TOK_DEFINED = 290,
TOK_EMBEDDED = 291,
TOK_ENCODED = 292,
TOK_ENCODING_CONTROL = 293,
TOK_END = 294,
TOK_ENUMERATED = 295,
TOK_EXPLICIT = 296,
TOK_EXPORTS = 297,
TOK_EXTENSIBILITY = 298,
TOK_EXTERNAL = 299,
TOK_FALSE = 300,
TOK_FROM = 301,
TOK_GeneralizedTime = 302,
TOK_GeneralString = 303,
TOK_GraphicString = 304,
TOK_IA5String = 305,
TOK_IDENTIFIER = 306,
TOK_IMPLICIT = 307,
TOK_IMPLIED = 308,
TOK_IMPORTS = 309,
TOK_INCLUDES = 310,
TOK_INSTANCE = 311,
TOK_INSTRUCTIONS = 312,
TOK_INTEGER = 313,
TOK_ISO646String = 314,
TOK_MAX = 315,
TOK_MIN = 316,
TOK_MINUS_INFINITY = 317,
TOK_NULL = 318,
TOK_NumericString = 319,
TOK_OBJECT = 320,
TOK_ObjectDescriptor = 321,
TOK_OCTET = 322,
TOK_OF = 323,
TOK_OPTIONAL = 324,
TOK_PATTERN = 325,
TOK_PDV = 326,
TOK_PLUS_INFINITY = 327,
TOK_PRESENT = 328,
TOK_PrintableString = 329,
TOK_PRIVATE = 330,
TOK_REAL = 331,
TOK_RELATIVE_OID = 332,
TOK_SEQUENCE = 333,
TOK_SET = 334,
TOK_SIZE = 335,
TOK_STRING = 336,
TOK_SYNTAX = 337,
TOK_T61String = 338,
TOK_TAGS = 339,
TOK_TeletexString = 340,
TOK_TRUE = 341,
TOK_TYPE_IDENTIFIER = 342,
TOK_UNIQUE = 343,
TOK_UNIVERSAL = 344,
TOK_UniversalString = 345,
TOK_UTCTime = 346,
TOK_UTF8String = 347,
TOK_VideotexString = 348,
TOK_VisibleString = 349,
TOK_WITH = 350,
TOK_EXCEPT = 351,
TOK_INTERSECTION = 352,
TOK_UNION = 353,
TOK_TwoDots = 354,
TOK_ThreeDots = 355,
TOK_tag = 356
};
#endif
#define TOK_PPEQ 258
#define TOK_opaque 259
#define TOK_bstring 260
#define TOK_cstring 261
#define TOK_hstring 262
#define TOK_identifier 263
#define TOK_number 264
#define TOK_number_negative 265
#define TOK_typereference 266
#define TOK_capitalreference 267
#define TOK_typefieldreference 268
#define TOK_valuefieldreference 269
#define TOK_ABSENT 270
#define TOK_ABSTRACT_SYNTAX 271
#define TOK_ALL 272
#define TOK_ANY 273
#define TOK_APPLICATION 274
#define TOK_AUTOMATIC 275
#define TOK_BEGIN 276
#define TOK_BIT 277
#define TOK_BMPString 278
#define TOK_BOOLEAN 279
#define TOK_BY 280
#define TOK_CHARACTER 281
#define TOK_CHOICE 282
#define TOK_CLASS 283
#define TOK_COMPONENT 284
#define TOK_COMPONENTS 285
#define TOK_CONSTRAINED 286
#define TOK_CONTAINING 287
#define TOK_DEFAULT 288
#define TOK_DEFINITIONS 289
#define TOK_DEFINED 290
#define TOK_EMBEDDED 291
#define TOK_ENCODED 292
#define TOK_ENCODING_CONTROL 293
#define TOK_END 294
#define TOK_ENUMERATED 295
#define TOK_EXPLICIT 296
#define TOK_EXPORTS 297
#define TOK_EXTENSIBILITY 298
#define TOK_EXTERNAL 299
#define TOK_FALSE 300
#define TOK_FROM 301
#define TOK_GeneralizedTime 302
#define TOK_GeneralString 303
#define TOK_GraphicString 304
#define TOK_IA5String 305
#define TOK_IDENTIFIER 306
#define TOK_IMPLICIT 307
#define TOK_IMPLIED 308
#define TOK_IMPORTS 309
#define TOK_INCLUDES 310
#define TOK_INSTANCE 311
#define TOK_INSTRUCTIONS 312
#define TOK_INTEGER 313
#define TOK_ISO646String 314
#define TOK_MAX 315
#define TOK_MIN 316
#define TOK_MINUS_INFINITY 317
#define TOK_NULL 318
#define TOK_NumericString 319
#define TOK_OBJECT 320
#define TOK_ObjectDescriptor 321
#define TOK_OCTET 322
#define TOK_OF 323
#define TOK_OPTIONAL 324
#define TOK_PATTERN 325
#define TOK_PDV 326
#define TOK_PLUS_INFINITY 327
#define TOK_PRESENT 328
#define TOK_PrintableString 329
#define TOK_PRIVATE 330
#define TOK_REAL 331
#define TOK_RELATIVE_OID 332
#define TOK_SEQUENCE 333
#define TOK_SET 334
#define TOK_SIZE 335
#define TOK_STRING 336
#define TOK_SYNTAX 337
#define TOK_T61String 338
#define TOK_TAGS 339
#define TOK_TeletexString 340
#define TOK_TRUE 341
#define TOK_TYPE_IDENTIFIER 342
#define TOK_UNIQUE 343
#define TOK_UNIVERSAL 344
#define TOK_UniversalString 345
#define TOK_UTCTime 346
#define TOK_UTF8String 347
#define TOK_VideotexString 348
#define TOK_VisibleString 349
#define TOK_WITH 350
#define TOK_EXCEPT 351
#define TOK_INTERSECTION 352
#define TOK_UNION 353
#define TOK_TwoDots 354
#define TOK_ThreeDots 355
#define TOK_tag 356
#ifndef YYSTYPE
#line 58 "asn1p_y.y"
typedef union {
asn1p_t *a_grammar;
asn1p_module_flags_e a_module_flags;
@ -269,14 +29,106 @@ typedef union {
char *name;
struct asn1p_type_tag_s tag;
} tv_nametag;
} yystype;
/* Line 1281 of /usr/local/share/bison/yacc.c. */
#line 275 "y.tab.h"
# define YYSTYPE yystype
#endif
} YYSTYPE;
#define TOK_PPEQ 257
#define TOK_opaque 258
#define TOK_bstring 259
#define TOK_cstring 260
#define TOK_hstring 261
#define TOK_identifier 262
#define TOK_number 263
#define TOK_number_negative 264
#define TOK_typereference 265
#define TOK_capitalreference 266
#define TOK_typefieldreference 267
#define TOK_valuefieldreference 268
#define TOK_ABSENT 269
#define TOK_ABSTRACT_SYNTAX 270
#define TOK_ALL 271
#define TOK_ANY 272
#define TOK_APPLICATION 273
#define TOK_AUTOMATIC 274
#define TOK_BEGIN 275
#define TOK_BIT 276
#define TOK_BMPString 277
#define TOK_BOOLEAN 278
#define TOK_BY 279
#define TOK_CHARACTER 280
#define TOK_CHOICE 281
#define TOK_CLASS 282
#define TOK_COMPONENT 283
#define TOK_COMPONENTS 284
#define TOK_CONSTRAINED 285
#define TOK_CONTAINING 286
#define TOK_DEFAULT 287
#define TOK_DEFINITIONS 288
#define TOK_DEFINED 289
#define TOK_EMBEDDED 290
#define TOK_ENCODED 291
#define TOK_ENCODING_CONTROL 292
#define TOK_END 293
#define TOK_ENUMERATED 294
#define TOK_EXPLICIT 295
#define TOK_EXPORTS 296
#define TOK_EXTENSIBILITY 297
#define TOK_EXTERNAL 298
#define TOK_FALSE 299
#define TOK_FROM 300
#define TOK_GeneralizedTime 301
#define TOK_GeneralString 302
#define TOK_GraphicString 303
#define TOK_IA5String 304
#define TOK_IDENTIFIER 305
#define TOK_IMPLICIT 306
#define TOK_IMPLIED 307
#define TOK_IMPORTS 308
#define TOK_INCLUDES 309
#define TOK_INSTANCE 310
#define TOK_INSTRUCTIONS 311
#define TOK_INTEGER 312
#define TOK_ISO646String 313
#define TOK_MAX 314
#define TOK_MIN 315
#define TOK_MINUS_INFINITY 316
#define TOK_NULL 317
#define TOK_NumericString 318
#define TOK_OBJECT 319
#define TOK_ObjectDescriptor 320
#define TOK_OCTET 321
#define TOK_OF 322
#define TOK_OPTIONAL 323
#define TOK_PATTERN 324
#define TOK_PDV 325
#define TOK_PLUS_INFINITY 326
#define TOK_PRESENT 327
#define TOK_PrintableString 328
#define TOK_PRIVATE 329
#define TOK_REAL 330
#define TOK_RELATIVE_OID 331
#define TOK_SEQUENCE 332
#define TOK_SET 333
#define TOK_SIZE 334
#define TOK_STRING 335
#define TOK_SYNTAX 336
#define TOK_T61String 337
#define TOK_TAGS 338
#define TOK_TeletexString 339
#define TOK_TRUE 340
#define TOK_TYPE_IDENTIFIER 341
#define TOK_UNIQUE 342
#define TOK_UNIVERSAL 343
#define TOK_UniversalString 344
#define TOK_UTCTime 345
#define TOK_UTF8String 346
#define TOK_VideotexString 347
#define TOK_VisibleString 348
#define TOK_WITH 349
#define TOK_EXCEPT 350
#define TOK_INTERSECTION 351
#define TOK_UNION 352
#define TOK_TwoDots 353
#define TOK_ThreeDots 354
#define TOK_tag 355
extern YYSTYPE asn1p_lval;
#endif /* not BISON_ASN_P_Y_H */

View File

@ -233,7 +233,9 @@ static asn1p_value_t *
%type <a_expr> DefinedTypeRef
%type <a_expr> ValueSetDefinition /* Val INTEGER ::= {1|2} */
%type <a_expr> ValueDefinition /* val INTEGER ::= 1*/
%type <a_value> optValueSetBody
%type <a_expr> optValueSetBody
%type <a_expr> ValueSetBody
%type <a_expr> ValueSetElement
%type <a_value> InlineOrDefinedValue
%type <a_value> DefinedValue
%type <a_value> SignedNumber
@ -694,7 +696,27 @@ DefinedTypeRef:
optValueSetBody:
{ }
| ElementSetSpecs {
| ValueSetBody {
}
;
/*
* X.680 does not permit ElementSetSpecs starting with ellipsis,
* i.e. (..., A, B). This is very strange: the ElementSetSpecs is used
* inside ValueSet, and ValueSets "in the wild" tend to have the first
* ellipsis.
*/
ValueSetBody:
ValueSetElement {
}
| ValueSetBody ',' ValueSetElement {
}
;
ValueSetElement:
TOK_ThreeDots {
}
| ElementSetSpec {
}
;
@ -981,7 +1003,7 @@ WithSyntaxFormatToken:
ExtensionAndException:
TOK_ThreeDots {
$$ = asn1p_expr_new(asn1p_lineno);
$$ = asn1p_expr_new(yylineno);
checkmem($$);
$$->Identifier = strdup("...");
checkmem($$->Identifier);
@ -989,7 +1011,7 @@ ExtensionAndException:
$$->meta_type = AMT_TYPE;
}
| TOK_ThreeDots '!' DefinedValue {
$$ = asn1p_expr_new(asn1p_lineno);
$$ = asn1p_expr_new(yylineno);
checkmem($$);
$$->Identifier = strdup("...");
checkmem($$->Identifier);
@ -998,7 +1020,7 @@ ExtensionAndException:
$$->meta_type = AMT_TYPE;
}
| TOK_ThreeDots '!' SignedNumber {
$$ = asn1p_expr_new(asn1p_lineno);
$$ = asn1p_expr_new(yylineno);
checkmem($$);
$$->Identifier = strdup("...");
$$->value = $3;
@ -1058,7 +1080,7 @@ TypeDeclaration:
$$->meta_type = AMT_TYPE;
}
| TOK_SEQUENCE optConstraints TOK_OF TypeDeclaration {
$$ = asn1p_expr_new(asn1p_lineno);
$$ = asn1p_expr_new(yylineno);
checkmem($$);
$$->constraints = $2;
$$->expr_type = ASN_CONSTR_SEQUENCE_OF;
@ -1066,7 +1088,7 @@ TypeDeclaration:
TQ_ADD(&($$->members), $4, next);
}
| TOK_SET optConstraints TOK_OF TypeDeclaration {
$$ = asn1p_expr_new(asn1p_lineno);
$$ = asn1p_expr_new(yylineno);
checkmem($$);
$$->constraints = $2;
$$->expr_type = ASN_CONSTR_SET_OF;
@ -1074,14 +1096,14 @@ TypeDeclaration:
TQ_ADD(&($$->members), $4, next);
}
| TOK_ANY {
$$ = asn1p_expr_new(asn1p_lineno);
$$ = asn1p_expr_new(yylineno);
checkmem($$);
$$->expr_type = ASN_TYPE_ANY;
$$->meta_type = AMT_TYPE;
}
| TOK_ANY TOK_DEFINED TOK_BY Identifier {
int ret;
$$ = asn1p_expr_new(asn1p_lineno);
$$ = asn1p_expr_new(yylineno);
checkmem($$);
$$->reference = asn1p_ref_new(yylineno);
ret = asn1p_ref_add_component($$->reference,
@ -1352,7 +1374,7 @@ BasicTypeId_UniverationCompatible:
BasicType:
BasicTypeId {
$$ = asn1p_expr_new(asn1p_lineno);
$$ = asn1p_expr_new(yylineno);
checkmem($$);
$$->expr_type = $1;
$$->meta_type = AMT_TYPE;
@ -1361,7 +1383,7 @@ BasicType:
if($2) {
$$ = $2;
} else {
$$ = asn1p_expr_new(asn1p_lineno);
$$ = asn1p_expr_new(yylineno);
checkmem($$);
}
$$->expr_type = $1;
@ -1774,7 +1796,7 @@ optUniverationDefinition:
UniverationDefinition:
'{' '}' {
$$ = asn1p_expr_new(asn1p_lineno);
$$ = asn1p_expr_new(yylineno);
checkmem($$);
}
| '{' UniverationList '}' {
@ -1784,7 +1806,7 @@ UniverationDefinition:
UniverationList:
UniverationElement {
$$ = asn1p_expr_new(asn1p_lineno);
$$ = asn1p_expr_new(yylineno);
checkmem($$);
TQ_ADD(&($$->members), $1, next);
}
@ -1796,14 +1818,14 @@ UniverationList:
UniverationElement:
Identifier {
$$ = asn1p_expr_new(asn1p_lineno);
$$ = asn1p_expr_new(yylineno);
checkmem($$);
$$->expr_type = A1TC_UNIVERVAL;
$$->meta_type = AMT_VALUE;
$$->Identifier = $1;
}
| Identifier '(' SignedNumber ')' {
$$ = asn1p_expr_new(asn1p_lineno);
$$ = asn1p_expr_new(yylineno);
checkmem($$);
$$->expr_type = A1TC_UNIVERVAL;
$$->meta_type = AMT_VALUE;
@ -1811,7 +1833,7 @@ UniverationElement:
$$->value = $3;
}
| Identifier '(' DefinedValue ')' {
$$ = asn1p_expr_new(asn1p_lineno);
$$ = asn1p_expr_new(yylineno);
checkmem($$);
$$->expr_type = A1TC_UNIVERVAL;
$$->meta_type = AMT_VALUE;
@ -1819,14 +1841,14 @@ UniverationElement:
$$->value = $3;
}
| SignedNumber {
$$ = asn1p_expr_new(asn1p_lineno);
$$ = asn1p_expr_new(yylineno);
checkmem($$);
$$->expr_type = A1TC_UNIVERVAL;
$$->meta_type = AMT_VALUE;
$$->value = $1;
}
| TOK_ThreeDots {
$$ = asn1p_expr_new(asn1p_lineno);
$$ = asn1p_expr_new(yylineno);
checkmem($$);
$$->Identifier = strdup("...");
checkmem($$->Identifier);
@ -2032,7 +2054,7 @@ yyerror(const char *msg) {
fprintf(stderr,
"ASN.1 grammar parse error "
"near line %d (token \"%s\"): %s\n",
asn1p_lineno, asn1p_text, msg);
yylineno, asn1p_text, msg);
return -1;
}