📄 asn1p_y.y
字号:
return yyerror("Unterminated IMPORTS FROM, " "expected semicolon ';'"); saved_aid = 0; $$ = $2; } /* * Some error cases. */ | TOK_IMPORTS TOK_FROM /* ... */ { return yyerror("Empty IMPORTS list"); } ;ImportsBundleSet: ImportsBundle { $$ = asn1p_module_new(); checkmem($$); TQ_ADD_TYPE(asn1p_xports_t,&($$->imports), $1, xp_next); } | ImportsBundleSet ImportsBundle { $$ = $1; TQ_ADD_TYPE(asn1p_xports_t,&($$->imports), $2, xp_next); } ;AssignedIdentifier: { memset(&$$, 0, sizeof($$)); } | ObjectIdentifier { $$.oid = $1; }; /* | DefinedValue { $$.value = $1; }; // Handled through saved_aid */ImportsBundle: ImportsList TOK_FROM TypeRefName AssignedIdentifier { $$ = $1; $$->fromModuleName = $3; $$->identifier = $4; /* This stupid thing is used for look-back hack. */ saved_aid = $$->identifier.oid ? 0 : &($$->identifier); checkmem($$); } ;ImportsList: ImportsElement { $$ = asn1p_xports_new(); checkmem($$); TQ_ADD_TYPE(asn1p_expr_t,&($$->members), $1, next); } | ImportsList ',' ImportsElement { $$ = $1; TQ_ADD_TYPE(asn1p_expr_t,&($$->members), $3, next); } ;ImportsElement: TypeRefName { $$ = NEW_EXPR(); checkmem($$); $$->Identifier = $1; $$->expr_type = A1TC_REFERENCE; } | TypeRefName '{' '}' { /* Completely equivalent to above */ $$ = NEW_EXPR(); checkmem($$); $$->Identifier = $1; $$->expr_type = A1TC_REFERENCE; } | Identifier { $$ = NEW_EXPR(); checkmem($$); $$->Identifier = $1; $$->expr_type = A1TC_REFERENCE; } ;optExports: { $$ = 0; } | ExportsDefinition { $$ = asn1p_module_new(); checkmem($$); if($1) { TQ_ADD_TYPE(asn1p_xports_t,&($$->exports), $1, xp_next); } else { /* "EXPORTS ALL;" */ } } ;ExportsDefinition: TOK_EXPORTS ExportsBody ';' { $$ = $2; } | TOK_EXPORTS TOK_ALL ';' { $$ = 0; } | TOK_EXPORTS ';' { /* Empty EXPORTS clause effectively prohibits export. */ $$ = asn1p_xports_new(); checkmem($$); } ;ExportsBody: ExportsElement { $$ = asn1p_xports_new(); assert($$); TQ_ADD_TYPE(asn1p_expr_t,&($$->members), $1, next); } | ExportsBody ',' ExportsElement { $$ = $1; TQ_ADD_TYPE(asn1p_expr_t,&($$->members), $3, next); } ;ExportsElement: TypeRefName { $$ = NEW_EXPR(); checkmem($$); $$->Identifier = $1; $$->expr_type = A1TC_EXPORTVAR; } | TypeRefName '{' '}' { $$ = NEW_EXPR(); checkmem($$); $$->Identifier = $1; $$->expr_type = A1TC_EXPORTVAR; } | Identifier { $$ = NEW_EXPR(); checkmem($$); $$->Identifier = $1; $$->expr_type = A1TC_EXPORTVAR; } ;ValueSet: '{' ElementSetSpecs '}' { $$ = $2; };ValueSetTypeAssignment: TypeRefName DefinedType TOK_PPEQ ValueSet { $$ = $2; assert($$->Identifier == 0); $$->Identifier = $1; $$->meta_type = AMT_VALUESET; $$->constraints = $4; } ;DefinedType: BasicType { $$ = $1; } /* * A DefinedType reference. * "CLASS1.&id.&id2" * or * "Module.Type" * or * "Module.identifier" * or * "Type" */ | ComplexTypeReference { $$ = NEW_EXPR(); checkmem($$); $$->reference = $1; $$->expr_type = A1TC_REFERENCE; $$->meta_type = AMT_TYPEREF; } /* * A parameterized assignment. */ | ComplexTypeReference '{' ActualParameterList '}' { $$ = NEW_EXPR(); checkmem($$); $$->reference = $1; $$->rhs_pspecs = $3; $$->expr_type = A1TC_REFERENCE; $$->meta_type = AMT_TYPEREF; } ;/* * Data Type Reference. * === EXAMPLE === * Type3 ::= CHOICE { a Type1, b Type 2 } * === EOF === */DataTypeReference: /* * Optionally tagged type definition. */ TypeRefName TOK_PPEQ Type { $$ = $3; $$->Identifier = $1; assert($$->expr_type); assert($$->meta_type); } | TypeRefName TOK_PPEQ ObjectClass { $$ = $3; $$->Identifier = $1; assert($$->expr_type == A1TC_CLASSDEF); assert($$->meta_type == AMT_OBJECTCLASS); } /* * Parameterized <Type> declaration: * === EXAMPLE === * SIGNED { ToBeSigned } ::= SEQUENCE { * toBeSigned ToBeSigned, * algorithm AlgorithmIdentifier, * signature BIT STRING * } * === EOF === */ | TypeRefName '{' ParameterArgumentList '}' TOK_PPEQ Type { $$ = $6; $$->Identifier = $1; $$->lhs_params = $3; } /* Parameterized CLASS declaration */ | TypeRefName '{' ParameterArgumentList '}' TOK_PPEQ ObjectClass { $$ = $6; $$->Identifier = $1; $$->lhs_params = $3; } ;ParameterArgumentList: ParameterArgumentName { int ret; $$ = asn1p_paramlist_new(yylineno); checkmem($$); ret = asn1p_paramlist_add_param($$, $1.governor, $1.argument); checkmem(ret == 0); if($1.governor) asn1p_ref_free($1.governor); if($1.argument) free($1.argument); } | ParameterArgumentList ',' ParameterArgumentName { int ret; $$ = $1; ret = asn1p_paramlist_add_param($$, $3.governor, $3.argument); checkmem(ret == 0); if($3.governor) asn1p_ref_free($3.governor); if($3.argument) free($3.argument); } ; ParameterArgumentName: TypeRefName { $$.governor = NULL; $$.argument = $1; } | TypeRefName ':' Identifier { int ret; $$.governor = asn1p_ref_new(yylineno); ret = asn1p_ref_add_component($$.governor, $1, 0); checkmem(ret == 0); $$.argument = $3; } | TypeRefName ':' TypeRefName { int ret; $$.governor = asn1p_ref_new(yylineno); ret = asn1p_ref_add_component($$.governor, $1, 0); checkmem(ret == 0); $$.argument = $3; } | BasicTypeId ':' Identifier { int ret; $$.governor = asn1p_ref_new(yylineno); ret = asn1p_ref_add_component($$.governor, ASN_EXPR_TYPE2STR($1), 1); checkmem(ret == 0); $$.argument = $3; } | BasicTypeId ':' TypeRefName { int ret; $$.governor = asn1p_ref_new(yylineno); ret = asn1p_ref_add_component($$.governor, ASN_EXPR_TYPE2STR($1), 1); checkmem(ret == 0); $$.argument = $3; } ;ActualParameterList: ActualParameter { $$ = NEW_EXPR(); checkmem($$); asn1p_expr_add($$, $1); } | ActualParameterList ',' ActualParameter { $$ = $1; asn1p_expr_add($$, $3); } ;ActualParameter: Type { $$ = $1; } | SimpleValue { $$ = NEW_EXPR(); checkmem($$); $$->Identifier = "?"; $$->expr_type = A1TC_REFERENCE; $$->meta_type = AMT_VALUE; $$->value = $1; } | Identifier { asn1p_ref_t *ref; $$ = NEW_EXPR(); checkmem($$); $$->Identifier = $1; $$->expr_type = A1TC_REFERENCE; $$->meta_type = AMT_VALUE; ref = asn1p_ref_new(yylineno); asn1p_ref_add_component(ref, $1, RLT_lowercase); $$->value = asn1p_value_fromref(ref, 0); } | ValueSet { $$ = NEW_EXPR(); $$->expr_type = A1TC_VALUESET; $$->meta_type = AMT_VALUESET; $$->constraints = $1; } ;/* | '{' ActualParameter '}' { $$ = NEW_EXPR(); checkmem($$); asn1p_expr_add($$, $2); $$->expr_type = A1TC_PARAMETRIZED; $$->meta_type = AMT_TYPE; } ;*//* * A collection of constructed data type members. */optComponentTypeLists: { $$ = NEW_EXPR(); } | ComponentTypeLists { $$ = $1; };ComponentTypeLists: ComponentType { $$ = NEW_EXPR(); checkmem($$); asn1p_expr_add($$, $1); } | ComponentTypeLists ',' ComponentType { $$ = $1; asn1p_expr_add($$, $3); } ;ComponentType: Identifier Type optMarker { $$ = $2; assert($$->Identifier == 0); $$->Identifier = $1; $3.flags |= $$->marker.flags; $$->marker = $3; } | Type optMarker { $$ = $1; $2.flags |= $$->marker.flags; $$->marker = $2; _fixup_anonymous_identifier($$); } | TOK_COMPONENTS TOK_OF Type { $$ = NEW_EXPR(); checkmem($$); $$->meta_type = $3->meta_type; $$->expr_type = A1TC_COMPONENTS_OF; asn1p_expr_add($$, $3); } | ExtensionAndException { $$ = $1; } ;AlternativeTypeLists: AlternativeType { $$ = NEW_EXPR(); checkmem($$); asn1p_expr_add($$, $1); } | AlternativeTypeLists ',' AlternativeType { $$ = $1; asn1p_expr_add($$, $3); } ;AlternativeType: Identifier Type { $$ = $2; assert($$->Identifier == 0); $$->Identifier = $1; } | ExtensionAndException { $$ = $1; } | Type { $$ = $1; _fixup_anonymous_identifier($$); } ;ObjectClass: TOK_CLASS '{' FieldSpec '}' optWithSyntax { $$ = $3; checkmem($$); $$->with_syntax = $5; assert($$->expr_type == A1TC_CLASSDEF); assert($$->meta_type == AMT_OBJECTCLASS); } ;optUnique: { $$ = 0; } | TOK_UNIQUE { $$ = 1; } ;FieldSpec: ClassField { $$ = NEW_EXPR(); checkmem($$); $$->expr_type = A1TC_CLASSDEF; $$->meta_type = AMT_OBJECTCLASS; asn1p_expr_add($$, $1); } | FieldSpec ',' ClassField { $$ = $1; asn1p_expr_add($$, $3); } ; /* X.681 */ClassField: /* TypeFieldSpec ::= typefieldreference TypeOptionalitySpec? */ TOK_typefieldreference optMarker { $$ = NEW_EXPR(); checkmem($$); $$->Identifier = $1; $$->meta_type = AMT_OBJECTFIELD; $$->expr_type = A1TC_CLASSFIELD_TFS; /* TypeFieldSpec */ $$->marker = $2; } /* FixedTypeValueFieldSpec ::= valuefieldreference Type UNIQUE ? ValueOptionalitySpec ? */ | TOK_valuefieldreference Type optUnique optMarker { $$ = NEW_EXPR(); $$->Identifier = $1; $$->meta_type = AMT_OBJECTFIELD; $$->expr_type = A1TC_CLASSFIELD_FTVFS; /* FixedTypeValueFieldSpec */ $$->unique = $3; $$->marker = $4; asn1p_expr_add($$, $2); } /* VariableTypeValueFieldSpec ::= valuefieldreference FieldName ValueOptionalitySpec ? */ | TOK_valuefieldreference FieldName optMarker { $$ = NEW_EXPR(); $$->Identifier = $1; $$->meta_type = AMT_OBJECTFIELD; $$->expr_type = A1TC_CLASSFIELD_VTVFS; $$->reference = $2; $$->marker = $3; } /* ObjectFieldSpec ::= objectfieldreference DefinedObjectClass ObjectOptionalitySpec ? */ | TOK_valuefieldreference DefinedObjectClass optMarker { $$ = NEW_EXPR(); checkmem($$); $$->Identifier = $1; $$->reference = $2; $$->meta_type = AMT_OBJECTFIELD; $$->expr_type = A1TC_CLASSFIELD_OFS; $$->marker = $3; } /* VariableTypeValueSetFieldSpec ::= valuesetfieldreference FieldName ValueOptionalitySpec ? */ | TOK_typefieldreference FieldName optMarker { $$ = NEW_EXPR(); $$->Identifier = $1; $$->meta_type = AMT_OBJECTFIELD; $$->expr_type = A1TC_CLASSFIELD_VTVSFS; $$->reference = $2; $$->marker = $3; } /* FixedTypeValueSetFieldSpec ::= valuesetfieldreference Type ValueSetOptionalitySpec ? */ | TOK_typefieldreference Type optMarker { $$ = NEW_EXPR(); checkmem($$); $$->Identifier = $1; $$->meta_type = AMT_OBJECTFIELD; $$->expr_type = A1TC_CLASSFIELD_FTVSFS; asn1p_expr_add($$, $2); $$->marker = $3; } /* ObjectSetFieldSpec ::= objectsetfieldreference DefinedObjectClass ObjectOptionalitySpec ? */ | TOK_typefieldreference DefinedObjectClass optMarker { $$ = NEW_EXPR(); checkmem($$); $$->Identifier = $1; $$->reference = $2; $$->meta_type = AMT_OBJECTFIELD; $$->expr_type = A1TC_CLASSFIELD_OSFS; $$->marker = $3; } ;optWithSyntax: { $$ = 0; } | WithSyntax { $$ = $1; } ;WithSyntax: TOK_WITH TOK_SYNTAX '{' { asn1p_lexer_hack_enable_with_syntax(); } WithSyntaxList '}' { $$ = $5; } ;WithSyntaxList: WithSyntaxToken { $$ = asn1p_wsyntx_new(); TQ_ADD_TYPE(asn1p_wsyntx_chunk_t,&($$->chunks), $1, next); } | WithSyntaxList WithSyntaxToken { $$ = $1; TQ_ADD_TYPE(asn1p_wsyntx_chunk_t,&($$->chunks), $2, next); } ;WithSyntaxToken: TOK_whitespace { $$ = asn1p_wsyntx_chunk_fromstring($1.buf, 0); $$->type = WC_WHITESPACE; } | TOK_Literal { $$ = asn1p_wsyntx_chunk_fromstring($1, 0); } | PrimitiveFieldReference { $$ = asn1p_wsyntx_chunk_fromstring($1.name, 0); $$->type = WC_FIELD; } | '[' WithSyntaxList ']' { $$ = asn1p_wsyntx_chunk_fromsyntax($2); } ;ExtensionAndException: TOK_ThreeDots { $$ = NEW_EXPR(); checkmem($$); $$->Identifier = strdup("..."); checkmem($$->Identifier); $$->expr_type = A1TC_EXTENSIBLE; $$->meta_type = AMT_TYPE; } | TOK_ThreeDots '!' DefinedValue { $$ = NEW_EXPR(); checkmem($$); $$->Identifier = strdup("..."); checkmem($$->Identifier); $$->value = $3; $$->expr_type = A1TC_EXTENSIBLE; $$->meta_type = AMT_TYPE; } | TOK_ThreeDots '!' SignedNumber { $$ = NEW_EXPR(); checkmem($$); $$->Identifier = strdup("..."); $$->value = $3; checkmem($$->Identifier); $$->expr_type = A1TC_EXTENSIBLE; $$->meta_type = AMT_TYPE; } ;Type: optTag TypeDeclaration optConstraints { $$ = $2; $$->tag = $1; /* * Outer constraint for SEQUENCE OF and SET OF applies * to the inner type. */ if($$->expr_type == ASN_CONSTR_SEQUENCE_OF || $$->expr_type == ASN_CONSTR_SET_OF) { assert(!TQ_FIRST(&($$->members))->constraints); TQ_FIRST(&($$->members))->constraints = $3; } else { if($$->constraints) { assert(!$2); } else { $$->constraints = $3; } } } ;NSTD_IndirectMarker: { $$ = asn1p_as_pointer ? EM_INDIRECT : 0; asn1p_as_pointer = 0; } ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -