/****************************************************************************** * Copyright (c) 2000-2015 Ericsson Telecom AB * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html ******************************************************************************/ /* * Asn1:1997 parser * * Written by Matyas Forstner * 20021119 */ %{ /********************************************************************* * C(++) declarations *********************************************************************/ /* These declarations, intended for asn1p.tab.cc, are written by Bison * into asn1p.tab.hh, which is included from multiple C++ files. * YYBISON is defined in asn1p.tab.cc */ #ifdef YYBISON #include #include #include "../Identifier.hh" #include "AST_asn1.hh" #include "Ref.hh" #include "../Value.hh" #include "../Valuestuff.hh" #include "../Type.hh" #include "../Typestuff.hh" // FIXME CTs #include "../CompField.hh" #include "../EnumItem.hh" #include "Tag.hh" #include "TableConstraint.hh" #include "Object.hh" #include "Block.hh" #include "../main.hh" using namespace Asn; using namespace Common; extern Modules *modules; extern const char *asn1_infile; extern bool asn1_yy_parse_internal; extern void asn1la_newfile(const char *filename); /* defined in lexer c-file */ extern FILE *asn1_yyin; #define yyin asn1_yyin extern int asn1_yylineno; #define yylineno asn1_yylineno int asn1_plineno; #define plineno asn1_plineno /* copy-paste from xxxxx.yy.cc */ #define YY_BUF_SIZE 16384 extern int asn1_yylex_my(); #define asn1_yylex asn1_yylex_my struct yy_buffer_state; extern yy_buffer_state *asn1_yy_create_buffer(FILE *file, int size); extern void asn1_yy_switch_to_buffer(yy_buffer_state *new_buffer); extern int asn1_yylex_destroy (void); extern yy_buffer_state *asn1_yy_scan_string(const char *yy_str); static Asn::Module *act_asn1_module = NULL; #define YYERROR_VERBOSE void yyerror(const char *s) { Location loc(asn1_infile, plineno); loc.error("%s", s); } void yywarning(const char *s) { Location loc(asn1_infile, plineno); loc.warning("%s", s); } #endif /* YYBISON */ %} /********************************************************************* * Bison declarations *********************************************************************/ %name-prefix="asn1_yy" %output="asn1p.tab.cc" %defines %verbose %glr-parser /** shift-reduce conflicts: 2: in IMPORTS clause SymbolsFromModule: SymbolList KW_FROM TOK_UpperIdentifier . AssignedIdentifier 1: in upper references (Upper_FromObjs and ExtUpperRef) "A" . "." "zzz" <--> "A" . "." "&zzz" 1: in constraints: "(" lowerid "<" . ... selectiontype or (minvalue < .. maxvalue) */ %expect 4 %start GrammarRoot /********************************************************************* * The union-type *********************************************************************/ %union { /** The Asn namespace must be explicitly used here because this block * is also visible from the common header files. */ bool b; Common::Int _i; Common::int_val_t *i; string *str; Common::Node *node; Common::Identifier *id; Asn::Ref_defd_simple *ref_ds; Asn::Ref_defd *ref_d; Asn::FieldName *fieldname; Asn::FromObj *fromobj; Asn::Reference *ref; Asn::Module *module; Asn::TagDefault::tagdef_t tagging; struct { Asn::Exports *exp; Asn::Imports *imp; Asn::Assignments *asss; } modbody; Asn::Symbols *syms; Asn::Exports *exports; Asn::ImpMod *impmod; Asn::Imports *impmods; Asn::Assignments *asss; Asn::Assignment *ass; Asn::Ass_pard *ass_pard; Common::Block *block; /* type stuff */ Common::Type *type; struct { Common::Identifier *name; Common::Type *type; } namedType; Common::Tag *tag; Common::Tag::tagclass_t tagclass; Common::EnumItem *enumitem; Common::EnumItems *enumitems; Common::ExcSpec *excSpec; Common::CTs_EE_CTs *ctss; Common::CTs *cts; Common::ExtAndExc *extAndExc; Common::ExtAdds *extAdds; Common::ExtAdd *extAdd; Common::CT *ct; Common::CompField *compField; Common::Constraint *constraint; Common::RangeEndpoint *rangeendpoint; Common::Constraints *constraints; /* sub-type constraints */ Common::ContainedSubtypeConstraint* contsubt__constraint; Common::ValueRangeConstraint* valuerange_constraint; Common::SizeConstraint* size_constraint; Common::PermittedAlphabetConstraint* permalpha_constraint; Common::SetOperationConstraint* setoperation_constraint; Common::PatternConstraint* pattern_constraint; Common::SingleInnerTypeConstraint* single_inner_constraint; Common::MultipleInnerTypeConstraint* multiple_inner_constraint; Common::NamedConstraint* named_constraint; Common::NamedConstraint::presence_constraint_t presence_constraint; /* value stuff */ Common::Value *value; Common::Values *values; Common::NamedValue *namedValue; Common::NamedValues *namedValues; Common::OID_comp *oic; Common::CharsDefn *charsdefn; Common::CharSyms *charsyms; /* object/class/set stuff */ Asn::ObjectClass *objclass; Asn::Object *obj; Asn::ObjectSet *objset; Asn::FieldSpec *fieldspec; Asn::FieldSpecs *fieldspecs; Asn::OS_Element *os_element; Asn::OS_defn *os_defn; Asn::AtNotation *an; Asn::AtNotations *ans; Asn::TableConstraint *tbl_cnstr; } /********************************************************************* * Tokens with semantic value *********************************************************************/ %token TOK_UpperIdentifier "" TOK_LowerIdentifier "" TOK_ampUpperIdentifier "<&upperidentifier>" TOK_ampLowerIdentifier "<&loweridentifier>" %token TOK_Number "" %token TOK_CString "" %token TOK_RealNumber "" TOK_BString "" TOK_HString "" %token TOK_Block "{block}" /* special keyword-like tokens */ %token KW_Block_NamedNumberList KW_Block_Enumerations KW_Block_Assignment KW_Block_NamedBitList KW_Block_IdentifierList KW_Block_FieldSpecList KW_Block_ComponentTypeLists KW_Block_AlternativeTypeLists KW_Block_Type KW_Block_Value KW_Block_Object KW_Block_ObjectSet KW_Block_SeqOfValue KW_Block_SetOfValue KW_Block_SequenceValue KW_Block_SetValue KW_Block_ObjectSetSpec KW_Block_DefinedObjectSetBlock KW_Block_AtNotationList KW_Block_OIDValue KW_Block_ROIDValue KW_Block_CharStringValue KW_Block_QuadrupleOrTuple KW_TITAN_Assignments KW_Block_DefinitiveOIDValue KW_Block_ValueSet KW_Block_MultipleTypeConstraints /********************************************************************* * Tokens without semantic value (keywords, operators) *********************************************************************/ %token TOK_Assignment "::=" %token TOK_RangeSeparator ".." %token TOK_Ellipsis "..." %token TOK_LeftVersionBrackets "[[" %token TOK_RightVersionBrackets "]]" %token '{' "{" %token '}' "}" %token '(' "(" %token ')' ")" %token '[' "[" %token ']' "]" %token ',' "," %token '.' "." %token '-' "-" %token ':' ":" %token ';' ";" %token '@' "@" %token '|' "|" %token '!' "!" %token '^' "^" %token '\'' "'" %token '"' "\"" %token '<' "<" %token '>' ">" %token KW_ABSENT "ABSENT" /* KW_ABSTRACT_SYNTAX "ABSTRACT-SYNTAX" */ KW_ALL "ALL" KW_ANY "ANY" KW_APPLICATION "APPLICATION" KW_AUTOMATIC "AUTOMATIC" KW_BEGIN "BEGIN" KW_BIT "BIT" KW_BMPString "BMPString" KW_BOOLEAN "BOOLEAN" KW_BY "BY" KW_CHARACTER "CHARACTER" KW_CHOICE "CHOICE" KW_CLASS "CLASS" KW_COMPONENT "COMPONENT" KW_COMPONENTS "COMPONENTS" KW_CONSTRAINED "CONSTRAINED" KW_CONTAINING "CONTAINING" KW_DEFAULT "DEFAULT" KW_DEFINED "DEFINED" KW_DEFINITIONS "DEFINITIONS" KW_EMBEDDED "EMBEDDED" KW_ENCODED "ENCODED" KW_END "END" KW_ENUMERATED "ENUMERATED" KW_EXCEPT "EXCEPT" KW_EXPLICIT "EXPLICIT" KW_EXPORTS "EXPORTS" KW_EXTENSIBILITY "EXTENSIBILITY" KW_EXTERNAL "EXTERNAL" KW_FALSE "FALSE" KW_FROM "FROM" KW_GeneralizedTime "GeneralizedTime" KW_GeneralString "GeneralString" KW_GraphicString "GraphicString" KW_IA5String "IA5String" KW_IDENTIFIER "IDENTIFIER" KW_IMPLICIT "IMPLICIT" KW_IMPLIED "IMPLIED" KW_IMPORTS "IMPORTS" KW_INCLUDES "INCLUDES" KW_INSTANCE "INSTANCE" KW_INTEGER "INTEGER" KW_INTERSECTION "INTERSECTION" KW_ISO646String "ISO646String" KW_MAX "MAX" KW_MIN "MIN" KW_MINUS_INFINITY "MINUS-INFINITY" KW_NOT_A_NUMBER "NOT-A-NUMBER" KW_NULL "NULL" KW_NumericString "NumericString" KW_OBJECT "OBJECT" KW_ObjectDescriptor "ObjectDescriptor" KW_OCTET "OCTET" KW_OF "OF" KW_OPTIONAL "OPTIONAL" KW_PATTERN "PATTERN" KW_PDV "PDV" KW_PLUS_INFINITY "PLUS-INFINITY" KW_PRESENT "PRESENT" KW_PrintableString "PrintableString" KW_PRIVATE "PRIVATE" KW_REAL "REAL" KW_RELATIVE_OID "RELATIVE-OID" KW_SEQUENCE "SEQUENCE" KW_SET "SET" KW_SIZE "SIZE" KW_STRING "STRING" KW_SYNTAX "SYNTAX" KW_T61String "T61String" KW_TAGS "TAGS" KW_TeletexString "TeletexString" KW_TRUE "TRUE" /* KW_TYPE_IDENTIFIER "TYPE-IDENTIFIER" */ KW_UNION "UNION" KW_UNIQUE "UNIQUE" KW_UNIVERSAL "UNIVERSAL" KW_UniversalString "UniversalString" KW_UTCTime "UTCTime" KW_UTF8String "UTF8String" KW_VideotexString "VideotexString" KW_VisibleString "VisibleString" KW_WITH "WITH" /********************************************************************* * Semantic types of nonterminals *********************************************************************/ %type ModuleIdentifier %type ModuleDefinition %type TagDefault %type ExtensionDefault %type ModuleBody %type Symbol %type SymbolList %type Exports SymbolsExported %type SymbolsFromModule %type SymbolsFromModuleList SymbolsImported Imports %type AssignmentList %type OptParList %type Assignment TypeAssignment ValueAssignment ValueSetTypeAssignment /*ObjectSetAssignment*/ ObjectClassAssignment /*ObjectAssignment*/ UndefAssignment %type /*ObjectClass DefinedObjectClass*/ ObjectClassDefn /*UsefulObjectClassReference*/ %type Object DefinedObject ObjectDefn %type ObjectSet DefinedObjectSetBlock %type ObjectSetElements %type ObjectSetSpec ObjectSetSpec0 %type <_i> Levels Level %type AtNotation %type AtNotationList %type TableConstraint ComponentRelationConstraint %type Type Type_reg BuiltinType BuiltinType_reg NakedType NakedType_reg ConstrainedType SeqOfSetOfWithConstraint ReferencedType /*DefinedType*/ UsefulType EmbeddedPDVType ExternalType CharacterStringType RestrictedCharacterStringType UnrestrictedCharacterStringType Dflt_Type %type ComponentTypeLists AlternativeTypeLists %type ExtensionAdditionList ExtensionAdditionAlternativesList %type ExtensionAddition ExtensionAdditionGroup ExtensionAdditionAlternative %type ComponentTypeList AlternativeTypeList %type ComponentType %type ComponentType_reg %type NamedType %type ExceptionIdentification ExceptionSpec %type ExtensionAndException %type ChoiceType SelectionType SelectionTypeType %type SequenceType SetType %type SequenceOfType SetOfType %type EnumerationItem %type Enumeration %type Enumerations EnumeratedType %type AnyType %type IntegerType %type BooleanType %type NullType %type ObjectIdentifierType RelativeOIDType %type OctetStringType %type BitStringType %type GeneralString BMPString GraphicString IA5String NumericString PrintableString TeletexString UniversalString UTF8String VideotexString VisibleString %type RealType %type Class %type Tag %type LowerEndpoint UpperEndpoint LowerEndValue UpperEndValue %type Constraint ConstraintSpec SubtypeConstraint GeneralConstraint ElementSetSpecs RootElementSetSpec ElementSetSpec Unions Intersections IntersectionElements Elements SubtypeElements SingleValue InnerTypeConstraints Elems IElems UElems AdditionalElementSetSpec ValueConstraint %type ContainedSubtype %type ValueRange %type SizeConstraint %type PermittedAlphabet %type Exclusions %type PatternConstraint %type SingleTypeConstraint %type MultipleTypeConstraints TypeConstraints %type NamedConstraint %type PresenceConstraint %type Constraints %type Val_Number Val_CString Value Value_reg ObjectClassFieldValue ObjectClassFieldValue_reg /* OpenTypeFieldValue OpenTypeFieldValue_reg */ FixedTypeFieldValue FixedTypeFieldValue_reg BuiltinValue BuiltinValue_reg ReferencedValue ReferencedValue_reg DefinitiveIdentifier AssignedIdentifier ClassNumber Dflt_Value Dflt_Value_reg Dflt_NullValue DefinedValue DefinedValue_reg BooleanValue ChoiceValue SignedNumber LowerIdValue RealValue SpecialRealValue NumericRealValue NullValue DefinitiveOIDValue DefinitiveObjIdComponentList ObjectIdentifierValue ObjIdComponentList RelativeOIDValue RelativeOIDComponentList %type DefinitiveObjIdComponent ObjIdComponent ObjIdComponentNumber DefinitiveNameAndNumberForm NameAndNumberForm RelativeOIDComponent %type SequenceValue SetValue SeqOfValue SetOfValue %type ValueList ValueList0 %type NamedValue NamedNumber NamedBit %type NamedNumberList ComponentValueList NamedBitList %type CharsDefn QuadrupleOrTuple QuadrupleOrTuple0 %type CharStringValue CharSyms %type IdentifierList IdentifierList1 %type UpperRef ExtUpperRef SimplDefdUpper LowerRef ExtLowerRef SimplDefdLower SimplDefdLower_reg %type PardUpper DefdUpper PardLower DefdLower DefdLower_reg %type FieldNameUpper FieldNameUppers FieldNameLower ComponentIdList %type UpperFromObj FromObjs Lower_FromObjs LowerFromObj Upper_FromObjs SimplUpper_FromObjs PardUpper_FromObjs %type RefdUpper RefdLower RefdLower_reg Dflt_RefdLower Dflt_RefdLower_reg %type FieldSpec TypeFieldSpec FixedTypeValueFieldSpec UndefFieldSpec %type FieldSpecList %type Dflt_Block %type Dflt_LowerId %type WithSyntaxSpec_opt %type UNIQ_opt %type BlockDefinition /********************************************************************* * Destructors *********************************************************************/ %destructor {delete $$;} TOK_BString TOK_Block TOK_CString TOK_HString TOK_LowerIdentifier TOK_Number TOK_RealNumber TOK_UpperIdentifier TOK_ampLowerIdentifier TOK_ampUpperIdentifier AlternativeTypeList AlternativeTypeLists AnyType AssignedIdentifier Assignment AtNotation AtNotationList BMPString BitStringType BlockDefinition BooleanType BooleanValue BuiltinType BuiltinType_reg BuiltinValue BuiltinValue_reg CharStringValue CharSyms CharacterStringType CharsDefn ChoiceType ChoiceValue ClassNumber ComponentIdList ComponentRelationConstraint ComponentType ComponentTypeList ComponentTypeLists ComponentType_reg ComponentValueList ConstrainedType Constraint ConstraintSpec Constraints DefdLower DefdLower_reg DefdUpper DefinedObject //DefinedObjectClass DefinedObjectSetBlock //DefinedType DefinedValue DefinedValue_reg DefinitiveIdentifier DefinitiveNameAndNumberForm DefinitiveOIDValue DefinitiveObjIdComponent DefinitiveObjIdComponentList Dflt_Block Dflt_LowerId Dflt_NullValue Dflt_RefdLower Dflt_RefdLower_reg Dflt_Type Dflt_Value Dflt_Value_reg ElementSetSpec ElementSetSpecs Elements EmbeddedPDVType EnumeratedType Enumeration EnumerationItem Enumerations ExceptionIdentification ExceptionSpec Exports ExtLowerRef ExtUpperRef ExtensionAddition ExtensionAdditionAlternative ExtensionAdditionAlternativesList ExtensionAdditionGroup ExtensionAdditionList ExtensionAndException ExternalType FieldNameLower FieldNameUpper FieldNameUppers FieldSpec FieldSpecList FixedTypeFieldValue FixedTypeFieldValue_reg FixedTypeValueFieldSpec FromObjs GeneralConstraint GeneralString GraphicString IA5String IdentifierList IdentifierList1 Imports IntegerType IntersectionElements Intersections LowerFromObj LowerIdValue LowerRef Lower_FromObjs ModuleDefinition ModuleIdentifier NakedType NakedType_reg NameAndNumberForm NamedBit NamedBitList NamedNumber NamedNumberList NamedValue NullType NullValue NumericRealValue NumericString ObjIdComponent ObjIdComponentList ObjIdComponentNumber Object //ObjectClass ObjectClassAssignment ObjectClassDefn ObjectClassFieldValue ObjectClassFieldValue_reg ObjectDefn ObjectIdentifierType ObjectIdentifierValue ObjectSet ObjectSetElements ObjectSetSpec ObjectSetSpec0 OctetStringType OptParList PardLower PardUpper PrintableString QuadrupleOrTuple QuadrupleOrTuple0 RealType RealValue RefdLower RefdLower_reg RefdUpper ReferencedType ReferencedValue ReferencedValue_reg RelativeOIDComponent RelativeOIDComponentList RelativeOIDType RelativeOIDValue RestrictedCharacterStringType RootElementSetSpec AdditionalElementSetSpec SelectionType SelectionTypeType SeqOfSetOfWithConstraint SeqOfValue SequenceOfType SequenceType SequenceValue SetOfType SetOfValue SetType SetValue SignedNumber SimplDefdLower SimplDefdLower_reg SimplDefdUpper SingleValue SpecialRealValue SubtypeConstraint SubtypeElements Symbol SymbolList SymbolsExported SymbolsFromModule SymbolsFromModuleList SymbolsImported TableConstraint Tag TeletexString Type TypeAssignment TypeFieldSpec Type_reg UTF8String UndefAssignment UndefFieldSpec Unions UniversalString UnrestrictedCharacterStringType UpperFromObj UpperRef Upper_FromObjs UsefulType Val_CString Val_Number Value ValueAssignment ValueList ValueList0 ValueSetTypeAssignment Value_reg VideotexString VisibleString WithSyntaxSpec_opt ContainedSubtype ValueRange PermittedAlphabet SizeConstraint InnerTypeConstraints PatternConstraint LowerEndpoint UpperEndpoint LowerEndValue UpperEndValue Exclusions Elems IElems UElems SingleTypeConstraint MultipleTypeConstraints TypeConstraints NamedConstraint ValueConstraint %destructor { delete $$.exp; delete $$.imp; delete $$.asss; } ModuleBody %destructor { delete $$.name; delete $$.type; } NamedType %printer { fprintf(yyoutput, "'%s'", $$->c_str()); } TOK_CString %printer { fprintf(yyoutput, "%s", $$->get_asnname().c_str()); } TOK_UpperIdentifier TOK_LowerIdentifier TOK_ampUpperIdentifier TOK_ampLowerIdentifier /* With 2.4 (or even 2.3a) we could use * %printer { ... } * Alas, not with Bison 2.3 */ %printer { fprintf(yyoutput, "%s", $$->t_str().c_str()); } TOK_Number; /*%printer { int old_v = verb_level; verb_level = 255; $$->dump(0); verb_level = old_v; } TOK_Block;*/ %% /********************************************************************* * Grammar *********************************************************************/ GrammarRoot: ModuleDefinition {act_asn1_module=$1;} | BlockDefinition {parsed_node=$1;} | KW_TITAN_Assignments AssignmentList {parsed_assignments=$2;} | error {act_asn1_module=0; parsed_node=0;} ; /* 12.1 page 22 */ ModuleDefinition: ModuleIdentifier DefinitiveIdentifier KW_DEFINITIONS TagDefault ExtensionDefault TOK_Assignment KW_BEGIN ModuleBody ModuleEnd { DEBUG(6, "Module `%s' parsed successfully.", $1->get_dispname().c_str()); $$=new Asn::Module($1, $4, $5, $8.exp, $8.imp, $8.asss); $$->set_location(asn1_infile, @1.first_line); delete $2; } ; /********************************************************************* * Module header *********************************************************************/ ModuleIdentifier: TOK_UpperIdentifier { $$=$1; } ; DefinitiveIdentifier: /* '{' DefinitiveObjIdComponentList '}' {$$=new Asn_Value_ObjId($2);} */ TOK_Block { $$=new Value(Value::V_UNDEF_BLOCK, $1); $$->set_location(asn1_infile, @1.first_line); } | /* empty */ {$$=0;} ; DefinitiveOIDValue: DefinitiveObjIdComponentList {$$=$1;} ; DefinitiveObjIdComponentList: DefinitiveObjIdComponent { $$=new Value(Value::V_OID); $$->set_location(asn1_infile, @1.first_line); $$->add_oid_comp($1); } | DefinitiveObjIdComponentList DefinitiveObjIdComponent {$$=$1; $$->add_oid_comp($2);} ; DefinitiveObjIdComponent: TOK_LowerIdentifier { $$=new OID_comp($1, 0); $$->set_location(asn1_infile, @1.first_line); } | Val_Number { $1->set_location(asn1_infile, @1.first_line); $$=new OID_comp(0, $1); $$->set_location(asn1_infile, @1.first_line); } | DefinitiveNameAndNumberForm {$$=$1;} ; /* 12.1 page 23 */ TagDefault: KW_EXPLICIT KW_TAGS {$$=TagDefault::EXPLICIT;} | KW_IMPLICIT KW_TAGS {$$=TagDefault::IMPLICIT;} | KW_AUTOMATIC KW_TAGS {$$=TagDefault::AUTOMATIC;} | /* empty */ {$$=TagDefault::EXPLICIT;} ; /* 12.1 page 23 */ ExtensionDefault: KW_EXTENSIBILITY KW_IMPLIED {$$=true;} | /* empty */ {$$=false;} ; /********************************************************************* * Module body *********************************************************************/ /* 12.1 page 23 */ ModuleBody: Exports Imports AssignmentList { $$.exp = $1; $$.imp = $2; $$.asss = $3; } | /* empty */ { $$.exp = new Exports(false); $$.imp = new Imports(); $$.asss = new Asn::Assignments(); } ; ModuleEnd: KW_END | /* empty - error */ {yyerror("Missing `END'");} | KW_END error {yyerror("Something after `END'");} ; /* 12.1 page 23 */ Exports: /* empty */ { $$=new Exports(true); /* exports all */ $$->set_location(asn1_infile); } | KW_EXPORTS SymbolsExported ";" {$$=$2;} ; /* 12.1 page 23 */ SymbolsExported: SymbolList { $$=new Exports($1); $$->set_location(asn1_infile, @1.first_line); } | /* empty */ { $$=new Exports(false); /* exports nothing */ $$->set_location(asn1_infile); } | KW_ALL { $$=new Exports(true); /* exports all */ $$->set_location(asn1_infile); } ; /* 12.1 page 23 */ Imports: /* empty */ { $$=new Imports(); $$->set_location(asn1_infile); yywarning("Missing IMPORTS clause is interpreted as `IMPORTS ;'" " (import nothing) instead of importing all symbols" " from all modules."); } | KW_IMPORTS SymbolsImported ";" {$$=$2;} ; /* 12.1 page 23 */ SymbolsImported: SymbolsFromModuleList {$$=$1;} | /* empty */ { $$=new Imports(); $$->set_location(asn1_infile); } ; /* 12.1 page 23 */ SymbolsFromModuleList: SymbolsFromModule { $$=new Imports(); $$->set_location(asn1_infile, @1.first_line); $$->add_impmod($1); } | SymbolsFromModuleList SymbolsFromModule {$$=$1; $$->add_impmod($2);} ; /* 12.1 page 23 */ SymbolsFromModule: SymbolList KW_FROM TOK_UpperIdentifier AssignedIdentifier { $$=new ImpMod($3, $1); $$->set_location(asn1_infile, @1.first_line); delete $4; } ; /* 12.1 page 23 */ AssignedIdentifier: /* ObjectIdentifierValue {$$=$1;} */ TOK_Block { $$=new Value(Value::V_UNDEF_BLOCK, $1); $$->set_location(asn1_infile, @1.first_line); } | DefinedValue {$$=$1;} | /* empty */ {$$=0;} ; /* 12.1 page 23 */ SymbolList: Symbol {$$=new Symbols(); $$->add_sym($1);} | SymbolList "," Symbol {$$=$1; $$->add_sym($3);} ; /* 12.1 page 23 */ Symbol: TOK_UpperIdentifier {$$=$1;} | TOK_LowerIdentifier {$$=$1;} | TOK_UpperIdentifier TOK_Block {$$=$1; delete $2;} | TOK_LowerIdentifier TOK_Block {$$=$1; delete $2;} /* | ParameterizedReference | objectclassreference | objectreference | objectsetreference */ ; /********************************************************************* * BlockDefinition *********************************************************************/ BlockDefinition: KW_Block_NamedNumberList NamedNumberList {$$=$2;} | KW_Block_Enumerations Enumerations {$$=$2;} | KW_Block_Assignment Assignment {$$=$2;} | KW_Block_Assignment Assignment error {$$=$2;} | KW_Block_NamedBitList NamedBitList {$$=$2;} | KW_Block_IdentifierList IdentifierList {$$=$2;} | KW_Block_FieldSpecList FieldSpecList {$$=$2;} | KW_Block_ComponentTypeLists ComponentTypeLists {$$=$2;} | KW_Block_AlternativeTypeLists AlternativeTypeLists {$$=$2;} | KW_Block_Type Type {$$=$2;} | KW_Block_Type Type error {$$=$2;} | KW_Block_Value Value {$$=$2;} | KW_Block_Value Value error {$$=$2;} | KW_Block_Object Object {$$=$2;} | KW_Block_Object Object error {$$=$2;} | KW_Block_ObjectSet ObjectSet {$$=$2;} | KW_Block_ObjectSet ObjectSet error {$$=$2;} | KW_Block_SeqOfValue SeqOfValue {$$=$2;} | KW_Block_SetOfValue SetOfValue {$$=$2;} | KW_Block_SequenceValue SequenceValue {$$=$2;} | KW_Block_SetValue SetValue {$$=$2;} | KW_Block_ObjectSetSpec ObjectSetSpec {$$=$2;} | KW_Block_DefinedObjectSetBlock DefinedObjectSetBlock {$$=$2;} | KW_Block_AtNotationList AtNotationList {$$=$2;} | KW_Block_OIDValue ObjectIdentifierValue {$$=$2;} | KW_Block_ROIDValue RelativeOIDValue {$$=$2;} | KW_Block_CharStringValue CharStringValue {$$=$2;} | KW_Block_QuadrupleOrTuple QuadrupleOrTuple {$$=$2;} | KW_Block_DefinitiveOIDValue DefinitiveOIDValue {$$=$2;} | KW_Block_ValueSet ElementSetSpecs {$$=$2;} | KW_Block_MultipleTypeConstraints MultipleTypeConstraints {$$=$2;} ; /********************************************************************* * Assignments *********************************************************************/ /* 12.1 page 24 */ AssignmentList: Assignment {$$=new Asn::Assignments(); $$->add_ass($1);} | AssignmentList Assignment {$$=$1; $$->add_ass($2);} | error Assignment {$$=new Asn::Assignments(); $$->add_ass($2);} | AssignmentList error {$$=$1;} ; /* 12.1 page 24 */ Assignment: TypeAssignment {$$=$1; $$->set_location(asn1_infile, @1.first_line);} | ValueAssignment {$$=$1; $$->set_location(asn1_infile, @1.first_line);} | ValueSetTypeAssignment {$$=$1; $$->set_location(asn1_infile, @1.first_line);} | ObjectClassAssignment {$$=$1; $$->set_location(asn1_infile, @1.first_line);} /* | ObjectAssignment {$$=$1; $$->set_location(asn1_infile, @1.first_line);} | ObjectSetAssignment {$$=$1; $$->set_location(asn1_infile, @1.first_line);} | ParameterizedAssignment */ | UndefAssignment {$$=$1; $$->set_location(asn1_infile, @1.first_line);} ; /* AbsoluteReference: '@' GlobalModuleReference '.' ItemSpec ; ItemSpec: TOK_UpperIdentifier | ItemId '.' ComponentId ; ItemId: ItemSpec ; ComponentId: TOK_LowerIdentifier | TOK_Number | '*' ; */ OptParList: /* empty */ {$$=0;} | TOK_Block {$$=new Ass_pard($1);} ObjectClassAssignment: TOK_UpperIdentifier OptParList TOK_Assignment ObjectClassDefn {$$=new Ass_OC($1, $2, $4);} ; /* ObjectAssignment: TOK_LowerIdentifier OptParList DefinedObjectClass_reg TOK_Assignment TOK_Block {$$=new Ass_O($1, $2, $3, $5);} | TOK_LowerIdentifier OptParList DefinedObjectClass_reg TOK_Assignment RefdLower {$$=new Ass_O($1, $2, $3, $5);} ; */ /* ObjectSetAssignment: TOK_UpperIdentifier OptParList DefinedObjectClass_reg TOK_Assignment TOK_Block {$$=new Ass_OS($1, $2, $3, $5);} ; */ /* 15.1 page 28 */ TypeAssignment: TOK_UpperIdentifier OptParList TOK_Assignment Type_reg {$$=new Ass_T($1, $2, $4);} | TOK_UpperIdentifier OptParList TOK_Assignment UpperFromObj { Type *t = new Type(Type::T_REFD, $4); t->set_location(asn1_infile, @4.first_line); $$ = new Ass_T($1, $2, t); } | TOK_UpperIdentifier OptParList TOK_Assignment FromObjs { Type *t = new Type(Type::T_REFD, $4); t->set_location(asn1_infile, @4.first_line); $$ = new Ass_T($1, $2, t); } ; /* 15.2 page 28 */ ValueAssignment: TOK_LowerIdentifier OptParList Type_reg TOK_Assignment Value_reg {$$=new Ass_V($1, $2, $3, $5);} | TOK_LowerIdentifier OptParList Type_reg TOK_Assignment NullValue {$$=new Ass_V($1, $2, $3, $5);} | TOK_LowerIdentifier OptParList Type_reg TOK_Assignment TOK_Block { Value *v = new Value(Value::V_UNDEF_BLOCK, $5); v->set_location(asn1_infile, @5.first_line); $$=new Ass_V($1, $2, $3, v); } | TOK_LowerIdentifier OptParList Type_reg TOK_Assignment ReferencedValue_reg {$$=new Ass_V($1, $2, $3, $5);} | TOK_LowerIdentifier OptParList Type_reg TOK_Assignment LowerIdValue {$$=new Ass_V($1, $2, $3, $5);} | TOK_LowerIdentifier OptParList DefdUpper TOK_Assignment Value_reg { Type *t = new Type(Type::T_REFD, $3); t->set_location(asn1_infile, @3.first_line); $$ = new Ass_V($1, $2, t, $5); } | TOK_LowerIdentifier OptParList DefdUpper TOK_Assignment NullValue { Type *t = new Type(Type::T_REFD, $3); t->set_location(asn1_infile, @3.first_line); $$ = new Ass_V($1, $2, t, $5); } | TOK_LowerIdentifier OptParList UpperFromObj TOK_Assignment Value { Type *t = new Type(Type::T_REFD, $3); t->set_location(asn1_infile, @3.first_line); $$ = new Ass_V($1, $2, t, $5); } | TOK_LowerIdentifier OptParList FromObjs TOK_Assignment Value { Type *t = new Type(Type::T_REFD, $3); t->set_location(asn1_infile, @3.first_line); $$ = new Ass_V($1, $2, t, $5); } ; /* 15.6 page 29 */ ValueSetTypeAssignment: TOK_UpperIdentifier OptParList Type_reg TOK_Assignment TOK_Block {$$=new Ass_VS($1, $2, $3, $5);} ; UndefAssignment: TOK_UpperIdentifier OptParList DefdUpper TOK_Assignment TOK_Block {$$=new Ass_Undef($1, $2, $3, $5);} | TOK_UpperIdentifier OptParList TOK_Assignment DefdUpper {$$=new Ass_Undef($1, $2, 0, $4);} | TOK_LowerIdentifier OptParList DefdUpper TOK_Assignment TOK_Block {$$=new Ass_Undef($1, $2, $3, $5);} | TOK_LowerIdentifier OptParList DefdUpper TOK_Assignment RefdLower {$$=new Ass_Undef($1, $2, $3, $5);} ; /* 15.7 page 29 */ //ValueSet: ///* // "{" ElementSetSpecs "}" //*/ // TOK_Block {delete $1;} //; /********************************************************************* * Tag stuff *********************************************************************/ /* TaggedType: Tag Type | Tag KW_IMPLICIT Type | Tag KW_EXPLICIT Type ; */ Tag: "[" Class ClassNumber "]" { $$=new Tag(Tag::TAG_DEFPLICIT, $2, $3); $$->set_location(asn1_infile, @1.first_line); } | "[" Class ClassNumber "]" KW_IMPLICIT { $$=new Tag(Tag::TAG_IMPLICIT, $2, $3); $$->set_location(asn1_infile, @1.first_line); } | "[" Class ClassNumber "]" KW_EXPLICIT { $$=new Tag(Tag::TAG_EXPLICIT, $2, $3); $$->set_location(asn1_infile, @1.first_line); } ; ClassNumber: Val_Number { $$=$1; $1->set_location(asn1_infile, @1.first_line); } | DefinedValue {$$=$1;} ; /* 30.1 page 48 */ Class: KW_UNIVERSAL { $$=Tag::TAG_UNIVERSAL; if(!asn1_yy_parse_internal) yywarning("Using of UNIVERSAL tagclass is not recommended."); } | KW_APPLICATION {$$=Tag::TAG_APPLICATION;} | KW_PRIVATE {$$=Tag::TAG_PRIVATE;} | /* empty */ {$$=Tag::TAG_CONTEXT;} ; /********************************************************************* * Type stuff *********************************************************************/ /* 16.1 page 30 */ Type_reg: ConstrainedType { $$=$1; $$->set_location(asn1_infile, @1.first_line); } | BuiltinType { $$=$1; $$->set_location(asn1_infile, @1.first_line); } | Tag Type { $$=$2; $$->set_location(asn1_infile, @2.first_line); $$->add_tag($1); } ; Type: ConstrainedType { $$=$1; $$->set_location(asn1_infile, @1.first_line); } | NakedType { $$=$1; $$->set_location(asn1_infile, @1.first_line); } | Tag Type { $$=$2; $$->set_location(asn1_infile, @2.first_line); $$->add_tag($1); } ; /* 45.1 page 66 */ ConstrainedType: NakedType_reg Constraints {$$=$1; $$->add_constraints($2);} | SeqOfSetOfWithConstraint {$$=$1;} ; NakedType: NakedType_reg {$$=$1;} | SequenceOfType {$$=$1;} | SetOfType {$$=$1;} ; NakedType_reg: ReferencedType {$$=$1;} | BuiltinType_reg {$$=$1;} ; BuiltinType: BuiltinType_reg {$$=$1;} | SequenceOfType {$$=$1;} | SetOfType {$$=$1;} ; BuiltinType_reg: NullType {$$=$1;} | BitStringType {$$=$1;} | BooleanType {$$=$1;} | CharacterStringType {$$=$1;} | ChoiceType {$$=$1;} | SelectionType {$$=$1;} | EnumeratedType {$$=$1;} | IntegerType {$$=$1;} | ObjectIdentifierType {$$=$1;} | RelativeOIDType {$$=$1;} | OctetStringType {$$=$1;} | RealType {$$=$1;} | SequenceType {$$=$1;} | SetType {$$=$1;} | EmbeddedPDVType {$$=$1;} | ExternalType {$$=$1;} | AnyType {$$=$1;} | UsefulType {$$=$1;} /* | InstanceOfType | ObjectClassFieldType */ ; /* to eliminate the following reduce/reduce conflict: Constraint ... -> SubtypeElements->ContainedSubtype->Type->KW_NULL SubtypeElements->TypeConstraint->Type->KW_NULL SubtypeElements->SingleValue->Value->KW_NULL */ /********************************************************************* * Value stuff *********************************************************************/ BuiltinValue: BuiltinValue_reg {$$=$1;} | NullValue {$$=$1;} | LowerIdValue {$$=$1;} | TOK_Block { $$=new Value(Value::V_UNDEF_BLOCK, $1); $$->set_location(asn1_infile, @1.first_line); } ; /* e.g., the EnumeratedValue is LowerIdValue */ LowerIdValue: TOK_LowerIdentifier { $$=new Value(Value::V_UNDEF_LOWERID, $1); $$->set_location(asn1_infile, @1.first_line); } ; BuiltinValue_reg: TOK_BString { $$=$1; $$->set_location(asn1_infile, @1.first_line); } | TOK_HString { $$=$1; $$->set_location(asn1_infile, @1.first_line); } | Val_CString { $$=$1; $$->set_location(asn1_infile, @1.first_line); } | BooleanValue { $$=$1; $$->set_location(asn1_infile, @1.first_line); } | ChoiceValue { $$=$1; $$->set_location(asn1_infile, @1.first_line); } | SignedNumber {$$=$1;} | RealValue { $$=$1; $$->set_location(asn1_infile, @1.first_line); } /* | EmbeddedPDVValue | InstanceOfValue | ExternalValue --> SequenceOrSetValue | EnumeratedValue --> TOK_LowerIdentifier */ ; /********************************************************************* * The individual types and its value notation *********************************************************************/ BooleanType: KW_BOOLEAN {$$=new Type(Type::T_BOOL);} ; BooleanValue: KW_TRUE {$$=new Value(Value::V_BOOL, true);} | KW_FALSE {$$=new Value(Value::V_BOOL, false);} ; IntegerType: KW_INTEGER {$$=new Type(Type::T_INT_A);} | KW_INTEGER TOK_Block {$$=new Type(Type::T_INT_A, $2);} ; /********************************************************************* * NamedNumberList *********************************************************************/ NamedNumberList: NamedNumber { $$=new NamedValues(); $$->add_nv($1); } | NamedNumberList "," NamedNumber { $$=$1; $$->add_nv($3); } | error NamedNumber { $$=new NamedValues(); $$->add_nv($2); } | NamedNumberList error {$$=$1;} ; NamedNumber: TOK_LowerIdentifier "(" SignedNumber ")" { $$=new NamedValue($1, $3); $$->set_location(asn1_infile, @1.first_line); } | TOK_LowerIdentifier "(" DefinedValue ")" { $$=new NamedValue($1, $3); $$->set_location(asn1_infile, @1.first_line); } ; SignedNumber: Val_Number { $1->set_location(asn1_infile, @1.first_line); $$=$1; } | "-" Val_Number { $2->set_location(asn1_infile, @2.first_line); if(*$2->get_val_Int()==0) $2->error("-0 is not a valid signed number"); $$=$2; $$->change_sign(); } ; EnumeratedType: KW_ENUMERATED TOK_Block {$$=new Type(Type::T_ENUM_A, $2);} ; Enumerations: Enumeration {$$=new Type(Type::T_ENUM_A, $1, false, 0);} | Enumeration "," TOK_Ellipsis ExceptionSpec {$$=new Type(Type::T_ENUM_A, $1, true, 0); delete $4;} | Enumeration "," TOK_Ellipsis ExceptionSpec "," Enumeration {$$=new Type(Type::T_ENUM_A, $1, true, $6); delete $4;} ; Enumeration: EnumerationItem { $$=new EnumItems(); $$->add_ei($1); } | Enumeration "," EnumerationItem { $$=$1; $$->add_ei($3); } | error EnumerationItem { $$=new EnumItems(); $$->add_ei($2); } | Enumeration error {$$=$1;} ; EnumerationItem: TOK_LowerIdentifier { $$=new EnumItem($1, 0); $$->set_location(asn1_infile, @1.first_line); } | NamedNumber { $$=new EnumItem($1->get_name().clone(), $1->get_value()->clone()); $$->set_location(asn1_infile, @1.first_line); delete $1; } ; RealType: KW_REAL {$$=new Type(Type::T_REAL);} ; RealValue: SpecialRealValue {$$=$1;} | NumericRealValue {$$=$1;} ; NumericRealValue: TOK_RealNumber {$$=$1;} | "-" TOK_RealNumber { $$=$2; $$->change_sign(); } /* | SequenceValue */ ; SpecialRealValue: KW_PLUS_INFINITY { Location loc(asn1_infile, @1.first_line); $$=new Value(Value::V_REAL, string2Real("INF", loc)); } | KW_MINUS_INFINITY { Location loc(asn1_infile, @1.first_line); $$=new Value(Value::V_REAL, string2Real("-INF", loc)); } | KW_NOT_A_NUMBER { Location loc(asn1_infile, @1.first_line); $$=new Value(Value::V_REAL, string2Real("NaN", loc)); } ; BitStringType: KW_BIT KW_STRING {$$=new Type(Type::T_BSTR_A);} | KW_BIT KW_STRING TOK_Block {$$=new Type(Type::T_BSTR_A, $3);} ; NamedBitList: NamedBit { $$=new NamedValues(); $$->add_nv($1); } | NamedBitList "," NamedBit { $$=$1; $$->add_nv($3); } | error NamedBit { $$=new NamedValues(); $$->add_nv($2); } | NamedBitList error {$$=$1;} ; NamedBit: TOK_LowerIdentifier "(" Val_Number ")" { $$=new NamedValue($1, $3); $3->set_location(asn1_infile, @3.first_line); $$->set_location(asn1_infile, @1.first_line); } | TOK_LowerIdentifier "(" DefinedValue ")" { $$=new NamedValue($1, $3); $$->set_location(asn1_infile, @1.first_line); } ; /* used in bitstring values */ IdentifierList: /* empty */ { $$=new Value(Value::V_NAMEDBITS); $$->set_location(asn1_infile); } | IdentifierList1 {$$=$1;} ; IdentifierList1: TOK_LowerIdentifier { $$=new Value(Value::V_NAMEDBITS); $$->add_id($1); $$->set_location(asn1_infile, @1.first_line); } | IdentifierList1 "," TOK_LowerIdentifier { $$=$1; $$->add_id($3); $$->set_location(asn1_infile, @1.first_line); } | error TOK_LowerIdentifier { $$=new Value(Value::V_NAMEDBITS); $$->add_id($2); $$->set_location(asn1_infile, @2.first_line); } | IdentifierList1 error {$$=$1;} ; OctetStringType: KW_OCTET KW_STRING {$$=new Type(Type::T_OSTR);} ; AnyType: KW_ANY {$$=new Type(Type::T_ANY);} | KW_ANY KW_DEFINED KW_BY TOK_LowerIdentifier {delete $4; $$=new Type(Type::T_ANY);} ; NullType: KW_NULL {$$=new Type(Type::T_NULL);} ; NullValue: KW_NULL { $$=new Value(Value::V_NULL); $$->set_location(asn1_infile, @1.first_line); } ; /* SequenceType: KW_SEQUENCE '{' '}' | KW_SEQUENCE '{' ExtensionAndException OptionalExtensionMarker '}' | KW_SEQUENCE '{' ComponentTypeLists '}' ; */ SequenceType: KW_SEQUENCE TOK_Block {$$=new Type(Type::T_SEQ_A, $2);} ; ExtensionAndException: TOK_Ellipsis ExceptionSpec {$$=new ExtAndExc($2);} /* | TOK_Ellipsis --> ExceptionSpec can be empty, so this is surplus */ ; ComponentTypeLists: /* empty */ {$$=new CTs_EE_CTs(0, 0, 0);} | ComponentTypeList {$$=new CTs_EE_CTs($1, 0, 0);} | ComponentTypeList "," ExtensionAndException OptionalExtensionMarker {$$=new CTs_EE_CTs($1, $3, 0);} | ComponentTypeList "," ExtensionAndException "," ExtensionAdditionList OptionalExtensionMarker { $3->set_eas($5); $$=new CTs_EE_CTs($1, $3, 0); } | ComponentTypeList "," ExtensionAndException "," ExtensionAdditionList ExtensionEndMarker "," ComponentTypeList { $3->set_eas($5); $$=new CTs_EE_CTs($1, $3, $8); } | ComponentTypeList "," ExtensionAndException ExtensionEndMarker "," ComponentTypeList { $$=new CTs_EE_CTs($1, $3, $6); } | ExtensionAndException "," ExtensionAdditionList ExtensionEndMarker "," ComponentTypeList { $1->set_eas($3); $$=new CTs_EE_CTs(0, $1, $6); } | ExtensionAndException "," ExtensionEndMarker "," ComponentTypeList {$$=new CTs_EE_CTs(0, $1, $5);} | ExtensionAndException "," ExtensionAdditionList OptionalExtensionMarker { $1->set_eas($3); $$ = new CTs_EE_CTs(0, $1, 0); } | ExtensionAndException OptionalExtensionMarker {$$=new CTs_EE_CTs(0, $1, 0);} | error {$$=0;} ; /* ExtensionAdditions: ',' ExtensionAdditionList | * empty * ; */ ExtensionAdditionList: ExtensionAddition { $$=new ExtAdds(); $$->add_ea($1); } | ExtensionAdditionList "," ExtensionAddition { $$=$1; $$->add_ea($3); } | error ExtensionAddition { $$=new ExtAdds(); $$->add_ea($2); } | ExtensionAdditionList error {$$=$1;} ; ExtensionEndMarker: "," TOK_Ellipsis ; OptionalExtensionMarker: ExtensionEndMarker | /* empty */ ; ExtensionAddition: ComponentType {$$=$1;} | ExtensionAdditionGroup {$$=$1;} ; ExtensionAdditionGroup: TOK_LeftVersionBrackets ComponentTypeList TOK_RightVersionBrackets {$$=new ExtAddGrp(0, $2);} | TOK_LeftVersionBrackets error TOK_RightVersionBrackets {$$=new ExtAddGrp(0, new CTs());} ; ComponentTypeList: ComponentType { $$=new CTs(); $$->add_ct($1); } | ComponentTypeList "," ComponentType { $$=$1; $$->add_ct($3); } | error ComponentType { $$=new CTs(); $$->add_ct($2); } | ComponentTypeList error {$$=$1;} ; ComponentType: ComponentType_reg { $$=new CT_reg($1); $$->set_location(asn1_infile, @1.first_line); } | KW_COMPONENTS KW_OF Type { $$=new CT_CompsOf($3); $$->set_location(asn1_infile, @1.first_line); } ; ComponentType_reg: NamedType { $$=new CompField($1.name, $1.type, false, 0); $$->set_location(asn1_infile, @1.first_line); } | NamedType KW_OPTIONAL { $$=new CompField($1.name, $1.type, true, 0); $$->set_location(asn1_infile, @1.first_line); } | NamedType KW_DEFAULT Value { if (default_as_optional) { /* optional should not have a default value */ delete $3; } $$=new CompField($1.name, $1.type, default_as_optional, default_as_optional ? NULL : $3); $$->set_location(asn1_infile, @1.first_line); } ; SequenceValue: ComponentValueList { $$=new Value(Value::V_SEQ, $1); $$->set_location(asn1_infile, @1.first_line); } | /* empty */ { $$=new Value(Value::V_SEQ, new NamedValues()); $$->set_location(asn1_infile, @0.first_line); } ; SetValue: ComponentValueList { $$=new Value(Value::V_SET, $1); $$->set_location(asn1_infile, @1.first_line); } | /* empty */ { $$=new Value(Value::V_SET, new NamedValues()); $$->set_location(asn1_infile, @0.first_line); } ; ComponentValueList: NamedValue { $$=new NamedValues(); $$->add_nv($1); } | ComponentValueList "," NamedValue { $$=$1; $$->add_nv($3); } | error NamedValue { $$=new NamedValues(); $$->add_nv($2); } | ComponentValueList error {$$=$1;} ; SequenceOfType: KW_SEQUENCE KW_OF Type {$$=new Type(Type::T_SEQOF, $3);} | KW_SEQUENCE KW_OF NamedType {delete $3.name; $$=new Type(Type::T_SEQOF, $3.type);} ; SetOfType: KW_SET KW_OF Type {$$=new Type(Type::T_SETOF, $3);} | KW_SET KW_OF NamedType {delete $3.name; $$=new Type(Type::T_SETOF, $3.type);} ; SeqOfValue: ValueList0 { $$=new Value(Value::V_SEQOF, $1); $$->set_location(asn1_infile, @1.first_line); } ; SetOfValue: ValueList0 { $$=new Value(Value::V_SETOF, $1); $$->set_location(asn1_infile, @1.first_line); } ; ValueList0: /* empty */ {$$ = new Values();} | ValueList {$$ = $1;} ; ValueList: Value {$$=new Values(); $$->add_v($1);} | ValueList "," Value {$$=$1; $$->add_v($3);} | error Value {$$=new Values(); $$->add_v($2);} | ValueList error {$$=$1;} ; /* SetType: KW_SET '{' '}' | KW_SET '{' ExtensionAndException OptionalExtensionMarker '}' | KW_SET '{' ComponentTypeLists '}' ; */ SetType: KW_SET TOK_Block {$$=new Type(Type::T_SET_A, $2);} ; ChoiceType: KW_CHOICE TOK_Block {$$=new Type(Type::T_CHOICE_A, $2);} ; AlternativeTypeLists: AlternativeTypeList {$$=new CTs_EE_CTs($1, 0, 0);} | AlternativeTypeList "," ExtensionAndException OptionalExtensionMarker {$$=new CTs_EE_CTs($1, $3, 0);} | AlternativeTypeList "," ExtensionAndException "," ExtensionAdditionAlternativesList OptionalExtensionMarker { $3->set_eas($5); $$=new CTs_EE_CTs($1, $3, 0); } | error {$$=0;} ; ExtensionAdditionAlternativesList: ExtensionAdditionAlternative { $$=new ExtAdds(); $$->add_ea($1); } | ExtensionAdditionAlternativesList "," ExtensionAdditionAlternative { $$=$1; $$->add_ea($3); } | error ExtensionAdditionAlternative { $$=new ExtAdds(); $$->add_ea($2); } | ExtensionAdditionAlternativesList error {$$=$1;} ; ExtensionAdditionAlternative: TOK_LeftVersionBrackets AlternativeTypeList TOK_RightVersionBrackets {$$=new ExtAddGrp(0, $2);} | NamedType { CompField *cf = new CompField($1.name, $1.type, false, 0); cf->set_location(asn1_infile, @1.first_line); $$=new CT_reg(cf); } | TOK_LeftVersionBrackets error TOK_RightVersionBrackets {$$=new ExtAddGrp(0, new CTs());} ; AlternativeTypeList: NamedType { $$=new CTs(); CompField *cf = new CompField($1.name, $1.type, false, 0); cf->set_location(asn1_infile, @1.first_line); $$->add_ct(new CT_reg(cf)); } | AlternativeTypeList "," NamedType { $$=$1; CompField *cf = new CompField($3.name, $3.type, false, 0); cf->set_location(asn1_infile, @3.first_line); $$->add_ct(new CT_reg(cf)); } | error NamedType { $$=new CTs(); CompField *cf = new CompField($2.name, $2.type, false, 0); cf->set_location(asn1_infile, @2.first_line); $$->add_ct(new CT_reg(cf)); } | AlternativeTypeList error {$$=$1;} ; ChoiceValue: TOK_LowerIdentifier ":" Value {$$=new Value(Value::V_CHOICE, $1, $3);} ; /* SelectionType: TOK_LowerIdentifier "<" Type ; */ SelectionTypeType: ReferencedType {$$=$1;} | ChoiceType {$$=$1;} | SelectionType {$$=$1;} | Tag SelectionTypeType { $$=$2; $$->set_location(asn1_infile, @2.first_line); $$->add_tag($1); } ; SelectionType: TOK_LowerIdentifier "<" SelectionTypeType { $$=new Type(Type::T_SELTYPE, $1, $3); $$->set_location(asn1_infile, @1.first_line); } ; ObjectIdentifierType: KW_OBJECT KW_IDENTIFIER {$$=new Type(Type::T_OID);} ; RelativeOIDType: KW_RELATIVE_OID {$$=new Type(Type::T_ROID);} ; ObjectIdentifierValue: ObjIdComponentList {$$=$1;} /* | '{' DefinedValue ObjIdComponentList '}' --> it must be checked if the ObjIdComponentList's first component is a DefinedValue to a type OBJECT IDENTIFIER */ ; RelativeOIDValue: RelativeOIDComponentList {$$=$1;} ; ObjIdComponentList: ObjIdComponent { $$=new Value(Value::V_OID); $$->set_location(asn1_infile, @1.first_line); $$->add_oid_comp($1); } | ObjIdComponentList ObjIdComponent { $$=$1; $$->add_oid_comp($2); } | ObjIdComponentList error {$$=$1;} ; RelativeOIDComponentList: RelativeOIDComponent { $$=new Value(Value::V_ROID); $$->set_location(asn1_infile, @1.first_line); $$->add_oid_comp($1); } | RelativeOIDComponentList RelativeOIDComponent { $$=$1; $$->add_oid_comp($2); } | RelativeOIDComponentList error {$$=$1;} ; /* ObjIdComponent: NameForm | NumberForm | NameAndNumberForm ; */ ObjIdComponent: ObjIdComponentNumber {$$=$1;} | TOK_LowerIdentifier /* NameForm or reference */ { $$=new OID_comp($1, 0); $$->set_location(asn1_infile, @1.first_line); } | DefinedValue_reg { $$=new OID_comp($1); $$->set_location(asn1_infile, @1.first_line); } ; RelativeOIDComponent: ObjIdComponentNumber {$$=$1;} | DefinedValue { $$=new OID_comp($1); $$->set_location(asn1_infile, @1.first_line); } ; ObjIdComponentNumber: NameAndNumberForm {$$=$1;} | Val_Number { $1->set_location(asn1_infile, @1.first_line); $$=new OID_comp(0, $1); $$->set_location(asn1_infile, @1.first_line); } ; NameAndNumberForm: DefinitiveNameAndNumberForm {$$=$1;} | TOK_LowerIdentifier "(" DefinedValue ")" { $$=new OID_comp($1, $3); $$->set_location(asn1_infile, @1.first_line); } ; DefinitiveNameAndNumberForm: TOK_LowerIdentifier "(" Val_Number ")" { $3->set_location(asn1_infile, @3.first_line); $$=new OID_comp($1, $3); $$->set_location(asn1_infile, @1.first_line); } ; EmbeddedPDVType: KW_EMBEDDED KW_PDV {$$=new Type(Type::T_EMBEDDED_PDV);} ; /* EmbeddedPDVValue: SequenceValue ; */ ExternalType: KW_EXTERNAL {$$=new Type(Type::T_EXTERNAL);} ; /* ExternalValue: SequenceValue ; */ /********************************************************************* * Character string stuff *********************************************************************/ /* 36.1 page 55 */ CharacterStringType: RestrictedCharacterStringType {$$=$1;} | UnrestrictedCharacterStringType {$$=$1;} ; /* CharacterStringValue: RestrictedCharacterStringValue | UnrestrictedCharacterStringValue --> SequenceValue ; */ /* 37 page 55 */ RestrictedCharacterStringType: GeneralString {$$=$1;} | BMPString {$$=$1;} | GraphicString {$$=$1;} | IA5String {$$=$1;} | NumericString {$$=$1;} | PrintableString {$$=$1;} | TeletexString {$$=$1;} | UniversalString {$$=$1;} | UTF8String {$$=$1;} | VideotexString {$$=$1;} | VisibleString {$$=$1;} ; GeneralString: KW_GeneralString {$$=new Type(Type::T_GENERALSTRING);} ; BMPString: KW_BMPString {$$=new Type(Type::T_BMPSTRING);} ; GraphicString: KW_GraphicString {$$=new Type(Type::T_GRAPHICSTRING);} ; IA5String: KW_IA5String {$$=new Type(Type::T_IA5STRING);} ; NumericString: KW_NumericString {$$=new Type(Type::T_NUMERICSTRING);} ; PrintableString: KW_PrintableString {$$=new Type(Type::T_PRINTABLESTRING);} ; TeletexString: KW_TeletexString {$$=new Type(Type::T_TELETEXSTRING);} | KW_T61String {$$=new Type(Type::T_TELETEXSTRING);} ; UniversalString: KW_UniversalString {$$=new Type(Type::T_UNIVERSALSTRING);} ; UTF8String: KW_UTF8String {$$=new Type(Type::T_UTF8STRING);} ; VideotexString: KW_VideotexString {$$=new Type(Type::T_VIDEOTEXSTRING);} ; VisibleString: KW_VisibleString {$$=new Type(Type::T_VISIBLESTRING);} | KW_ISO646String {$$=new Type(Type::T_VISIBLESTRING);} ; /* RestrictedCharacterStringValue: TOK_CString {$$=$1;} | CharacterStringList | Quadruple | Tuple ; CharacterStringList: '{' CharSyms '}' ; */ CharStringValue: CharSyms {$$=$1;} | QuadrupleOrTuple { $$=new CharSyms(); $$->add_cd($1); } ; CharSyms: CharsDefn { $$=new CharSyms(); $$->add_cd($1); $$->set_location(asn1_infile, @1.first_line); } | CharSyms "," CharsDefn { $$=$1; $$->add_cd($3); } | error CharsDefn { $$=new CharSyms(); $$->add_cd($2); $$->set_location(asn1_infile, @1.first_line); } | CharSyms error { $$=$1; } ; /* CharsDefn: TOK_CString | Quadruple | Tuple | DefinedValue ; */ CharsDefn: TOK_CString { $$=new CharsDefn($1); $$->set_location(asn1_infile, @1.first_line); } | TOK_Block { $$=new CharsDefn($1); $$->set_location(asn1_infile, @1.first_line); } | ReferencedValue { $$=new CharsDefn($1); $$->set_location(asn1_infile, @1.first_line); } ; QuadrupleOrTuple: QuadrupleOrTuple0 {$$=$1;} | QuadrupleOrTuple0 error {$$=$1;} | error { $$=new CharsDefn(0, 0, 0, 0); $$->set_location(asn1_infile, @1.first_line); } ; QuadrupleOrTuple0: TOK_Number "," TOK_Number "," TOK_Number "," TOK_Number { Int group = 0, plane = 0, row = 0, cell = 0; if (*$1 > INT_MAX) { Location loc(asn1_infile, @1); loc.error("The first number of quadruple (group) should be less than " "%d instead of %s", INT_MAX, ($1->t_str()).c_str()); } else { group = $1->get_val(); } if (*$3 > INT_MAX) { Location loc(asn1_infile, @3); loc.error("The second number of quadruple (plane) should be less than " "%d instead of %s", INT_MAX, ($3->t_str()).c_str()); } else { plane = $3->get_val(); } if (*$5 > INT_MAX) { Location loc(asn1_infile, @5); loc.error("The third number of quadruple (row) should be less than %d " "instead of %s", INT_MAX, ($5->t_str()).c_str()); } else { row = $5->get_val(); } if (*$7 > INT_MAX) { Location loc(asn1_infile, @7); loc.error("The fourth number of quadruple (cell) should be less than " "%d instead of %s", INT_MAX, ($7->t_str()).c_str()); } else { cell = $7->get_val(); } $$=new CharsDefn(group, plane, row, cell); $$->set_location(asn1_infile, @1.first_line); delete $1; delete $3; delete $5; delete $7; } | TOK_Number "," TOK_Number { Int table_column = 0, table_row = 0; if (*$1 > INT_MAX) { Location loc(asn1_infile, @1); loc.error("The first number of tuple (table column) should be less " "than %d instead of %s", INT_MAX, ($1->t_str()).c_str()); } else { table_column = $1->get_val(); } if (*$3 > INT_MAX) { Location loc(asn1_infile, @3); loc.error("The second number of tuple (table row) should be less than " "%d instead of %s", INT_MAX, ($3->t_str()).c_str()); } else { table_row = $3->get_val(); } $$=new CharsDefn(table_column, table_row); $$->set_location(asn1_infile, @1.first_line); delete $1; delete $3; } ; /* Quadruple: '{' Group ',' Plane ',' Row ',' Cell '}' ; Group: TOK_Number ; Plane: TOK_Number ; Row: TOK_Number ; Cell: TOK_Number ; Tuple: '{' TableColumn ',' TableRow '}' ; TableColumn: TOK_Number ; TableRow: TOK_Number ; */ UnrestrictedCharacterStringType: KW_CHARACTER KW_STRING {$$=new Type(Type::T_UNRESTRICTEDSTRING);} ; /* UnrestrictedCharacterStringValue: SequenceValue ; */ UsefulType: KW_GeneralizedTime {$$=new Type(Type::T_GENERALIZEDTIME);} | KW_UTCTime {$$=new Type(Type::T_UTCTIME);} | KW_ObjectDescriptor {$$=new Type(Type::T_OBJECTDESCRIPTOR);} ; /********************************************************************* * Constraint stuff *********************************************************************/ /* ConstrainedType: Type Constraint | TypeWithConstraint ; */ SeqOfSetOfWithConstraint: KW_SET Constraint KW_OF Type { $$=new Type(Type::T_SETOF, $4); Constraints *cons = new Constraints(); if ($2) cons->add_con($2); $$->add_constraints(cons); } | KW_SET Constraint KW_OF NamedType { delete $4.name; $$=new Type(Type::T_SETOF, $4.type); Constraints *cons = new Constraints(); if ($2) cons->add_con($2); $$->add_constraints(cons); } | KW_SET SizeConstraint KW_OF Type { $$=new Type(Type::T_SETOF, $4); Constraints *cons = new Constraints(); if ($2) cons->add_con($2); $$->add_constraints(cons); } | KW_SET SizeConstraint KW_OF NamedType { delete $4.name; $$=new Type(Type::T_SETOF, $4.type); Constraints *cons = new Constraints(); if ($2) cons->add_con($2); $$->add_constraints(cons); } | KW_SEQUENCE Constraint KW_OF Type { $$=new Type(Type::T_SEQOF, $4); Constraints *cons = new Constraints(); if ($2) cons->add_con($2); $$->add_constraints(cons); } | KW_SEQUENCE Constraint KW_OF NamedType { delete $4.name; $$=new Type(Type::T_SEQOF, $4.type); Constraints *cons = new Constraints(); if ($2) cons->add_con($2); $$->add_constraints(cons); } | KW_SEQUENCE SizeConstraint KW_OF Type { $$=new Type(Type::T_SEQOF, $4); Constraints *cons = new Constraints(); if ($2) cons->add_con($2); $$->add_constraints(cons); } | KW_SEQUENCE SizeConstraint KW_OF NamedType { delete $4.name; $$=new Type(Type::T_SEQOF, $4.type); Constraints *cons = new Constraints(); if ($2) cons->add_con($2); $$->add_constraints(cons); } ; Constraints: Constraint { $$ = new Constraints(); if ($1) $$->add_con($1); } | Constraints Constraint { $$ = $1; if ($2) $$->add_con($2); } ; Constraint: "(" ConstraintSpec ExceptionSpec ")" { $$ = $2; delete $3; } | "(" error ")" { $$ = new IgnoredConstraint("invalid constraint"); } ; /* 45.6 page 67 */ ConstraintSpec: SubtypeConstraint { $$ = $1; } | GeneralConstraint { $$ = $1; } ; /* 45.7 page 67 */ SubtypeConstraint: ElementSetSpecs { $$ = $1; } ; /* 49.4 page 76 */ ExceptionSpec: "!" ExceptionIdentification {$$=$2;} | /* empty */ {$$=0;} | "!" error {$$=0;} ; /* 49.4 page 76 */ ExceptionIdentification: SignedNumber {$$=new ExcSpec(0, $1);} | DefinedValue {$$=new ExcSpec(0, $1);} | Type ":" Value {$$=new ExcSpec($1, $3);} ; /* 46.1 page 67 */ ElementSetSpecs: RootElementSetSpec { $$ = $1; } | RootElementSetSpec "," TOK_Ellipsis { $$ = new ElementSetSpecsConstraint($1, NULL); $$->set_location(asn1_infile, @1.first_line); } | RootElementSetSpec "," TOK_Ellipsis "," AdditionalElementSetSpec { $$ = new ElementSetSpecsConstraint($1, $5); $$->set_location(asn1_infile, @1.first_line); } ; /* 46.1 page 67 */ RootElementSetSpec: ElementSetSpec { $$ = $1; } ; /* 46.1 page 67 */ AdditionalElementSetSpec: ElementSetSpec { $$ = $1; } ; /* 46.1 page 67 */ ElementSetSpec: Unions { $$ = $1; } | KW_ALL Exclusions { $2->set_first_operand(new FullSetConstraint()); $$ = $2; $$->set_location(asn1_infile, @1.first_line); } ; /* 46.1 page 67 */ Unions: Intersections { $$ = $1; } | UElems UnionMark Intersections { $$ = new SetOperationConstraint($1, SetOperationConstraint::UNION, $3); $$->set_location(asn1_infile, @1.first_line); } ; /* 46.1 page 67 */ UElems: Unions { $$ = $1; } ; /* 46.1 page 67 */ Intersections: IntersectionElements { $$ = $1; } | IElems IntersectionMark IntersectionElements { $$ = new SetOperationConstraint($1, SetOperationConstraint::INTERSECTION, $3); $$->set_location(asn1_infile, @1.first_line); } ; /* 46.1 page 67 */ IElems: Intersections { $$ = $1; } ; /* 46.1 page 67 */ IntersectionElements: Elements { $$ = $1; } | Elems Exclusions { $2->set_first_operand($1); $$ = $2; $$->set_location(asn1_infile, @1.first_line); } ; /* 46.1 page 67 */ Elems: Elements { $$ = $1; } ; /* 46.1 page 67 */ Exclusions: KW_EXCEPT Elements { $$ = new SetOperationConstraint(0, SetOperationConstraint::EXCEPT, $2); $$->set_location(asn1_infile, @1.first_line); } ; /* 46.1 page 67 */ UnionMark: "|" | KW_UNION ; /* 46.1 page 67 */ IntersectionMark: "^" | KW_INTERSECTION ; /* 46.5 page 68 */ Elements: SubtypeElements { $$ = $1; } /* | ObjectSetElements */ | "(" ElementSetSpec ")" { $$ = $2; } ; /* 47.1 page 69 */ SubtypeElements: SingleValue { $$ = $1; } | ContainedSubtype { $$ = $1; } | ValueRange { $$ = $1; } | PermittedAlphabet { $$ = $1; } | SizeConstraint { $$ = $1; } | InnerTypeConstraints { $$ = $1; } | PatternConstraint { $$ = $1; } ; /* 47.2.1 page 70 */ SingleValue: Value_reg { $$ = new SingleValueConstraint($1); $$->set_location(asn1_infile, @1.first_line); } | LowerIdValue { $$ = new SingleValueConstraint($1); $$->set_location(asn1_infile, @1.first_line); } | TOK_Block { /** \todo: It would be more straightforward to create an undefined * constraint here and classify it later on during parsing or semantic * analysis to SimpleTableConstraint or SingleValue. */ $$ = new TableConstraint($1, 0); $$->set_location(asn1_infile, @1.first_line); } | ReferencedValue_reg { $$ = new SingleValueConstraint($1); $$->set_location(asn1_infile, @1.first_line); } ; /* 47.3.1 page 70 TypeConstraint (47.6.1 page 72) has been removed because it's conflicting with second option of ContainedSubtype rule */ ContainedSubtype: KW_INCLUDES Type { $$ = new ContainedSubtypeConstraint($2, true); $$->set_location(asn1_infile, @1.first_line); } | Type { $$ = new ContainedSubtypeConstraint($1, false); $$->set_location(asn1_infile, @1.first_line); } ; /* 47.4.1 page 71 */ ValueRange: LowerEndpoint TOK_RangeSeparator UpperEndpoint { $$ = new ValueRangeConstraint($1,$3); $$->set_location(asn1_infile, @1.first_line); } ; LowerEndpoint: LowerEndValue { $$ = $1; } | LowerEndValue "<" { $$ = $1; $$->set_exclusive(); } ; UpperEndpoint: UpperEndValue { $$ = $1; } | "<" UpperEndValue { $$ = $2; $$->set_exclusive(); } ; LowerEndValue: Value { $$ = new RangeEndpoint($1); $$->set_location(asn1_infile, @1.first_line); } | KW_MIN { $$ = new RangeEndpoint(RangeEndpoint::MIN); $$->set_location(asn1_infile, @1.first_line); } ; UpperEndValue: Value { $$ = new RangeEndpoint($1); $$->set_location(asn1_infile, @1.first_line); } | KW_MAX { $$ = new RangeEndpoint(RangeEndpoint::MAX); $$->set_location(asn1_infile, @1.first_line); } ; /* 47.5.1 page 71 */ SizeConstraint: KW_SIZE Constraint { $$ = new SizeConstraint($2); $$->set_location(asn1_infile, @1.first_line); } ; /* 47.7.1 page 72 */ PermittedAlphabet: KW_FROM Constraint { $$ = new PermittedAlphabetConstraint($2); $$->set_location(asn1_infile, @1.first_line); } ; /* 47.8.1 page 72 */ InnerTypeConstraints: KW_WITH KW_COMPONENT SingleTypeConstraint { $$ = $3; $$->set_location(asn1_infile, @1.first_line); } | KW_WITH KW_COMPONENTS TOK_Block { $$ = new UnparsedMultipleInnerTypeConstraint($3); $$->set_location(asn1_infile, @1.first_line); } ; /* 47.8.3 page 72 */ SingleTypeConstraint: Constraint { $$ = new SingleInnerTypeConstraint($1); $$->set_location(asn1_infile, @1.first_line); } ; /* 47.8.4 page 72 */ MultipleTypeConstraints: TypeConstraints { $$ = $1; $$->set_partial(false); $$->set_location(asn1_infile, @1.first_line); } | TOK_Ellipsis "," TypeConstraints { $$ = $3; $$->set_partial(true); $$->set_location(asn1_infile, @1.first_line); } ; TypeConstraints: NamedConstraint { $$ = new MultipleInnerTypeConstraint(); $$->addNamedConstraint($1); } | TypeConstraints "," NamedConstraint { $$ = $1; $$->addNamedConstraint($3); } | error NamedConstraint { $$ = new MultipleInnerTypeConstraint(); $$->addNamedConstraint($2); } | TypeConstraints error { $$ = $1; } ; NamedConstraint: TOK_LowerIdentifier ValueConstraint PresenceConstraint { $$ = new NamedConstraint($1, $2, $3); $$->set_location(asn1_infile, @1.first_line); } ; ValueConstraint: Constraint { $$ = $1; } | /* empty */ { $$ = NULL; } ; PresenceConstraint: KW_PRESENT { $$ = NamedConstraint::PC_PRESENT; } | KW_ABSENT { $$ = NamedConstraint::PC_ABSENT; } | KW_OPTIONAL { $$ = NamedConstraint::PC_OPTIONAL; } | /* empty */ { $$ = NamedConstraint::PC_NONE; } ; /* 47.9.1 page 73 */ PatternConstraint: KW_PATTERN Value { $$ = new PatternConstraint($2); $$->set_location(asn1_infile, @1.first_line); } ; /* X.682 clause 8.1 */ GeneralConstraint: UserDefinedConstraint { $$ = new IgnoredConstraint("user defined constraint"); $$->set_location(asn1_infile, @1.first_line); } | TableConstraint { $$=$1; } | ContentsConstraint /* TODO? */ { $$ = new IgnoredConstraint("content constraint"); $$->set_location(asn1_infile, @1.first_line); } ; /* X.682 clause 9.1 */ UserDefinedConstraint: KW_CONSTRAINED KW_BY TOK_Block {delete $3;} ; /* X.682 clause 11.1 */ ContentsConstraint: KW_CONTAINING Type {delete $2;} | KW_ENCODED KW_BY Value {delete $3;} | KW_CONTAINING Type KW_ENCODED KW_BY Value {delete $2; delete $5;} ; /* X.682 clause 10.3 */ TableConstraint: /* SimpleTableConstraint | */ ComponentRelationConstraint { $$ = $1; } ; /* commented out to eliminate reduce/reduce conflicts: SimpleTableConstraint containing TOK_Block is reachable by path Constraint->SubtypeConstraint->...->SingleValue->Value->TOK_Block SimpleTableConstraint: ObjectSetSpec ; */ /* X.682 clause 10.7 */ /* the first block contains DefinedObjectSet, the second AtNotationList */ ComponentRelationConstraint: TOK_Block TOK_Block {$$=new TableConstraint($1, $2);} ; DefinedObjectSetBlock: RefdUpper {$$=new OS_refd($1);} ; AtNotationList: AtNotation {$$=new AtNotations(); $$->add_an($1);} | AtNotationList "," AtNotation {$$=$1; $$->add_an($3);} | error AtNotation {$$=new AtNotations(); $$->add_an($2);} | AtNotationList error {$$=$1;} ; AtNotation: // No `BIGNUM' for Levels. "@" Levels ComponentIdList {$$=new AtNotation($2, $3);} ; Levels: /* empty */ {$$=0;} | Level {$$=$1;} ; Level: "." {$$=1;} | TOK_RangeSeparator {$$=2;} /* ".." */ | TOK_Ellipsis {$$=3;} /* "..." */ | Level "." {$$=$1+1;} | Level TOK_RangeSeparator {$$=$1+2;} | Level TOK_Ellipsis {$$=$1+3;} ; ComponentIdList: TOK_LowerIdentifier {$$=new FieldName(); $$->add_field($1);} | ComponentIdList "." TOK_LowerIdentifier {$$=$1; $$->add_field($3);} ; /********************************************************************* * X.681 - stuff *********************************************************************/ //ObjectClass: // DefinedObjectClass {$$=$1;} //| ObjectClassDefn {$$=$1;} ///* //| ParameterizedObjectClass // */ //; //DefinedObjectClass: // DefdUpper // { // $$=new OC_refd($1); // $$->set_location(asn1_infile, @1.first_line); // } //; /* UsefulObjectClassReference: KW_TYPE_IDENTIFIER | KW_ABSTRACT_SYNTAX ; */ /* X.681 clause 9.3 */ ObjectClassDefn: KW_CLASS TOK_Block WithSyntaxSpec_opt { $$=new OC_defn($2, $3); $$->set_location(asn1_infile, @1.first_line); } ; FieldSpecList: FieldSpec { $$=new FieldSpecs(); $$->add_fs($1); $1->set_location(asn1_infile, @1.first_line); } | FieldSpecList "," FieldSpec { $$=$1; $$->add_fs($3); $3->set_location(asn1_infile, @3.first_line); } | error FieldSpec { $$=new FieldSpecs(); $$->add_fs($2); $2->set_location(asn1_infile, @2.first_line); } | FieldSpecList error {$$=$1;} ; /* X.681 clause 9.4 */ /** \todo add support for ValueSet and VariableType FieldSpecs * (new AST nodes are required) */ FieldSpec: TypeFieldSpec {$$=$1;} | FixedTypeValueFieldSpec {$$=$1;} /* | VariableTypeValueFieldSpec {$$=$1;} | FixedTypeValueSetFieldSpec {$$=$1;} | VariableTypeValueSetFieldSpec {$$=$1;} | ObjectFieldSpec {$$=$1;} | ObjectSetFieldSpec {$$=$1;} */ | UndefFieldSpec {$$=$1;} ; UNIQ_opt: KW_UNIQUE {$$=true;} | /* empty */ {$$=false;} ; Dflt_Type: KW_DEFAULT Type {$$=$2;} ; Dflt_Value: KW_DEFAULT Value {$$=$2;} ; Dflt_Value_reg: KW_DEFAULT Value_reg {$$=$2;} ; Dflt_NullValue: KW_DEFAULT NullValue {$$=$2;} ; Dflt_Block: KW_DEFAULT TOK_Block {$$=$2;} ; Dflt_RefdLower: KW_DEFAULT RefdLower {$$=$2;} ; Dflt_RefdLower_reg: KW_DEFAULT RefdLower_reg {$$=$2;} ; Dflt_LowerId: KW_DEFAULT TOK_LowerIdentifier {$$=$2;} ; TypeFieldSpec: TOK_ampUpperIdentifier {$$=new FieldSpec_T($1, false, 0);} | TOK_ampUpperIdentifier KW_OPTIONAL {$$=new FieldSpec_T($1, true, 0);} | TOK_ampUpperIdentifier Dflt_Type {$$=new FieldSpec_T($1, false, $2);} ; FixedTypeValueFieldSpec: /* 1 */ TOK_ampLowerIdentifier Type_reg UNIQ_opt {$$=new FieldSpec_V_FT($1, $2, $3, false, 0);} | TOK_ampLowerIdentifier Type_reg UNIQ_opt KW_OPTIONAL {$$=new FieldSpec_V_FT($1, $2, $3, true, 0);} | TOK_ampLowerIdentifier Type_reg UNIQ_opt Dflt_Value {$$=new FieldSpec_V_FT($1, $2, $3, false, $4);} /* 2 */ | TOK_ampLowerIdentifier UpperFromObj UNIQ_opt { Type *t = new Type(Type::T_REFD, $2); t->set_location(asn1_infile, @2.first_line); $$=new FieldSpec_V_FT($1, t, $3, false, 0); } | TOK_ampLowerIdentifier UpperFromObj UNIQ_opt KW_OPTIONAL { Type *t = new Type(Type::T_REFD, $2); t->set_location(asn1_infile, @2.first_line); $$=new FieldSpec_V_FT($1, t, $3, true, 0); } | TOK_ampLowerIdentifier UpperFromObj UNIQ_opt Dflt_Value { Type *t = new Type(Type::T_REFD, $2); t->set_location(asn1_infile, @2.first_line); $$=new FieldSpec_V_FT($1, t, $3, false, $4); } /* 3 */ | TOK_ampLowerIdentifier DefdUpper KW_UNIQUE { Type *t = new Type(Type::T_REFD, $2); t->set_location(asn1_infile, @2.first_line); $$=new FieldSpec_V_FT($1, t, true, false, 0); } | TOK_ampLowerIdentifier DefdUpper KW_UNIQUE KW_OPTIONAL { Type *t = new Type(Type::T_REFD, $2); t->set_location(asn1_infile, @2.first_line); $$=new FieldSpec_V_FT($1, t, true, true, 0); } | TOK_ampLowerIdentifier DefdUpper KW_UNIQUE Dflt_Value_reg { Type *t = new Type(Type::T_REFD, $2); t->set_location(asn1_infile, @2.first_line); $$=new FieldSpec_V_FT($1, t, true, false, $4); } | TOK_ampLowerIdentifier SimplDefdUpper Dflt_Value_reg { Type *t = new Type(Type::T_REFD, $2); t->set_location(asn1_infile, @2.first_line); $$=new FieldSpec_V_FT($1, t, false, false, $3); } | TOK_ampLowerIdentifier PardUpper Dflt_Value_reg { Type *t = new Type(Type::T_REFD, $2); t->set_location(asn1_infile, @2.first_line); $$=new FieldSpec_V_FT($1, t, false, false, $3); } /* 4 */ | TOK_ampLowerIdentifier DefdUpper KW_UNIQUE Dflt_NullValue { Type *t = new Type(Type::T_REFD, $2); t->set_location(asn1_infile, @2.first_line); $$=new FieldSpec_V_FT($1, t, true, false, $4); } | TOK_ampLowerIdentifier SimplDefdUpper Dflt_NullValue { Type *t = new Type(Type::T_REFD, $2); t->set_location(asn1_infile, @2.first_line); $$=new FieldSpec_V_FT($1, t, false, false, $3); } | TOK_ampLowerIdentifier PardUpper Dflt_NullValue { Type *t = new Type(Type::T_REFD, $2); t->set_location(asn1_infile, @2.first_line); $$=new FieldSpec_V_FT($1, t, false, false, $3); } /* 5 */ | TOK_ampLowerIdentifier DefdUpper KW_UNIQUE Dflt_Block { Type *t = new Type(Type::T_REFD, $2); t->set_location(asn1_infile, @2.first_line); Value *v = new Value(Value::V_UNDEF_BLOCK, $4); v->set_location(asn1_infile, @4.first_line); $$=new FieldSpec_V_FT($1, t, true, false, v); } /* 6 */ | TOK_ampLowerIdentifier DefdUpper KW_UNIQUE Dflt_LowerId { Type *t = new Type(Type::T_REFD, $2); t->set_location(asn1_infile, @2.first_line); Value *v = new Value(Value::V_UNDEF_LOWERID, $4); v->set_location(asn1_infile, @4.first_line); $$=new FieldSpec_V_FT($1, t, true, false, v); } /* 7 */ | TOK_ampLowerIdentifier DefdUpper KW_UNIQUE Dflt_RefdLower_reg { Type *t = new Type(Type::T_REFD, $2); t->set_location(asn1_infile, @2.first_line); Value *v = new Value(Value::V_REFD, $4); v->set_location(asn1_infile, @4.first_line); $$=new FieldSpec_V_FT($1, t, true, false, v); } /* 8-9 */ | TOK_ampLowerIdentifier PardUpper { Type *t = new Type(Type::T_REFD, $2); t->set_location(asn1_infile, @2.first_line); $$=new FieldSpec_V_FT($1, t, false, false, 0); } | TOK_ampLowerIdentifier PardUpper KW_OPTIONAL { Type *t = new Type(Type::T_REFD, $2); t->set_location(asn1_infile, @2.first_line); $$=new FieldSpec_V_FT($1, t, false, true, 0); } | TOK_ampLowerIdentifier PardUpper Dflt_Block { Type *t = new Type(Type::T_REFD, $2); t->set_location(asn1_infile, @2.first_line); Value *v = new Value(Value::V_UNDEF_BLOCK, $3); v->set_location(asn1_infile, @3.first_line); $$=new FieldSpec_V_FT($1, t, false, false, v); } | TOK_ampLowerIdentifier PardUpper Dflt_LowerId { Type *t = new Type(Type::T_REFD, $2); t->set_location(asn1_infile, @2.first_line); Value *v = new Value(Value::V_UNDEF_LOWERID, $3); v->set_location(asn1_infile, @3.first_line); $$=new FieldSpec_V_FT($1, t, false, false, v); } | TOK_ampLowerIdentifier PardUpper Dflt_RefdLower_reg { Type *t = new Type(Type::T_REFD, $2); t->set_location(asn1_infile, @2.first_line); Value *v = new Value(Value::V_REFD, $3); v->set_location(asn1_infile, @3.first_line); $$=new FieldSpec_V_FT($1, t, false, false, v); } /* ObjectClassFieldType */ /* UpperFromObjs szetbombazva */ | TOK_ampLowerIdentifier PardUpper_FromObjs UNIQ_opt { Type *t=new Type(Type::T_REFD, $2); t->set_location(asn1_infile, @2.first_line); $$=new FieldSpec_V_FT($1, t, $3, false, 0); } /* SimplUpper_FromObjs szetbombazva */ | TOK_ampLowerIdentifier SimplDefdUpper "." FieldNameLower UNIQ_opt { FromObj *fo=new FromObj($2, $4); fo->set_location(asn1_infile, @2.first_line); Type *t=new Type(Type::T_REFD, fo); t->set_location(asn1_infile, @2.first_line); $$=new FieldSpec_V_FT($1, t, $5, false, 0); } | TOK_ampLowerIdentifier SimplDefdUpper "." FieldNameUpper UNIQ_opt { FromObj *fo=new FromObj($2, $4); fo->set_location(asn1_infile, @2.first_line); Type *t=new Type(Type::T_REFD, fo); t->set_location(asn1_infile, @2.first_line); $$=new FieldSpec_V_FT($1, t, $5, false, 0); } | TOK_ampLowerIdentifier SimplDefdUpper "." FieldNameUppers UNIQ_opt { FromObj *fo=new FromObj($2, $4); fo->set_location(asn1_infile, @2.first_line); Type *t=new Type(Type::T_REFD, fo); t->set_location(asn1_infile, @2.first_line); $$=new FieldSpec_V_FT($1, t, $5, false, 0); } /* UpperFromObjs szetbombazva */ | TOK_ampLowerIdentifier PardUpper_FromObjs UNIQ_opt KW_OPTIONAL { Type *t=new Type(Type::T_REFD, $2); t->set_location(asn1_infile, @2.first_line); $$=new FieldSpec_V_FT($1, t, $3, true, 0); } /* SimplUpper_FromObjs szetbombazva */ | TOK_ampLowerIdentifier SimplDefdUpper "." FieldNameLower UNIQ_opt KW_OPTIONAL { FromObj *fo=new FromObj($2, $4); fo->set_location(asn1_infile, @2.first_line); Type *t=new Type(Type::T_REFD, fo); t->set_location(asn1_infile, @2.first_line); $$=new FieldSpec_V_FT($1, t, $5, true, 0); } | TOK_ampLowerIdentifier SimplDefdUpper "." FieldNameUpper UNIQ_opt KW_OPTIONAL { FromObj *fo=new FromObj($2, $4); fo->set_location(asn1_infile, @2.first_line); Type *t=new Type(Type::T_REFD, fo); t->set_location(asn1_infile, @2.first_line); $$=new FieldSpec_V_FT($1, t, $5, true, 0); } | TOK_ampLowerIdentifier SimplDefdUpper "." FieldNameUppers UNIQ_opt KW_OPTIONAL { FromObj *fo=new FromObj($2, $4); fo->set_location(asn1_infile, @2.first_line); Type *t=new Type(Type::T_REFD, fo); t->set_location(asn1_infile, @2.first_line); $$=new FieldSpec_V_FT($1, t, $5, true, 0); } /* UpperFromObjs szetbombazva */ | TOK_ampLowerIdentifier PardUpper_FromObjs UNIQ_opt Dflt_Value { Type *t=new Type(Type::T_REFD, $2); t->set_location(asn1_infile, @2.first_line); $$=new FieldSpec_V_FT($1, t, $3, false, $4); } /* SimplUpper_FromObjs szetbombazva */ | TOK_ampLowerIdentifier SimplDefdUpper "." FieldNameLower UNIQ_opt Dflt_Value { FromObj *fo=new FromObj($2, $4); fo->set_location(asn1_infile, @2.first_line); Type *t=new Type(Type::T_REFD, fo); t->set_location(asn1_infile, @2.first_line); $$=new FieldSpec_V_FT($1, t, $5, false, $6); } | TOK_ampLowerIdentifier SimplDefdUpper "." FieldNameUpper UNIQ_opt Dflt_Value { FromObj *fo=new FromObj($2, $4); fo->set_location(asn1_infile, @2.first_line); Type *t=new Type(Type::T_REFD, fo); t->set_location(asn1_infile, @2.first_line); $$=new FieldSpec_V_FT($1, t, $5, false, $6); } | TOK_ampLowerIdentifier SimplDefdUpper "." FieldNameUppers UNIQ_opt Dflt_Value { FromObj *fo=new FromObj($2, $4); fo->set_location(asn1_infile, @2.first_line); Type *t=new Type(Type::T_REFD, fo); t->set_location(asn1_infile, @2.first_line); $$=new FieldSpec_V_FT($1, t, $5, false, $6); } ; /** \todo PardUpper as governor can be either Type or OC reference * the respective rules of FixedTypeValueFieldSpec should be moved here */ UndefFieldSpec: /* &lower */ TOK_ampLowerIdentifier SimplDefdUpper {$$=new FieldSpec_Undef($1, $2, false, 0);} | TOK_ampLowerIdentifier SimplDefdUpper KW_OPTIONAL {$$=new FieldSpec_Undef($1, $2, true, 0);} | TOK_ampLowerIdentifier SimplDefdUpper Dflt_Block {$$=new FieldSpec_Undef($1, $2, false, $3);} | TOK_ampLowerIdentifier SimplDefdUpper Dflt_RefdLower {$$=new FieldSpec_Undef($1, $2, false, $3);} /* &upper */ | TOK_ampUpperIdentifier SimplDefdUpper {$$=new FieldSpec_Undef($1, $2, false, 0);} | TOK_ampUpperIdentifier SimplDefdUpper KW_OPTIONAL {$$=new FieldSpec_Undef($1, $2, true, 0);} | TOK_ampUpperIdentifier SimplDefdUpper Dflt_Block {$$=new FieldSpec_Undef($1, $2, false, $3);} ; /* VariableTypeValueFieldSpec: TOK_ampLowerIdentifier FieldName {} ; FixedTypeValueSetFieldSpec: TOK_ampUpperIdentifier Type ValueSetOptionalitySpec {} ; ValueSetOptionalitySpec: KW_OPTIONAL {} | KW_DEFAULT ValueSet {} | / * empty * / {} ; VariableTypeValueSetFieldSpec: TOK_ampUpperIdentifier FieldName ValueSetOptionalitySpec {} ; ObjectFieldSpec: TOK_ampLowerIdentifier DefinedObjectClass ObjectOptionalitySpec {} ; ObjectOptionalitySpec: KW_OPTIONAL {} | KW_DEFAULT Object {} | / * empty * / {} ; ObjectSetFieldSpec: TOK_ampUpperIdentifier DefinedObjectClass ObjectSetOptionalitySpec {} ; ObjectSetOptionalitySpec: KW_OPTIONAL {} | KW_DEFAULT ObjectSet {} | / * empty * / {} ; */ WithSyntaxSpec_opt: KW_WITH KW_SYNTAX TOK_Block {$$=$3;} | /* empty */ {$$=0;} ; Object: DefinedObject {$$=$1;} | ObjectDefn {$$=$1;} /* | ObjectFromObject | ParameterizedObject */ ; DefinedObject: RefdLower { $$=new Obj_refd($1); $$->set_location(asn1_infile, @1.first_line); } ; ObjectDefn: TOK_Block { $$=new Obj_defn($1); $$->set_location(asn1_infile, @1.first_line); } ; ObjectSet: TOK_Block { $$=new OS_defn($1); $$->set_location(asn1_infile, @1.first_line); } ; ObjectSetElements: Object {$$=$1;} | RefdUpper { OS_refd *os_refd=new OS_refd($1); os_refd->set_location(asn1_infile, @1.first_line); $$=os_refd; } ; ObjectSetSpec: ObjectSetSpec0 {$$=$1;} | ObjectSetSpec0 "," TOK_Ellipsis {$$=$1;} | TOK_Ellipsis {$$=new OS_defn(); $$->set_location(asn1_infile, @1.first_line);} | TOK_Ellipsis "," ObjectSetSpec0 {$$=$3;} | ObjectSetSpec0 "," TOK_Ellipsis "," ObjectSetSpec0 {$$=$1; $$->steal_oses($5);} ; /* this is a temporary solution. only unions are supported (intersections, and except are not...) */ ObjectSetSpec0: ObjectSetElements { $$=new OS_defn(); $$->set_location(asn1_infile, @1.first_line); $$->add_ose($1); } | ObjectSetSpec0 UnionMark ObjectSetElements {$$=$1; $$->add_ose($3);} | error ObjectSetElements { $$=new OS_defn(); $$->set_location(asn1_infile, @2.first_line); $$->add_ose($2); } | ObjectSetSpec0 error {$$=$1;} ; /********************************************************************* * Type - stuff *********************************************************************/ /* 16.3 page 30 */ ReferencedType: RefdUpper {$$=new Type(Type::T_REFD, $1);} /* includes TypeFromObject, ValueSetFromObjects and DefinedType */ /* | SelectionType {$$=$1;} */ ; //DefinedType: // DefdUpper {$$=new Type_refd($1);} ///* //| ParameterizedType //| ParameterizedValueSetType //*/ //; /********************************************************************* * Value - stuff *********************************************************************/ /* 16.7 page 31 */ Value: ObjectClassFieldValue {$$=$1; $$->set_location(asn1_infile, @1.first_line);} ; Value_reg: ObjectClassFieldValue_reg {$$=$1; $$->set_location(asn1_infile, @1.first_line);} ; ObjectClassFieldValue: FixedTypeFieldValue {$$=$1;} /* | OpenTypeFieldValue */ ; ObjectClassFieldValue_reg: FixedTypeFieldValue_reg {$$=$1;} /* | OpenTypeFieldValue */ ; FixedTypeFieldValue: BuiltinValue {$$=$1;} | ReferencedValue_reg {$$=$1;} ; FixedTypeFieldValue_reg: BuiltinValue_reg {$$=$1;} ; ReferencedValue: RefdLower { $$=new Value(Value::V_REFD, $1); $$->set_location(asn1_infile, @1.first_line); } /* | ValueFromObject */ ; ReferencedValue_reg: RefdLower_reg { $$=new Value(Value::V_REFD, $1); $$->set_location(asn1_infile, @1.first_line); } /* | ValueFromObject */ ; DefinedValue: DefdLower { $$=new Value(Value::V_REFD, $1); $$->set_location(asn1_infile, @1.first_line); } ; DefinedValue_reg: DefdLower_reg { $$=new Value(Value::V_REFD, $1); $$->set_location(asn1_infile, @1.first_line); } /* | ParameterizedValue */ ; Val_Number: TOK_Number {$$=new Value(Value::V_INT, $1);} ; Val_CString: TOK_CString {$$=new Value(Value::V_CSTR, $1);} ; /********************************************************************* * Named Type/Value *********************************************************************/ NamedType: TOK_LowerIdentifier Type { $$.name = $1; $$.type = $2; } ; NamedValue: TOK_LowerIdentifier Value { $$=new NamedValue($1, $2); $$->set_location(asn1_infile, @1.first_line); } ; /********************************************************************* * FieldName stuff *********************************************************************/ /* FieldName: PrimitiveFieldNameList {} ; PrimitiveFieldNameList: PrimitiveFieldName {} | PrimitiveFieldNameList "." PrimitiveFieldName {} ; PrimitiveFieldName: TOK_ampUpperIdentifier {} | TOK_ampLowerIdentifier {} ; */ FieldNameLower: TOK_ampLowerIdentifier {$$=new FieldName(); $$->add_field($1);} | FieldNameLower "." TOK_ampLowerIdentifier {$$=$1; $$->add_field($3);} ; FieldNameUpper: TOK_ampUpperIdentifier {$$=new FieldName(); $$->add_field($1);} | FieldNameLower "." TOK_ampUpperIdentifier {$$=$1; $$->add_field($3);} ; FieldNameUppers: FieldNameUpper "." TOK_ampLowerIdentifier {$$=$1; $$->add_field($3);} | FieldNameUpper "." TOK_ampUpperIdentifier {$$=$1; $$->add_field($3);} | FieldNameUppers "." TOK_ampLowerIdentifier {$$=$1; $$->add_field($3);} | FieldNameUppers "." TOK_ampUpperIdentifier {$$=$1; $$->add_field($3);} ; /********************************************************************* * Referenced upper stuff *********************************************************************/ RefdUpper: DefdUpper {$$=$1;} | UpperFromObj {$$=$1;} | FromObjs {$$=$1;} ; UpperFromObj: DefdLower "." FieldNameUpper { $$=new FromObj($1, $3); $$->set_location(asn1_infile, @1.first_line); } ; FromObjs: Upper_FromObjs {$$=$1;} | Lower_FromObjs {$$=$1;} ; /* Upper_FromObjs: DefdUpper "." FieldNameLower { $$=new FromObj($1, $3); $$->set_location(asn1_infile, @1.first_line); } | DefdUpper "." FieldNameUpper { $$=new FromObj($1, $3); $$->set_location(asn1_infile, @1.first_line); } | DefdUpper "." FieldNameUppers { $$=new FromObj($1, $3); $$->set_location(asn1_infile, @1.first_line); } ; */ Upper_FromObjs: SimplUpper_FromObjs {$$=$1;} | PardUpper_FromObjs {$$=$1;} ; SimplUpper_FromObjs: SimplDefdUpper "." FieldNameLower { $$=new FromObj($1, $3); $$->set_location(asn1_infile, @1.first_line); } | SimplDefdUpper "." FieldNameUpper { $$=new FromObj($1, $3); $$->set_location(asn1_infile, @1.first_line); } | SimplDefdUpper "." FieldNameUppers { $$=new FromObj($1, $3); $$->set_location(asn1_infile, @1.first_line); } ; PardUpper_FromObjs: PardUpper "." FieldNameLower { $$=new FromObj($1, $3); $$->set_location(asn1_infile, @1.first_line); } | PardUpper "." FieldNameUpper { $$=new FromObj($1, $3); $$->set_location(asn1_infile, @1.first_line); } | PardUpper "." FieldNameUppers { $$=new FromObj($1, $3); $$->set_location(asn1_infile, @1.first_line); } ; Lower_FromObjs: DefdLower "." FieldNameUppers { $$=new FromObj($1, $3); $$->set_location(asn1_infile, @1.first_line); } ; DefdUpper: SimplDefdUpper {$$=$1;} | PardUpper {$$=$1;} ; PardUpper: SimplDefdUpper TOK_Block { $$=new Ref_pard($1, $2); $$->set_location(asn1_infile, @1.first_line); } ; SimplDefdUpper: ExtUpperRef {$$=$1;} | UpperRef {$$=$1;} ; ExtUpperRef: TOK_UpperIdentifier "." TOK_UpperIdentifier { $$=new Ref_defd_simple($1, $3); $$->set_location(asn1_infile, @1.first_line); } ; UpperRef: TOK_UpperIdentifier { $$=new Ref_defd_simple(0, $1); $$->set_location(asn1_infile, @1.first_line); } ; /********************************************************************* * Referenced lower stuff *********************************************************************/ RefdLower_reg: DefdLower_reg {$$=$1;} | LowerFromObj {$$=$1;} ; RefdLower: DefdLower {$$=$1;} | LowerFromObj {$$=$1;} ; LowerFromObj: DefdLower "." FieldNameLower { $$=new FromObj($1, $3); $$->set_location(asn1_infile, @1.first_line); } ; DefdLower_reg: SimplDefdLower_reg {$$=$1;} | PardLower {$$=$1;} ; DefdLower: SimplDefdLower {$$=$1;} | PardLower {$$=$1;} ; PardLower: SimplDefdLower TOK_Block { $$=new Ref_pard($1, $2); $$->set_location(asn1_infile, @1.first_line); } ; SimplDefdLower_reg: ExtLowerRef {$$=$1;} ; SimplDefdLower: ExtLowerRef {$$=$1;} | LowerRef {$$=$1;} ; ExtLowerRef: TOK_UpperIdentifier "." TOK_LowerIdentifier { $$=new Ref_defd_simple($1, $3); $$->set_location(asn1_infile, @1.first_line); } ; LowerRef: TOK_LowerIdentifier { $$=new Ref_defd_simple(0, $1); $$->set_location(asn1_infile, @1.first_line); } ; %% /********************************************************************* * Interface *********************************************************************/ int asn1_parse_file(const char* filename, boolean generate_code) { asn1_yy_parse_internal=false; int retval=0; asn1la_newfile(filename); yyin=fopen(filename, "r"); if(yyin==NULL) { ERROR("Cannot open input file `%s': %s", filename, strerror(errno)); return -1; } yy_buffer_state *flex_buffer = asn1_yy_create_buffer(yyin, YY_BUF_SIZE); asn1_yy_switch_to_buffer(flex_buffer); act_asn1_module=0; NOTIFY("Parsing ASN.1 module `%s'...", filename); retval=yyparse(); fclose(yyin); asn1_yylex_destroy(); if(retval==0 && act_asn1_module!=0) { act_asn1_module->set_location(filename); if (generate_code) act_asn1_module->set_gen_code(); modules->add_mod(act_asn1_module); } act_asn1_module=0; return retval; } /** * This functions is used to parse internal stuff. :) */ int asn1_parse_string(const char* p_str) { unsigned verb_level_backup=verb_level; verb_level=0; // be vewy, vewy quiet asn1la_newfile(""); asn1_yy_parse_internal=true; yy_buffer_state *flex_buffer = asn1_yy_scan_string(p_str); if(flex_buffer == NULL) { ERROR("Flex buffer creation failed."); verb_level=verb_level_backup; return -1; } int retval=yyparse(); asn1_yylex_destroy(); verb_level=verb_level_backup; return retval; }