#line 1 "main.ll" /* Copyright (C) Boris Nikolaus, Germany, 1996-1997. All rights reserved. */ /* Copyright (C) Microsoft Corporation, 1997-1998. All rights reserved. */ %{ #include #include #include #include "defs.h" #include "builtin.h" #include "hackdir.h" extern int pass; %} %union{ char *XString; char32_t *XString32; intx_t XNumber; ASN1bool_t XBoolean; Type_t *XType; TagType_e XTagType; TagClass_e XTagClass; Tag_t *XTags; ExtensionType_e XExtensionType; NamedType_t *XNamedType; ComponentList_t XComponents; Constraint_t *XConstraints; ElementSetSpec_t *XElementSetSpec; SubtypeElement_t *XSubtypeElement; ObjectSetElement_t *XObjectSetElement; DirectiveList_t XDirectives; NamedConstraintList_t XNamedConstraints; Presence_e XPresence; NamedNumberList_t XNamedNumbers; Value_t *XValue; ValueSet_t *XValueSet; EndPoint_t XEndPoint; Tuple_t XTuple; Quadruple_t XQuadruple; NamedValueList_t XNamedValues; ModuleIdentifier_t *XModuleIdentifier; NamedObjIdValueList_t XNamedObjIdValue; ObjectClass_t *XObjectClass; ObjectSet_t *XObjectSet; Object_t *XObject; SyntaxSpecList_t XSyntaxSpecs; FieldSpecList_t XFieldSpecs; Optionality_t *XOptionality; SettingList_t XSettings; StringList_t XStrings; StringModuleList_t XStringModules; Macro_t *XMacro; MacroProduction_t *XMacroProduction; NamedMacroProductionList_t XMacroProductions; MacroLocalAssignmentList_t XMacroLocalAssignments; PrivateDirectives_t *XPrivateDirectives; } %state { AssignmentList_t Assignments; AssignedObjIdList_t AssignedObjIds; UndefinedSymbolList_t Undefined; UndefinedSymbolList_t BadlyDefined; ModuleIdentifier_t *Module; ModuleIdentifier_t *MainModule; StringModuleList_t Imported; TagType_e TagDefault; ExtensionType_e ExtensionDefault; } %token "::=" = DEF %token ".." = DDOT %token "..." = TDOT %token "TYPE-IDENTIFIER" = TYPE_IDENTIFIER %token "ABSTRACT-SYNTAX" = ABSTRACT_SYNTAX %token "--$zero-terminated--" = ZERO_TERMINATED %token "--$pointer--" = POINTER %token "--$no-pointer--" = NO_POINTER %token "--$fixed-array--" = FIXED_ARRAY %token "--$singly-linked-list--" = SINGLY_LINKED_LIST %token "--$doubly-linked-list--" = DOUBLY_LINKED_LIST %token "--$length-pointer--" = LENGTH_POINTER %token "number" = Number %token number %token bstring %token hstring %token cstring %token only_uppercase_symbol %token only_uppercase_digits_symbol %token uppercase_symbol %token lcsymbol %token ampucsymbol %token amplcsymbol %prefix T_ %type ModuleIdentifier %type DefinitiveIdentifier %type DefinitiveObjIdComponentList %type DefinitiveObjIdComponent %type DefinitiveNumberForm %type DefinitiveNameAndNumberForm %type TagDefault %type ExtensionDefault %type GlobalModuleReference %type AssignedIdentifier %type Exports %type SymbolsExported %type Imports %type SymbolsImported %type SymbolsFromModule_ESeq %type SymbolsFromModule %type SymbolList %type Symbol %type Reference %type typereference %type Externaltypereference %type valuereference %type Externalvaluereference %type objectclassreference %type ExternalObjectClassReference %type objectreference %type ExternalObjectReference %type objectsetreference %type ExternalObjectSetReference %type modulereference %type macroreference %type Externalmacroreference %type localtypereference %type localvaluereference %type productionreference %type typefieldreference %type valuefieldreference %type valuesetfieldreference %type objectfieldreference %type objectsetfieldreference %type word %type identifier %type ucsymbol %type ocsymbol %type astring %start Main #line 1 "type.ll" /* Copyright (C) Boris Nikolaus, Germany, 1996-1997. All rights reserved. */ /* Copyright (C) Microsoft Corporation, 1997-1998. All rights reserved. */ %type DefinedType %type ValueSet %type Type %type UndirectivedType %type UntaggedType %type ConstrainableType %type Constraint_ESeq %type BuiltinType %type ReferencedType %type NamedType %type BooleanType %type IntegerType %type NamedNumberList %type NamedNumber %type EnumeratedType %type Enumerations %type EnumerationExtension %type Enumeration %type EnumerationItem %type RealType %type BitStringType %type NamedBitList %type NamedBit %type OctetStringType %type UTF8StringType %type NullType %type SequenceType %type ExtensionAndException %type ExtendedComponentTypeList %type ComponentTypeListExtension %type AdditionalComponentTypeList %type ComponentTypeList %type ComponentType %type ComponentTypePostfix %type SequenceOfType %type SetType %type SetOfType %type ChoiceType %type AnyType %type ExtendedAlternativeTypeList %type AlternativeTypeListExtension %type AdditionalAlternativeTypeList %type AlternativeTypeList %type SelectionType %type TaggedType %type TagType %type Tag %type ClassNumber %type Class %type ObjectIdentifierType %type EmbeddedPDVType %type ExternalType %type CharacterStringType %type RestrictedCharacterStringType %type UnrestrictedCharacterStringType %type UsefulType %type TypeWithConstraint #line 1 "value.ll" /* Copyright (C) Boris Nikolaus, Germany, 1996-1997. All rights reserved. */ /* Copyright (C) Microsoft Corporation, 1997-1998. All rights reserved. */ %type DefinedValue %type Value %type BuiltinValue %type ReferencedValue %type NamedValue %type BooleanValue %type SignedNumber %type IntegerValue %type EnumeratedValue %type RealValue %type NumericRealValue %type SpecialRealValue %type BitStringValue %type IdentifierList %type Identifier_EList %type IdentifierList_Elem %type OctetStringValue %type NullValue %type GeneralizedTimeValue %type UTCTimeValue %type ObjectDescriptorValue %type SequenceValue %type ComponentValueList %type ComponentValueCList %type SequenceOfValue %type ValueList %type ValueCList %type SetValue %type SetOfValue %type ChoiceValue %type ObjectIdentifierValue %type ObjIdComponentList %type ObjIdComponent_ESeq %type ObjIdComponent %type NameForm %type NumberForm %type NameAndNumberForm %type EmbeddedPDVValue %type ExternalValue %type CharacterStringValue %type RestrictedCharacterStringValue %type UnrestrictedCharacterStringValue %type CharacterStringList %type CharSyms %type CharDefn %type Quadruple %type Tuple %type AnyValue #line 1 "constrai.ll" /* Copyright (C) Boris Nikolaus, Germany, 1996-1997. All rights reserved. */ /* Copyright (C) Microsoft Corporation, 1997-1998. All rights reserved. */ %token CON_XXX1 %token CON_XXX2 %type Constraint %type ConstraintSpec %type SubtypeConstraint %type ElementSetSpecs %type ElementSetSpecExtension %type AdditionalElementSetSpec %type ElementSetSpec %type Unions %type UnionList %type Intersections %type IntersectionList %type IntersectionElements %type Exclusions_Opt %type Exclusions %type Elements %type SubtypeElements %type SingleValue %type ContainedSubtype %type Includes %type ValueRange %type LowerEndpoint %type UpperEndpoint %type LowerEndValue %type UpperEndValue %type SizeConstraint %type TypeConstraint %type PermittedAlphabet %type InnerTypeConstraints %type SingleTypeConstraint %type MultipleTypeConstraints %type FullSpecification %type PartialSpecification %type TypeConstraints %type NamedConstraint %type ComponentConstraint %type ValueConstraint %type PresenceConstraint #line 1 "directiv.ll" /* Copyright (C) Boris Nikolaus, Germany, 1996-1997. All rights reserved. */ /* Copyright (C) Microsoft Corporation, 1997-1998. All rights reserved. */ %type LocalTypeDirectiveSeq %type LocalTypeDirectiveESeq %type LocalTypeDirective %type LocalSizeDirectiveSeq %type LocalSizeDirectiveESeq %type LocalSizeDirective %type PrivateDir_Field %type PrivateDir_Type %type PrivateDir_Value %type PrivateDir_Public %type PrivateDir_Intx %type PrivateDir_LenPtr %type PrivateDir_Pointer %type PrivateDir_Array %type PrivateDir_NoCode %type PrivateDir_NoMemCopy %type PrivateDir_OidPacked %type PrivateDir_OidArray %type PrivateDir_SLinked %type PrivateDir_DLinked %type PrivateDirectives #line 1 "object.ll" /* Copyright (C) Boris Nikolaus, Germany, 1996-1997. All rights reserved. */ /* Copyright (C) Microsoft Corporation, 1997-1998. All rights reserved. */ %token OBJ_XXX1 %token OBJ_XXX2 %token OBJ_XXX3 %token OBJ_XXX4 %token OBJ_XXX5 %token OBJ_XXX6 %token OBJ_XXX7 %type DefinedObjectClass %type DefinedObject %type DefinedObjectSet %type Usefulobjectclassreference %type ObjectClass %type ObjectClassDefn %type FieldSpec_List %type FieldSpec_EList %type WithSyntaxSpec_opt %type FieldSpec %type TypeFieldSpec %type TypeOptionalitySpec_opt %type FixedTypeValueFieldSpec %type UNIQUE_opt %type ValueOptionalitySpec_opt %type VariableTypeValueFieldSpec %type FixedTypeValueSetFieldSpec %type ValueSetOptionalitySpec_opt %type VariableTypeValueSetFieldSpec %type ObjectFieldSpec %type ObjectOptionalitySpec_opt %type ObjectSetFieldSpec %type ObjectSetOptionalitySpec_opt %type PrimitiveFieldName %type FieldName %type SyntaxList %type TokenOrGroupSpec_Seq %type TokenOrGroupSpec_ESeq %type TokenOrGroupSpec %type OptionalGroup %type RequiredToken %type Literal %type Object %type ObjectDefn %type DefaultSyntax %type FieldSetting_EList %type FieldSetting_EListC %type FieldSetting %type DefinedSyntax %type DefinedSyntaxToken_ESeq %type DefinedSyntaxToken %type DefinedSyntaxToken_Elem %type Setting %type ObjectSet %type ObjectSetSpec %type ObjectSetElements %type ObjectClassFieldType %type ObjectClassFieldValue %type OpenTypeFieldVal %type FixedTypeFieldVal %type ValueFromObject %type ValueSetFromObjects %type TypeFromObject %type ObjectFromObject %type ObjectSetFromObjects %type ReferencedObjects %type ReferencedObjectSets %type InstanceOfType %type InstanceOfValue #line 1 "future.ll" /* Copyright (C) Boris Nikolaus, Germany, 1996-1997. All rights reserved. */ /* Copyright (C) Microsoft Corporation, 1997-1998. All rights reserved. */ %token DUM_XXX1 %token DUM_XXX2 %token DUM_XXX3 %token DUM_XXX4 %token DUM_XXX5 %token DUM_XXX6 %token DUM_XXX7 %token DUM_XXX8 %token DUM_XXX9 %token DUM_XXX10 %token DUM_XXX11 %token DUM_XXX12 %token DUM_XXX13 %token DUM_XXX14 %token DUM_XXX15 %token DUM_XXX16 %token DUM_XXX17 %token DUM_XXX18 %token DUM_XXX19 %token DUM_XXX20 %type MacroDefinedType %type MacroDefinedValue %% #line 146 "main.ll" Main : ModuleDefinition ModuleDefinition_ESeq ; ModuleDefinition_ESeq : ModuleDefinition ModuleDefinition_ESeq | /* empty */ ; ModuleDefinition : ModuleIdentifier "DEFINITIONS" TagDefault ExtensionDefault "::=" { if (!AssignModuleIdentifier(&$<6.Assignments, $1)) LLFAILED((&@1, "Module `%s' twice defined", $1->Identifier)); $<6.MainModule = $1; $<6.Module = $1; $<6.TagDefault = $3; $<6.ExtensionDefault = $4; g_eDefTagType = $3; } "BEGIN" ModuleBody "END" { LLCUTALL; } ; ModuleIdentifier : modulereference DefinitiveIdentifier { if ($2) { $$ = NewModuleIdentifier(); $$->Identifier = $1->Identifier; $$->ObjectIdentifier = $2; } else { $$ = $1; } } ; DefinitiveIdentifier : '{' DefinitiveObjIdComponentList '}' { switch (GetAssignedObjectIdentifier( &$>>.AssignedObjIds, NULL, $2, &$$)) { case -1: LLFAILED((&@2, "Different numbers for equally named object identifier components")); /*NOTREACHED*/ case 0: $$ = NULL; break; case 1: break; } } | /* empty */ { $$ = NULL; } ; DefinitiveObjIdComponentList : DefinitiveObjIdComponent DefinitiveObjIdComponentList { $$ = DupNamedObjIdValue($1); $$->Next = $2; } | DefinitiveObjIdComponent { $$ = $1; } ; DefinitiveObjIdComponent : NameForm { $$ = $1; } | DefinitiveNumberForm { $$ = $1; } | DefinitiveNameAndNumberForm { $$ = $1; } ; DefinitiveNumberForm : number { $$ = NewNamedObjIdValue(eNamedObjIdValue_NumberForm); $$->Number = intx2uint32(&$1); } ; DefinitiveNameAndNumberForm : identifier '(' number ')' { $$ = NewNamedObjIdValue(eNamedObjIdValue_NameAndNumberForm); $$->Name = $1; $$->Number = intx2uint32(&$3); } ; TagDefault : "EXPLICIT" "TAGS" { $$ = eTagType_Explicit; } | "IMPLICIT" "TAGS" { $$ = eTagType_Implicit; } | "AUTOMATIC" "TAGS" { $$ = eTagType_Automatic; } | /* empty */ { $$ = eTagType_Explicit; } ; ExtensionDefault : "EXTENSIBILITY" "IMPLIED" { $$ = eExtensionType_Automatic; } | /* empty */ { $$ = eExtensionType_None; } ; ModuleBody : Exports Imports { $<3.Imported = $2; } AssignmentList { String_t *s; StringModule_t *sm; Assignment_t *a, **aa, *oldass; UndefinedSymbol_t *u; if ($2 != IMPORT_ALL) { for (sm = $2; sm; sm = sm->Next) { if (!FindExportedAssignment($>>.Assignments, eAssignment_Undefined, sm->String, sm->Module)) { if (FindAssignment($>>.Assignments, eAssignment_Undefined, sm->String, sm->Module)) { u = NewUndefinedSymbol( eUndefinedSymbol_SymbolNotExported, eAssignment_Undefined); } else { u = NewUndefinedSymbol( eUndefinedSymbol_SymbolNotDefined, eAssignment_Undefined); } u->U.Symbol.Identifier = sm->String; u->U.Symbol.Module = sm->Module; u->Next = $>>.Undefined; $>>.Undefined = u; continue; } if (!FindAssignmentInCurrentPass($>>.Assignments, sm->String, $>>.Module)) { a = NewAssignment(eAssignment_Reference); a->Identifier = sm->String; a->Module = $>>.Module; a->U.Reference.Identifier = sm->String; a->U.Reference.Module = sm->Module; a->Next = $>>.Assignments; $>>.Assignments = a; } } } if ($1 != EXPORT_ALL) { for (s = $1; s; s = s->Next) { if (!FindAssignment($>>.Assignments, eAssignment_Undefined, s->String, $>>.Module)) LLFAILED((&@1, "Exported symbol `%s' is undefined", s->String)); } } oldass = $>>.Assignments; for (a = $>>.Assignments, aa = &$>>.Assignments; a; a = a->Next, aa = &(*aa)->Next) { if (a->Type == eAssignment_NextPass) break; *aa = DupAssignment(a); if (!FindAssignmentInCurrentPass(a->Next, a->Identifier, a->Module) && FindAssignmentInCurrentPass(oldass, a->Identifier, a->Module) == a && !CmpModuleIdentifier(oldass, a->Module, $>>.Module) && ($1 == EXPORT_ALL || FindString($1, a->Identifier))) (*aa)->Flags |= eAssignmentFlags_Exported; } *aa = a; } | /* empty */ ; Exports : "EXPORTS" SymbolsExported ';' { String_t *s, *t; for (s = $2; s && s->Next; s = s->Next) { for (t = s->Next; t; t = t->Next) { if (!strcmp(s->String, t->String)) LLFAILED((&@2, "Symbol `%s' has been exported twice", s->String)); } } $$ = $2; } | /* empty */ { $$ = EXPORT_ALL; } ; SymbolsExported : SymbolList { $$ = $1; } | /* empty */ { $$ = NULL; } ; Imports : "IMPORTS" SymbolsImported ';' { $$ = $2; } | /* empty */ { $$ = IMPORT_ALL; } ; SymbolsImported : SymbolsFromModule_ESeq { $$ = $1; } ; SymbolsFromModule_ESeq : SymbolsFromModule SymbolsFromModule_ESeq { StringModule_t *s, **ss; for (s = $1, ss = &$$; s; s = s->Next) { *ss = DupStringModule(s); ss = &(*ss)->Next; } *ss = $2; } | /* empty */ { $$ = NULL; } ; SymbolsFromModule : SymbolList "FROM" GlobalModuleReference { String_t *s, *t; StringModule_t **ss; for (s = $1; s && s->Next; s = s->Next) { for (t = s->Next; t; t = t->Next) { if (!strcmp(s->String, t->String)) LLFAILED((&@2, "Symbol `%s' has been imported twice", s->String)); } } for (s = $1, ss = &$$; s; s = s->Next) { *ss = NewStringModule(); (*ss)->String = s->String; (*ss)->Module = $3; ss = &(*ss)->Next; } *ss = NULL; } ; GlobalModuleReference : modulereference AssignedIdentifier { $$ = NewModuleIdentifier(); $$->Identifier = $1->Identifier; $$->ObjectIdentifier = $2; } ; AssignedIdentifier : ObjectIdentifierValue { $$ = $1; } | DefinedValue { $$ = $1; } | /* empty */ { $$ = NULL; } ; SymbolList : Symbol ',' SymbolList { $$ = NewString(); $$->String = $1; $$->Next = $3; } | Symbol { $$ = NewString(); $$->String = $1; } ; Symbol : Reference { $$ = $1; } | ParameterizedReference { MyAbort(); } ; Reference : ucsymbol /* => {type,objectclass,objectset,macro}reference */ { $$ = $1; } | lcsymbol /* => {value,object}reference */ { $$ = $1; } ; AssignmentList : Assignment Assignment_ESeq ; Assignment_ESeq : Assignment Assignment_ESeq | /* empty */ ; Assignment : TypeAssignment { LLCUTALL; } | ValueAssignment { LLCUTALL; } | ValueSetTypeAssignment { LLCUTALL; } | ObjectClassAssignment { LLCUTALL; } | ObjectAssignment { LLCUTALL; } | ObjectSetAssignment { LLCUTALL; } | ParameterizedAssignment { LLCUTALL; } | MacroDefinition { LLCUTALL; } ; typereference : ucsymbol { Assignment_t *ref; UndefinedSymbol_t *u; ref = FindAssignment($>>.Assignments, eAssignment_Undefined, $1, $>>.Module); if (!ref) { u = NewUndefinedSymbol(eUndefinedSymbol_SymbolNotDefined, eAssignment_Type); u->U.Symbol.Module = $>>.Module; u->U.Symbol.Identifier = $1; u->Next = $>>.Undefined; $>>.Undefined = u; } else if (GetAssignmentType($>>.Assignments, ref) != eAssignment_Type) LLFAILED((&@1, "Symbol `%s' is not a typereference", $1)); $$ = NewType(eType_Reference); if (ref && ref->U.Type.Type) { int fPublic = ref->U.Type.Type->PrivateDirectives.fPublic; ref->U.Type.Type->PrivateDirectives.fPublic = 0; PropagateReferenceTypePrivateDirectives($$, &(ref->U.Type.Type->PrivateDirectives)); ref->U.Type.Type->PrivateDirectives.fPublic = fPublic; } $$->U.Reference.Identifier = $1; $$->U.Reference.Module = $>>.Module; } ; Externaltypereference : modulereference '.' ucsymbol { Assignment_t *ref; UndefinedSymbol_t *u; if ($>>.Imported != IMPORT_ALL && !FindStringModule($>>.Assignments, $>>.Imported, $3, $1)) LLFAILED((&@1, "Symbol `%s.%s' has not been imported", $1->Identifier, $3)); ref = FindExportedAssignment($>>.Assignments, eAssignment_Type, $3, $1); if (!ref) { if (FindAssignment($>>.Assignments, eAssignment_Type, $3, $1)) { u = NewUndefinedSymbol(eUndefinedSymbol_SymbolNotExported, eAssignment_Type); } else { u = NewUndefinedSymbol(eUndefinedSymbol_SymbolNotDefined, eAssignment_Type); } u->U.Symbol.Module = $1; u->U.Symbol.Identifier = $3; u->Next = $>>.Undefined; $>>.Undefined = u; } else if (GetAssignmentType($>>.Assignments, ref) != eAssignment_Type) LLFAILED((&@1, "Symbol `%s' is not a typereference", $1)); $$ = NewType(eType_Reference); $$->U.Reference.Identifier = $3; $$->U.Reference.Module = $1; } ; valuereference : lcsymbol { Assignment_t *ref; UndefinedSymbol_t *u; ref = FindAssignment($>>.Assignments, eAssignment_Undefined, $1, $>>.Module); if (!ref) { u = NewUndefinedSymbol(eUndefinedSymbol_SymbolNotDefined, eAssignment_Value); u->U.Symbol.Module = $>>.Module; u->U.Symbol.Identifier = $1; u->Next = $>>.Undefined; $>>.Undefined = u; } else if (GetAssignmentType($>>.Assignments, ref) != eAssignment_Value) LLFAILED((&@1, "Symbol `%s' is not a valuereference", $1)); $$ = NewValue(NULL, NULL); $$->U.Reference.Identifier = $1; $$->U.Reference.Module = $>>.Module; } ; Externalvaluereference : modulereference '.' lcsymbol { Assignment_t *ref; UndefinedSymbol_t *u; if ($>>.Imported != IMPORT_ALL && !FindStringModule($>>.Assignments, $>>.Imported, $3, $1)) LLFAILED((&@1, "Symbol `%s.%s' has not been imported", $1->Identifier, $3)); ref = FindExportedAssignment($>>.Assignments, eAssignment_Value, $3, $1); if (!ref) { if (FindAssignment($>>.Assignments, eAssignment_Value, $3, $1)) { u = NewUndefinedSymbol(eUndefinedSymbol_SymbolNotExported, eAssignment_Value); } else { u = NewUndefinedSymbol(eUndefinedSymbol_SymbolNotDefined, eAssignment_Value); } u->U.Symbol.Module = $1; u->U.Symbol.Identifier = $3; u->Next = $>>.Undefined; $>>.Undefined = u; } else if (GetAssignmentType($>>.Assignments, ref) != eAssignment_Value) LLFAILED((&@1, "Symbol `%s' is not a valuereference", $1)); $$ = NewValue(NULL, NULL); $$->U.Reference.Identifier = $3; $$->U.Reference.Module = $1; } ; objectclassreference : ocsymbol { Assignment_t *ref; UndefinedSymbol_t *u; ref = FindAssignment($>>.Assignments, eAssignment_Undefined, $1, $>>.Module); if (!ref) { u = NewUndefinedSymbol(eUndefinedSymbol_SymbolNotDefined, eAssignment_ObjectClass); u->U.Symbol.Module = $>>.Module; u->U.Symbol.Identifier = $1; u->Next = $>>.Undefined; $>>.Undefined = u; } else if (GetAssignmentType($>>.Assignments, ref) != eAssignment_ObjectClass) LLFAILED((&@1, "Symbol `%s' is not an objectclassreference", $1)); $$ = NewObjectClass(eObjectClass_Reference); $$->U.Reference.Identifier = $1; $$->U.Reference.Module = $>>.Module; } ; ExternalObjectClassReference : modulereference '.' ocsymbol { Assignment_t *ref; UndefinedSymbol_t *u; if ($>>.Imported != IMPORT_ALL && !FindStringModule($>>.Assignments, $>>.Imported, $3, $1)) LLFAILED((&@1, "Symbol `%s.%s' has not been imported", $1->Identifier, $3)); ref = FindExportedAssignment($>>.Assignments, eAssignment_ObjectClass, $3, $1); if (!ref) { if (FindAssignment($>>.Assignments, eAssignment_ObjectClass, $3, $1)) { u = NewUndefinedSymbol(eUndefinedSymbol_SymbolNotExported, eAssignment_ObjectClass); } else { u = NewUndefinedSymbol(eUndefinedSymbol_SymbolNotDefined, eAssignment_ObjectClass); } u->U.Symbol.Module = $1; u->U.Symbol.Identifier = $3; u->Next = $>>.Undefined; $>>.Undefined = u; } else if (GetAssignmentType($>>.Assignments, ref) != eAssignment_ObjectClass) LLFAILED((&@1, "Symbol `%s' is not an objectclassreference", $1)); $$ = NewObjectClass(eObjectClass_Reference); $$->U.Reference.Identifier = $3; $$->U.Reference.Module = $1; } ; objectreference : lcsymbol { Assignment_t *ref; UndefinedSymbol_t *u; ref = FindAssignment($>>.Assignments, eAssignment_Undefined, $1, $>>.Module); if (!ref) { u = NewUndefinedSymbol(eUndefinedSymbol_SymbolNotDefined, eAssignment_Object); u->U.Symbol.Module = $>>.Module; u->U.Symbol.Identifier = $1; u->Next = $>>.Undefined; $>>.Undefined = u; } else if (GetAssignmentType($>>.Assignments, ref) != eAssignment_Object) LLFAILED((&@1, "Symbol `%s' is not an objectreference", $1)); $$ = NewObject(eObject_Reference); $$->U.Reference.Identifier = $1; $$->U.Reference.Module = $>>.Module; } ; ExternalObjectReference : modulereference '.' lcsymbol { Assignment_t *ref; UndefinedSymbol_t *u; if ($>>.Imported != IMPORT_ALL && !FindStringModule($>>.Assignments, $>>.Imported, $3, $1)) LLFAILED((&@1, "Symbol `%s.%s' has not been imported", $1->Identifier, $3)); ref = FindExportedAssignment($>>.Assignments, eAssignment_Object, $3, $1); if (!ref) { if (FindAssignment($>>.Assignments, eAssignment_Object, $3, $1)) { u = NewUndefinedSymbol(eUndefinedSymbol_SymbolNotExported, eAssignment_Object); } else { u = NewUndefinedSymbol(eUndefinedSymbol_SymbolNotDefined, eAssignment_Object); } u->U.Symbol.Module = $1; u->U.Symbol.Identifier = $3; u->Next = $>>.Undefined; $>>.Undefined = u; } else if (GetAssignmentType($>>.Assignments, ref) != eAssignment_Object) LLFAILED((&@1, "Symbol `%s' is not an objectreference", $1)); $$ = NewObject(eObject_Reference); $$->U.Reference.Identifier = $3; $$->U.Reference.Module = $1; } ; objectsetreference : ucsymbol { Assignment_t *ref; UndefinedSymbol_t *u; ref = FindAssignment($>>.Assignments, eAssignment_Undefined, $1, $>>.Module); if (!ref) { u = NewUndefinedSymbol(eUndefinedSymbol_SymbolNotDefined, eAssignment_ObjectSet); u->U.Symbol.Module = $>>.Module; u->U.Symbol.Identifier = $1; u->Next = $>>.Undefined; $>>.Undefined = u; } else if (GetAssignmentType($>>.Assignments, ref) != eAssignment_ObjectSet) LLFAILED((&@1, "Symbol `%s' is not an objectsetreference", $1)); $$ = NewObjectSet(eObjectSet_Reference); $$->U.Reference.Identifier = $1; $$->U.Reference.Module = $>>.Module; } ; ExternalObjectSetReference : modulereference '.' ucsymbol { Assignment_t *ref; UndefinedSymbol_t *u; if ($>>.Imported != IMPORT_ALL && !FindStringModule($>>.Assignments, $>>.Imported, $3, $1)) LLFAILED((&@1, "Symbol `%s.%s' has not been imported", $1->Identifier, $3)); ref = FindExportedAssignment($>>.Assignments, eAssignment_ObjectSet, $3, $1); if (!ref) { if (FindAssignment($>>.Assignments, eAssignment_ObjectSet, $3, $1)) { u = NewUndefinedSymbol(eUndefinedSymbol_SymbolNotExported, eAssignment_ObjectSet); } else { u = NewUndefinedSymbol(eUndefinedSymbol_SymbolNotDefined, eAssignment_ObjectSet); } u->U.Symbol.Module = $1; u->U.Symbol.Identifier = $3; u->Next = $>>.Undefined; $>>.Undefined = u; } else if (GetAssignmentType($>>.Assignments, ref) != eAssignment_ObjectSet) LLFAILED((&@1, "Symbol `%s' is not an objectsetreference", $1)); $$ = NewObjectSet(eObjectSet_Reference); $$->U.Reference.Identifier = $3; $$->U.Reference.Module = $1; } ; macroreference : ocsymbol { Assignment_t *ref; UndefinedSymbol_t *u; ref = FindAssignment($>>.Assignments, eAssignment_Undefined, $1, $>>.Module); if (!ref) { u = NewUndefinedSymbol(eUndefinedSymbol_SymbolNotDefined, eAssignment_Macro); u->U.Symbol.Module = $>>.Module; u->U.Symbol.Identifier = $1; u->Next = $>>.Undefined; $>>.Undefined = u; } else if (GetAssignmentType($>>.Assignments, ref) != eAssignment_Macro) LLFAILED((&@1, "Symbol `%s' is not an macroreference", $1)); $$ = NewMacro(eMacro_Reference); $$->U.Reference.Identifier = $1; $$->U.Reference.Module = $>>.Module; } ; Externalmacroreference : modulereference '.' ucsymbol { Assignment_t *ref; UndefinedSymbol_t *u; if ($>>.Imported != IMPORT_ALL && !FindStringModule($>>.Assignments, $>>.Imported, $3, $1)) LLFAILED((&@1, "Symbol `%s.%s' has not been imported", $1->Identifier, $3)); ref = FindExportedAssignment($>>.Assignments, eAssignment_Macro, $3, $1); if (!ref) { if (FindAssignment($>>.Assignments, eAssignment_Macro, $3, $1)) { u = NewUndefinedSymbol(eUndefinedSymbol_SymbolNotExported, eAssignment_Macro); } else { u = NewUndefinedSymbol(eUndefinedSymbol_SymbolNotDefined, eAssignment_Macro); } u->U.Symbol.Module = $1; u->U.Symbol.Identifier = $3; u->Next = $>>.Undefined; $>>.Undefined = u; } else if (GetAssignmentType($>>.Assignments, ref) != eAssignment_Macro) LLFAILED((&@1, "Symbol `%s' is not an macroreference", $1)); $$ = NewMacro(eMacro_Reference); $$->U.Reference.Identifier = $3; $$->U.Reference.Module = $1; } ; localtypereference : ucsymbol { $$ = $1; } ; localvaluereference : ucsymbol { $$ = $1; } ; productionreference : ucsymbol { $$ = $1; } ; modulereference : ucsymbol { $$ = NewModuleIdentifier(); $$->Identifier = $1; } ; typefieldreference(oc) : ampucsymbol { FieldSpec_t *fs; FieldSpecs_e fe; ObjectClass_t *oc; UndefinedSymbol_t *u; oc = GetObjectClass($>>.Assignments, $oc); fs = oc ? FindFieldSpec(oc->U.ObjectClass.FieldSpec, $1) : NULL; fe = GetFieldSpecType($>>.Assignments, fs); if (fe == eFieldSpec_Undefined) { if ($oc) { u = NewUndefinedField(eUndefinedSymbol_FieldNotDefined, $oc, eSetting_Type); u->U.Field.Module = $>>.Module; u->U.Field.Identifier = $1; u->Next = $>>.Undefined; $>>.Undefined = u; } } else if (fe != eFieldSpec_Type) LLFAILED((&@1, "%s is not a typefieldreference", $1)); $$ = $1; } ; valuefieldreference(oc) : amplcsymbol { FieldSpec_t *fs; FieldSpecs_e fe; ObjectClass_t *oc; UndefinedSymbol_t *u; oc = GetObjectClass($>>.Assignments, $oc); fs = oc ? FindFieldSpec(oc->U.ObjectClass.FieldSpec, $1) : NULL; fe = GetFieldSpecType($>>.Assignments, fs); if (fe == eFieldSpec_Undefined) { if ($oc) { u = NewUndefinedField(eUndefinedSymbol_FieldNotDefined, $oc, eSetting_Value); u->U.Field.Module = $>>.Module; u->U.Field.Identifier = $1; u->Next = $>>.Undefined; $>>.Undefined = u; } } else if (fe != eFieldSpec_FixedTypeValue && fe != eFieldSpec_VariableTypeValue) LLFAILED((&@1, "%s is not a valuefieldreference", $1)); $$ = $1; } ; valuesetfieldreference(oc) : ampucsymbol { FieldSpec_t *fs; FieldSpecs_e fe; ObjectClass_t *oc; UndefinedSymbol_t *u; oc = GetObjectClass($>>.Assignments, $oc); fs = oc ? FindFieldSpec(oc->U.ObjectClass.FieldSpec, $1) : NULL; fe = GetFieldSpecType($>>.Assignments, fs); if (fe == eFieldSpec_Undefined) { if ($oc) { u = NewUndefinedField(eUndefinedSymbol_FieldNotDefined, $oc, eSetting_ValueSet); u->U.Field.Module = $>>.Module; u->U.Field.Identifier = $1; u->Next = $>>.Undefined; $>>.Undefined = u; } } else if (fe != eFieldSpec_FixedTypeValueSet && fe != eFieldSpec_VariableTypeValueSet) LLFAILED((&@1, "%s is not a valuesetfieldreference", $1)); $$ = $1; } ; objectfieldreference(oc) : amplcsymbol { FieldSpec_t *fs; FieldSpecs_e fe; ObjectClass_t *oc; UndefinedSymbol_t *u; oc = GetObjectClass($>>.Assignments, $oc); fs = oc ? FindFieldSpec(oc->U.ObjectClass.FieldSpec, $1) : NULL; fe = GetFieldSpecType($>>.Assignments, fs); if (fe == eFieldSpec_Undefined) { if ($oc) { u = NewUndefinedField(eUndefinedSymbol_FieldNotDefined, $oc, eSetting_Object); u->U.Field.Module = $>>.Module; u->U.Field.Identifier = $1; u->Next = $>>.Undefined; $>>.Undefined = u; } } else if (fe != eFieldSpec_Object) LLFAILED((&@1, "%s is not a objectfieldreference", $1)); $$ = $1; } ; objectsetfieldreference(oc) : ampucsymbol { FieldSpec_t *fs; FieldSpecs_e fe; ObjectClass_t *oc; UndefinedSymbol_t *u; oc = GetObjectClass($>>.Assignments, $oc); fs = oc ? FindFieldSpec(oc->U.ObjectClass.FieldSpec, $1) : NULL; fe = GetFieldSpecType($>>.Assignments, fs); if (fe == eFieldSpec_Undefined) { if ($oc) { u = NewUndefinedField(eUndefinedSymbol_FieldNotDefined, $oc, eSetting_ObjectSet); u->U.Field.Module = $>>.Module; u->U.Field.Identifier = $1; u->Next = $>>.Undefined; $>>.Undefined = u; } } else if (fe != eFieldSpec_ObjectSet) LLFAILED((&@1, "%s is not a objectsetfieldreference", $1)); $$ = $1; } ; word : ucsymbol { $$ = $1; } | "ABSENT" { $$ = "ABSENT"; } | "ABSTRACT-SYNTAX" { $$ = "ABSTRACT-SYNTAX"; } | "ALL" { $$ = "ALL"; } | "ANY" { $$ = "ANY"; } | "APPLICATION" { $$ = "APPLICATION"; } | "AUTOMATIC" { $$ = "AUTOMATIC"; } | "BEGIN" { $$ = "BEGIN"; } | "BMPString" { $$ = "BMPString"; } | "BY" { $$ = "BY"; } | "CLASS" { $$ = "CLASS"; } | "COMPONENT" { $$ = "COMPONENT"; } | "COMPONENTS" { $$ = "COMPONENTS"; } | "CONSTRAINED" { $$ = "CONSTRAINED"; } | "DEFAULT" { $$ = "DEFAULT"; } | "DEFINED" { $$ = "DEFINED"; } | "DEFINITIONS" { $$ = "DEFINITIONS"; } | "empty" { $$ = "empty"; } | "EXCEPT" { $$ = "EXCEPT"; } | "EXPLICIT" { $$ = "EXPLICIT"; } | "EXPORTS" { $$ = "EXPORTS"; } | "EXTENSIBILITY" { $$ = "EXTENSIBILITY"; } | "FROM" { $$ = "FROM"; } | "GeneralizedTime" { $$ = "GeneralizedTime"; } | "GeneralString" { $$ = "GeneralString"; } | "GraphicString" { $$ = "GraphicString"; } | "IA5String" { $$ = "IA5String"; } | "IDENTIFIER" { $$ = "IDENTIFIER"; } | "identifier" { $$ = "identifier"; } | "IMPLICIT" { $$ = "IMPLICIT"; } | "IMPLIED" { $$ = "IMPLIED"; } | "IMPORTS" { $$ = "IMPORTS"; } | "INCLUDES" { $$ = "INCLUDES"; } | "ISO646String" { $$ = "ISO646String"; } | "MACRO" { $$ = "MACRO"; } | "MAX" { $$ = "MAX"; } | "MIN" { $$ = "MIN"; } | "NOTATION" { $$ = "NOTATION"; } | "number" { $$ = "number"; } | "NumericString" { $$ = "NumericString"; } | "ObjectDescriptor" { $$ = "ObjectDescriptor"; } | "OF" { $$ = "OF"; } | "OPTIONAL" { $$ = "OPTIONAL"; } | "PDV" { $$ = "PDV"; } | "PRESENT" { $$ = "PRESENT"; } | "PrintableString" { $$ = "PrintableString"; } | "PRIVATE" { $$ = "PRIVATE"; } | "SIZE" { $$ = "SIZE"; } | "STRING" { $$ = "STRING"; } | "string" { $$ = "string"; } | "SYNTAX" { $$ = "SYNTAX"; } | "T61String" { $$ = "T61String"; } | "TAGS" { $$ = "TAGS"; } | "TeletexString" { $$ = "TeletexString"; } | "TYPE" { $$ = "TYPE"; } | "type" { $$ = "type"; } | "TYPE-IDENTIFIER" { $$ = "TYPE-IDENTIFIER"; } | "UNIQUE" { $$ = "UNIQUE"; } | "UNIVERSAL" { $$ = "UNIVERSAL"; } | "UniversalString" { $$ = "UniversalString"; } | "UTCTime" { $$ = "UTCTime"; } | "UTF8String" { $$ = "UTF8String"; } | "VALUE" { $$ = "VALUE"; } | "value" { $$ = "value"; } | "VideotexString" { $$ = "VideotexString"; } | "VisibleString" { $$ = "VisibleString"; } | "WITH" { $$ = "WITH"; } ; identifier : lcsymbol { $$ = $1; } | "empty" { $$ = "empty"; } | "identifier" { $$ = "identifier"; } | "number" { $$ = "number"; } | "string" { $$ = "string"; } | "type" { $$ = "type"; } | "value" { $$ = "value"; } ; ucsymbol : ocsymbol { $$ = $1; } | uppercase_symbol { $$ = $1; } ; ocsymbol : only_uppercase_symbol { $$ = $1; } | only_uppercase_digits_symbol { $$ = $1; } | "MACRO" { $$ = "MACRO"; } | "NOTATION" { $$ = "NOTATION"; } | "TYPE" { $$ = "TYPE"; } | "VALUE" { $$ = "VALUE"; } ; astring : cstring { uint32_t i, len; len = str32len($1); $$ = (char *)malloc(len + 1); for (i = 0; i <= len; i++) $$[i] = (char)($1[i]); } ; #line 63 "type.ll" DefinedType : Externaltypereference { $$ = $1; } | typereference { $$ = $1; } | ParameterizedType { MyAbort(); } | ParameterizedValueSetType { MyAbort(); } ; TypeAssignment : typereference "::=" Type PrivateDirectives { PropagatePrivateDirectives($3, $4); if (!AssignType(&$>>.Assignments, $1, $3)) LLFAILED((&@1, "Type `%s' twice defined", $1->U.Reference.Identifier)); ($>>.Assignments)->eDefTagType = g_eDefTagType; } ; ValueSetTypeAssignment : typereference Type "::=" ValueSet($2) { Type_t *type; type = GetTypeOfValueSet($>>.Assignments, $4); if (!AssignType(&$>>.Assignments, $1, type)) LLFAILED((&@1, "Type `%s' twice defined", $1->U.Reference.Identifier)); } ; ValueSet(type) : '{' ElementSetSpec($type, NULL, 0) '}' { $$ = NewValueSet(); $$->Elements = $2; $$->Type = $type; } ; Type : LocalTypeDirectiveESeq UndirectivedType LocalTypeDirectiveESeq { Directive_t **dd, *d; if ($1 || $3) { $$ = DupType($2); dd = &$$->Directives; for (d = $1; d; d = d->Next) { *dd = DupDirective(d); dd = &(*dd)->Next; } for (d = $3; d; d = d->Next) { *dd = DupDirective(d); dd = &(*dd)->Next; } *dd = $2->Directives; } else { $$ = $2; } } ; UndirectivedType : UntaggedType { $$ = $1; } | TaggedType { $$ = $1; } ; UntaggedType : ConstrainableType { $$ = $1; } | SequenceOfType { $$ = $1; } | SetOfType { $$ = $1; } | TypeWithConstraint { $$ = $1; } ; ConstrainableType : BuiltinType LocalTypeDirectiveESeq PrivateDirectives Constraint_ESeq($1) LocalTypeDirectiveESeq PrivateDirectives { Directive_t *d, **dd; if ($2 || $4 || $5) { $$ = DupType($1); IntersectConstraints(&$$->Constraints, $1->Constraints, $4); dd = &$$->Directives; for (d = $2; d; d = d->Next) { *dd = DupDirective(d); dd = &(*dd)->Next; } for (d = $5; d; d = d->Next) { *dd = DupDirective(d); dd = &(*dd)->Next; } *dd = NULL; } else { $$ = ($3 || $6) ? DupType($1) : $1; } PropagatePrivateDirectives($$, $3); PropagatePrivateDirectives($$, $6); } | ReferencedType LocalTypeDirectiveESeq PrivateDirectives Constraint_ESeq($1) LocalTypeDirectiveESeq PrivateDirectives { Directive_t *d, **dd; if ($2 || $4 || $5) { $$ = DupType($1); IntersectConstraints(&$$->Constraints, $1->Constraints, $4); dd = &$$->Directives; for (d = $2; d; d = d->Next) { *dd = DupDirective(d); dd = &(*dd)->Next; } for (d = $5; d; d = d->Next) { *dd = DupDirective(d); dd = &(*dd)->Next; } *dd = NULL; } else { $$ = ($3 || $6) ? DupType($1) : $1; } PropagatePrivateDirectives($$, $3); PropagatePrivateDirectives($$, $6); } ; Constraint_ESeq(type) : Constraint($type, 0) Constraint_ESeq($type) { if ($2) { IntersectConstraints(&$$, $1, $2); } else { $$ = $1; } } | /* empty */ { $$ = NULL; } ; BuiltinType : BitStringType { $$ = $1; } | BooleanType { $$ = $1; } | CharacterStringType { $$ = $1; } | ChoiceType { $$ = $1; } | EmbeddedPDVType { $$ = $1; } | EnumeratedType { $$ = $1; } | ExternalType { $$ = $1; } | InstanceOfType { $$ = $1; } | IntegerType { $$ = $1; } | NullType { $$ = $1; } | ObjectClassFieldType { $$ = $1; } | ObjectIdentifierType { $$ = $1; } | OctetStringType { $$ = $1; } | UTF8StringType { $$ = $1; } | RealType { $$ = $1; } | SequenceType { $$ = $1; } | SetType { $$ = $1; } | AnyType { $$ = $1; } | MacroDefinedType { $$ = $1; } ; ReferencedType : DefinedType { $$ = $1; } | UsefulType { $$ = $1; } | SelectionType { $$ = $1; } | TypeFromObject { $$ = $1; } | ValueSetFromObjects { $$ = GetTypeOfValueSet($>>.Assignments, $1); } ; NamedType : identifier Type { $$ = NewNamedType($2->PrivateDirectives.pszFieldName ? $2->PrivateDirectives.pszFieldName : $1, $2); $2->PrivateDirectives.pszFieldName = NULL; } | identifier '<' Type { Type_t *type; type = NewType(eType_Selection); type->U.Selection.Type = $3; type->U.Selection.Identifier = $1; $$ = NewNamedType($3->PrivateDirectives.pszFieldName ? $3->PrivateDirectives.pszFieldName : $1, type); $3->PrivateDirectives.pszFieldName = NULL; } ; BooleanType : "BOOLEAN" { $$ = Builtin_Type_Boolean; } ; IntegerType : "INTEGER" '{' NamedNumberList '}' { NamedNumber_t *n, *m; for (n = $3; n && n->Next; n = n->Next) { for (m = n->Next; m; m = m->Next) { if (n->Type == eNamedNumber_Normal && m->Type == eNamedNumber_Normal) { if (!strcmp(n->U.Normal.Identifier, m->U.Normal.Identifier)) LLFAILED((&@3, "identifier `%s' has been assigned twice", n->U.Normal.Identifier)); if (GetValue($>>.Assignments, n->U.Normal.Value) && GetValue($>>.Assignments, m->U.Normal.Value) && GetTypeType($>>.Assignments, GetValue($>>.Assignments, n->U.Normal.Value)->Type) == eType_Integer && GetTypeType($>>.Assignments, GetValue($>>.Assignments, m->U.Normal.Value)->Type) == eType_Integer && !intx_cmp(&GetValue($>>.Assignments, n->U.Normal.Value)->U.Integer.Value, &GetValue($>>.Assignments, m->U.Normal.Value)->U.Integer.Value)) LLFAILED((&@3, "value `%d' has been assigned twice", intx2int32(&GetValue($>>.Assignments, n->U.Normal.Value)->U.Integer.Value))); } } } $$ = NewType(eType_Integer); $$->ExtensionDefault = $>>.ExtensionDefault; $$->U.Integer.NamedNumbers = $3; } | "INTEGER" { $$ = NewType(eType_Integer); $$->ExtensionDefault = $>>.ExtensionDefault; } ; NamedNumberList : NamedNumber ',' NamedNumberList { $$ = DupNamedNumber($1); $$->Next = $3; } | NamedNumber { $$ = $1; } ; NamedNumber : identifier '(' SignedNumber(Builtin_Type_Integer) ')' { $$ = NewNamedNumber(eNamedNumber_Normal); $$->U.Normal.Identifier = $1; $$->U.Normal.Value = $3; } | identifier '(' DefinedValue ')' { Value_t *v; v = GetValue($>>.Assignments, $3); if (v) { if (GetTypeType($>>.Assignments, v->Type) != eType_Undefined && GetTypeType($>>.Assignments, v->Type) != eType_Integer) LLFAILED((&@3, "Bad type of value")); if (GetTypeType($>>.Assignments, v->Type) != eType_Integer && intx_cmp(&v->U.Integer.Value, &intx_0) < 0) LLFAILED((&@3, "Bad value")); } $$ = NewNamedNumber(eNamedNumber_Normal); $$->U.Normal.Identifier = $1; $$->U.Normal.Value = $3; } ; EnumeratedType : "ENUMERATED" '{' Enumerations '}' { NamedNumber_t **nn, *n, *m; intx_t *ix; uint32_t num = 0; $$ = NewType(eType_Enumerated); $$->ExtensionDefault = $>>.ExtensionDefault; for (n = $3; n; n = n->Next) if (n->Type == eNamedNumber_Normal) KeepEnumNames(n->U.Normal.Identifier); // global conflict check for (n = $3; n && n->Next; n = n->Next) { if (n->Type != eNamedNumber_Normal) continue; for (m = n->Next; m; m = m->Next) { if (m->Type != eNamedNumber_Normal) continue; if (!strcmp(n->U.Normal.Identifier, m->U.Normal.Identifier)) LLFAILED((&@3, "identifier `%s' has been assigned twice", n->U.Normal.Identifier)); if (GetValue($>>.Assignments, n->U.Normal.Value) && GetValue($>>.Assignments, m->U.Normal.Value) && GetTypeType($>>.Assignments, GetValue($>>.Assignments, n->U.Normal.Value)->Type) == eType_Integer && GetTypeType($>>.Assignments, GetValue($>>.Assignments, m->U.Normal.Value)->Type) == eType_Integer && !intx_cmp(&GetValue($>>.Assignments, n->U.Normal.Value)->U.Integer.Value, &GetValue($>>.Assignments, m->U.Normal.Value)->U.Integer.Value)) LLFAILED((&@3, "value `%d' has been assigned twice", intx2int32(&GetValue($>>.Assignments, n->U.Normal.Value)->U.Integer.Value))); } } nn = &$$->U.Enumerated.NamedNumbers; for (n = $3; n; n = n->Next) { *nn = DupNamedNumber(n); switch (n->Type) { case eNamedNumber_Normal: if (n->U.Normal.Value) break; for (;; num++) { for (m = $3; m; m = m->Next) { switch (m->Type) { case eNamedNumber_Normal: if (!m->U.Normal.Value) continue; ix = &GetValue($>>.Assignments, m->U.Normal.Value)->U.Integer.Value; if (!intxisuint32(ix) || intx2uint32(ix) != num) continue; break; default: continue; } break; } if (!m) break; } (*nn)->U.Normal.Value = NewValue(NULL, Builtin_Type_Integer); intx_setuint32( &(*nn)->U.Normal.Value->U.Integer.Value, num++); break; case eNamedNumber_ExtensionMarker: break; } nn = &(*nn)->Next; } *nn = NULL; } ; Enumerations : Enumeration EnumerationExtension { NamedNumber_t **nn, *n; nn = &$$; for (n = $1; n; n = n->Next) { *nn = DupNamedNumber(n); nn = &(*nn)->Next; } *nn = $2; } ; EnumerationExtension : ',' "..." ',' Enumeration { $$ = NewNamedNumber(eNamedNumber_ExtensionMarker); $$->Next = $4; } | ',' "..." { $$ = NewNamedNumber(eNamedNumber_ExtensionMarker); } | /* empty */ { $$ = NULL; } ; Enumeration : EnumerationItem ',' Enumeration { $$ = DupNamedNumber($1); $$->Next = $3; } | EnumerationItem { $$ = $1; } ; EnumerationItem : identifier { $$ = NewNamedNumber(eNamedNumber_Normal); $$->U.Normal.Identifier = $1; } | NamedNumber { $$ = $1; } ; RealType : "REAL" { $$ = Builtin_Type_Real; } ; BitStringType : "BIT" "STRING" '{' NamedBitList '}' { NamedNumber_t *n, *m; $$ = NewType(eType_BitString); $$->ExtensionDefault = $>>.ExtensionDefault; $$->U.BitString.NamedNumbers = $4; for (n = $4; n; n = n->Next) KeepEnumNames(n->U.Normal.Identifier); // global conflict check for (n = $4; n && n->Next; n = n->Next) { for (m = n->Next; m; m = m->Next) { if (!strcmp(n->U.Normal.Identifier, m->U.Normal.Identifier)) LLFAILED((&@4, "identifier `%s' has been assigned twice", n->U.Normal.Identifier)); if (GetValue($>>.Assignments, n->U.Normal.Value) && GetValue($>>.Assignments, m->U.Normal.Value) && GetTypeType($>>.Assignments, GetValue($>>.Assignments, n->U.Normal.Value)->Type) == eType_Integer && GetTypeType($>>.Assignments, GetValue($>>.Assignments, m->U.Normal.Value)->Type) == eType_Integer && !intx_cmp(&GetValue($>>.Assignments, n->U.Normal.Value)->U.Integer.Value, &GetValue($>>.Assignments, m->U.Normal.Value)->U.Integer.Value)) LLFAILED((&@4, "value `%u' has been assigned twice", intx2uint32(&GetValue($>>.Assignments, n->U.Normal.Value)->U.Integer.Value))); } } } | "BIT" "STRING" { $$ = NewType(eType_BitString); $$->ExtensionDefault = $>>.ExtensionDefault; } ; NamedBitList : NamedBit ',' NamedBitList { $$ = DupNamedNumber($1); $$->Next = $3; } | NamedBit { $$ = $1; } ; NamedBit : identifier '(' number ')' { $$ = NewNamedNumber(eNamedNumber_Normal); $$->U.Normal.Identifier = $1; $$->U.Normal.Value = NewValue(NULL, Builtin_Type_Integer); $$->U.Normal.Value->U.Integer.Value = $3; } | identifier '(' DefinedValue ')' { Value_t *v; v = GetValue($>>.Assignments, $3); if (v) { if (GetTypeType($>>.Assignments, v->Type) != eType_Undefined && GetTypeType($>>.Assignments, v->Type) != eType_Integer) LLFAILED((&@3, "Bad type of value")); if (GetTypeType($>>.Assignments, v->Type) == eType_Integer && intx_cmp(&v->U.Integer.Value, &intx_0) < 0) LLFAILED((&@3, "Bad value")); } $$ = NewNamedNumber(eNamedNumber_Normal); $$->U.Normal.Identifier = $1; $$->U.Normal.Value = $3; } ; OctetStringType : "OCTET" "STRING" { $$ = Builtin_Type_OctetString; } ; UTF8StringType : "UTF8String" { $$ = Builtin_Type_UTF8String; } ; NullType : "NULL" { $$ = Builtin_Type_Null; } ; SequenceType : "SEQUENCE" '{' ExtendedComponentTypeList '}' { Component_t *c, *d; int fExtended = 0; for (c = $3; c; c = c->Next) if (c->Type == eComponent_Optional || c->Type == eComponent_Default || fExtended) KeepOptNames(c->U.NOD.NamedType->Identifier); // global conflict check else if (c->Type == eComponent_ExtensionMarker) fExtended = 1; for (c = $3; c && c->Next; c = c->Next) { if (c->Type != eComponent_Normal && c->Type != eComponent_Optional && c->Type != eComponent_Default) continue; for (d = c->Next; d; d = d->Next) { if (d->Type != eComponent_Normal && d->Type != eComponent_Optional && d->Type != eComponent_Default) continue; if (!strcmp(c->U.NOD.NamedType->Identifier, d->U.NOD.NamedType->Identifier)) LLFAILED((&@3, "Component `%s' has been used twice", c->U.NOD.NamedType->Identifier)); } } $$ = NewType(eType_Sequence); $$->TagDefault = $>>.TagDefault; $$->ExtensionDefault = $>>.ExtensionDefault; $$->U.Sequence.Components = $3; } | "SEQUENCE" '{' '}' { $$ = NewType(eType_Sequence); $$->ExtensionDefault = $>>.ExtensionDefault; } ; ExtensionAndException : "..." ExceptionSpec { $$ = NewComponent(eComponent_ExtensionMarker); /*$$->U.ExtensionMarker.ExceptionSpec = $2;*/ } | "..." { $$ = NewComponent(eComponent_ExtensionMarker); } ; ExtendedComponentTypeList : ComponentTypeList ComponentTypeListExtension { Component_t **cc, *c; if ($2) { cc = &$$; for (c = $1; c; c = c->Next) { *cc = DupComponent(c); cc = &(*cc)->Next; } *cc = $2; } else { $$ = $1; } } | ExtensionAndException AdditionalComponentTypeList { Component_t **cc, *c; if ($2) { cc = &$$; for (c = $1; c; c = c->Next) { *cc = DupComponent(c); cc = &(*cc)->Next; } *cc = $2; } else { $$ = $1; } } ; ComponentTypeListExtension : ',' ExtensionAndException AdditionalComponentTypeList { Component_t **cc, *c; if ($3) { cc = &$$; for (c = $2; c; c = c->Next) { *cc = DupComponent(c); cc = &(*cc)->Next; } *cc = $3; } else { $$ = $2; } } | /* empty */ { $$ = NULL; } ; AdditionalComponentTypeList : ',' ComponentTypeList { $$ = $2; } | /* empty */ { $$ = NULL; } ; ComponentTypeList : ComponentType AdditionalComponentTypeList { if ($2) { $$ = DupComponent($1); $$->Next = $2; } else { $$ = $1; } } ; ComponentType : NamedType ComponentTypePostfix($1->Type) { $$ = DupComponent($2); $$->U.NOD.NamedType = $1; } | "COMPONENTS" "OF" Type { $$ = NewComponent(eComponent_ComponentsOf); $$->U.ComponentsOf.Type = $3; } ; ComponentTypePostfix(type) : "OPTIONAL" { $$ = NewComponent(eComponent_Optional); } | "DEFAULT" Value($type) { $$ = NewComponent(eComponent_Default); $$->U.Default.Value = $2; } | /* empty */ { $$ = NewComponent(eComponent_Normal); } ; SequenceOfType : "SEQUENCE" LocalSizeDirectiveESeq PrivateDirectives "OF" Type { $$ = NewType(eType_SequenceOf); $$->ExtensionDefault = $>>.ExtensionDefault; $$->U.SequenceOf.Type = $5; $$->U.SequenceOf.Directives = $2; if ($3) { PropagatePrivateDirectives($$, $3); } if ($$->PrivateDirectives.pszTypeName && strncmp("PSetOf", $$->PrivateDirectives.pszTypeName, 6) == 0) { $$->PrivateDirectives.pszTypeName++; } } ; SetType : "SET" '{' ExtendedComponentTypeList '}' { Component_t *c, *d; for (c = $3; c && c->Next; c = c->Next) { if (c->Type != eComponent_Normal && c->Type != eComponent_Optional && c->Type != eComponent_Default) continue; for (d = c->Next; d; d = d->Next) { if (d->Type != eComponent_Normal && d->Type != eComponent_Optional && d->Type != eComponent_Default) continue; if (!strcmp(c->U.NOD.NamedType->Identifier, d->U.NOD.NamedType->Identifier)) LLFAILED((&@3, "Component `%s' has been used twice", c->U.NOD.NamedType->Identifier)); } } $$ = NewType(eType_Set); $$->TagDefault = $>>.TagDefault; $$->ExtensionDefault = $>>.ExtensionDefault; $$->U.Set.Components = $3; } | "SET" '{' '}' { $$ = NewType(eType_Set); $$->ExtensionDefault = $>>.ExtensionDefault; } ; SetOfType : "SET" LocalSizeDirectiveESeq PrivateDirectives "OF" Type { $$ = NewType(eType_SetOf); $$->ExtensionDefault = $>>.ExtensionDefault; $$->U.SetOf.Type = $5; $$->U.SetOf.Directives = $2; if ($3) { PropagatePrivateDirectives($$, $3); } if ($$->PrivateDirectives.pszTypeName && strncmp("PSetOf", $$->PrivateDirectives.pszTypeName, 6) == 0) { $$->PrivateDirectives.pszTypeName++; } } ; ChoiceType : "CHOICE" '{' ExtendedAlternativeTypeList '}' { Component_t *c, *d; for (c = $3; c; c = c->Next) if (c->Type == eComponent_Normal || c->Type == eComponent_Optional || c->Type == eComponent_Default) KeepChoiceNames(c->U.NOD.NamedType->Identifier); // global conflict check for (c = $3; c && c->Next; c = c->Next) { if (c->Type != eComponent_Normal && c->Type != eComponent_Optional && c->Type != eComponent_Default) continue; for (d = c->Next; d; d = d->Next) { if (d->Type != eComponent_Normal && d->Type != eComponent_Optional && d->Type != eComponent_Default) continue; if (!strcmp(c->U.NOD.NamedType->Identifier, d->U.NOD.NamedType->Identifier)) LLFAILED((&@3, "Component `%s' has been used twice", c->U.NOD.NamedType->Identifier)); } } $$ = NewType(eType_Choice); $$->TagDefault = $>>.TagDefault; $$->ExtensionDefault = $>>.ExtensionDefault; $$->U.Choice.Components = $3; } ; ExtendedAlternativeTypeList : AlternativeTypeList AlternativeTypeListExtension { Component_t **cc, *c; if ($2) { cc = &$$; for (c = $1; c; c = c->Next) { *cc = DupComponent(c); cc = &(*cc)->Next; } *cc = $2; } else { $$ = $1; } } ; AlternativeTypeListExtension : ',' ExtensionAndException AdditionalAlternativeTypeList { Component_t **cc, *c; if ($3) { cc = &$$; for (c = $2; c; c = c->Next) { *cc = DupComponent(c); cc = &(*cc)->Next; } *cc = $3; } else { $$ = $2; } } | /* empty */ { $$ = NULL; } ; AdditionalAlternativeTypeList : ',' AlternativeTypeList { $$ = $2; } | /* empty */ { $$ = NULL; } ; AlternativeTypeList : NamedType AdditionalAlternativeTypeList { $$ = NewComponent(eComponent_Normal); $$->U.Normal.NamedType = $1; $$->Next = $2; } ; AnyType : "ANY" { $$ = Builtin_Type_Open; } | "ANY" "DEFINED" "BY" identifier { $$ = Builtin_Type_Open; } ; SelectionType : identifier '<' Type { $$ = NewType(eType_Selection); $$->U.Selection.Identifier = $1; $$->U.Selection.Type = $3; } ; TaggedType : Tag TagType Type { Tag_t *t; Type_e eType = GetTypeType($>>.Assignments, $3); if (eType == eType_Choice || eType == eType_Open) { if ($2 == eTagType_Unknown && ($>>.TagDefault == eTagType_Implicit || $>>.TagDefault == eTagType_Automatic)) { $2 = eTagType_Explicit; } else if ($2 == eTagType_Implicit) { for (t = $3->Tags; t; t = t->Next) { if (t->Type == eTagType_Explicit) break; } if (!t) LLFAILED((&@3, "Bad tag type for choice/open type")); } } $$ = DupType($3); $$->Tags = DupTag($1); $$->Tags->Type = $2; $$->Tags->Next = $3->Tags; } ; TagType : /* empty */ { $$ = eTagType_Unknown; } | "IMPLICIT" { $$ = eTagType_Implicit; } | "EXPLICIT" { $$ = eTagType_Explicit; } ; Tag : '[' Class ClassNumber ']' { $$ = NewTag(eTagType_Unknown); $$->Class = $2; $$->Tag = $3; } ; ClassNumber : number { if (intx_cmp(&$1, &intx_1G) >= 0) LLFAILED((&@1, "Bad tag value")); $$ = NewValue(NULL, Builtin_Type_Integer); $$->U.Integer.Value = $1; } | DefinedValue { Value_t *v; v = GetValue($>>.Assignments, $1); if (v && GetTypeType($>>.Assignments, v->Type) != eType_Integer && GetTypeType($>>.Assignments, v->Type) != eType_Undefined) LLFAILED((&@1, "Bad type of tag value")); if (v && GetTypeType($>>.Assignments, v->Type) == eType_Integer && (intx_cmp(&v->U.Integer.Value, &intx_0) < 0 || intx_cmp(&v->U.Integer.Value, &intx_1G) >= 0)) LLFAILED((&@1, "Bad tag value")); $$ = $1; } ; Class : "UNIVERSAL" { $$ = eTagClass_Universal; } | "APPLICATION" { $$ = eTagClass_Application; } | "PRIVATE" { $$ = eTagClass_Private; } | /* empty */ { $$ = eTagClass_Unknown; } ; ObjectIdentifierType : "OBJECT" "IDENTIFIER" { $$ = Builtin_Type_ObjectIdentifier; } ; EmbeddedPDVType : "EMBEDDED" "PDV" { $$ = Builtin_Type_EmbeddedPdv; } ; ExternalType : "EXTERNAL" { $$ = Builtin_Type_External; } ; CharacterStringType : RestrictedCharacterStringType { $$ = $1; } | UnrestrictedCharacterStringType { $$ = $1; } ; RestrictedCharacterStringType : "BMPString" { $$ = Builtin_Type_BMPString; } | "GeneralString" { $$ = Builtin_Type_GeneralString; } | "GraphicString" { $$ = Builtin_Type_GraphicString; } | "IA5String" { $$ = Builtin_Type_IA5String; } | "ISO646String" { $$ = Builtin_Type_ISO646String; } | "NumericString" { $$ = Builtin_Type_NumericString; } | "PrintableString" { $$ = Builtin_Type_PrintableString; } | "TeletexString" { $$ = Builtin_Type_TeletexString; } | "T61String" { $$ = Builtin_Type_T61String; } | "UniversalString" { $$ = Builtin_Type_UniversalString; } | "VideotexString" { $$ = Builtin_Type_VideotexString; } | "VisibleString" { $$ = Builtin_Type_VisibleString; } ; UnrestrictedCharacterStringType : "CHARACTER" "STRING" { $$ = Builtin_Type_CharacterString; } ; UsefulType : "GeneralizedTime" { $$ = Builtin_Type_GeneralizedTime; } | "UTCTime" { $$ = Builtin_Type_UTCTime; } | "ObjectDescriptor" { $$ = Builtin_Type_ObjectDescriptor; } ; TypeWithConstraint : "SET" LocalSizeDirectiveESeq PrivateDirectives Constraint(NULL, 0) LocalSizeDirectiveESeq "OF" Type /*XXX*/ { Directive_t **dd, *d; $$ = NewType(eType_SetOf); $$->ExtensionDefault = $>>.ExtensionDefault; $$->Constraints = $4; $$->U.SetOf.Type = $7; if ($3) { PropagatePrivateDirectives($$, $3); } dd = &$$->U.SetOf.Directives; for (d = $2; d; d = d->Next) { *dd = DupDirective(d); dd = &(*dd)->Next; } for (d = $5; d; d = d->Next) { *dd = DupDirective(d); dd = &(*dd)->Next; } *dd = NULL; if ($$->PrivateDirectives.pszTypeName && strncmp("PSetOf", $$->PrivateDirectives.pszTypeName, 6) == 0) { $$->PrivateDirectives.pszTypeName++; } } | "SET" LocalSizeDirectiveESeq PrivateDirectives SizeConstraint LocalSizeDirectiveESeq PrivateDirectives "OF" Type { Directive_t **dd, *d; $$ = NewType(eType_SetOf); $$->ExtensionDefault = $>>.ExtensionDefault; $$->Constraints = NewConstraint(); $$->Constraints->Type = eExtension_Unextended; $$->Constraints->Root = NewElementSetSpec( eElementSetSpec_SubtypeElement); $$->Constraints->Root->U.SubtypeElement.SubtypeElement = $4; $$->U.SetOf.Type = $8; if ($3) { PropagatePrivateDirectives($$, $3); } if ($6) { PropagatePrivateDirectives($$, $6); } dd = &$$->U.SetOf.Directives; for (d = $2; d; d = d->Next) { *dd = DupDirective(d); dd = &(*dd)->Next; } for (d = $5; d; d = d->Next) { *dd = DupDirective(d); dd = &(*dd)->Next; } *dd = NULL; if ($$->PrivateDirectives.pszTypeName && strncmp("PSetOf", $$->PrivateDirectives.pszTypeName, 6) == 0) { $$->PrivateDirectives.pszTypeName++; } } | "SEQUENCE" LocalSizeDirectiveESeq PrivateDirectives Constraint(NULL, 0) LocalSizeDirectiveESeq "OF" Type /*XXX*/ { Directive_t **dd, *d; $$ = NewType(eType_SequenceOf); $$->ExtensionDefault = $>>.ExtensionDefault; $$->Constraints = $4; $$->U.SequenceOf.Type = $7; if ($3) { PropagatePrivateDirectives($$, $3); } dd = &$$->U.SequenceOf.Directives; for (d = $2; d; d = d->Next) { *dd = DupDirective(d); dd = &(*dd)->Next; } for (d = $5; d; d = d->Next) { *dd = DupDirective(d); dd = &(*dd)->Next; } *dd = NULL; if ($$->PrivateDirectives.pszTypeName && strncmp("PSetOf", $$->PrivateDirectives.pszTypeName, 6) == 0) { $$->PrivateDirectives.pszTypeName++; } } | "SEQUENCE" LocalSizeDirectiveESeq PrivateDirectives SizeConstraint LocalSizeDirectiveESeq PrivateDirectives "OF" Type { Directive_t **dd, *d; $$ = NewType(eType_SequenceOf); $$->ExtensionDefault = $>>.ExtensionDefault; $$->Constraints = NewConstraint(); $$->Constraints->Type = eExtension_Unextended; $$->Constraints->Root = NewElementSetSpec( eElementSetSpec_SubtypeElement); $$->Constraints->Root->U.SubtypeElement.SubtypeElement = $4; $$->U.SequenceOf.Type = $8; if ($3) { PropagatePrivateDirectives($$, $3); } if ($6) { PropagatePrivateDirectives($$, $6); } dd = &$$->U.SequenceOf.Directives; for (d = $2; d; d = d->Next) { *dd = DupDirective(d); dd = &(*dd)->Next; } for (d = $5; d; d = d->Next) { *dd = DupDirective(d); dd = &(*dd)->Next; } *dd = NULL; if ($$->PrivateDirectives.pszTypeName && strncmp("PSetOf", $$->PrivateDirectives.pszTypeName, 6) == 0) { $$->PrivateDirectives.pszTypeName++; } } ; #line 54 "value.ll" DefinedValue : Externalvaluereference { $$ = $1; } | valuereference { $$ = $1; } | ParameterizedValue { MyAbort(); } ; ValueAssignment : valuereference Type "::=" Value($2) { if (!AssignValue(&$>>.Assignments, $1, $4)) LLFAILED((&@1, "Value `%s' twice defined", $1->U.Reference.Identifier)); } ; Value(type) : BuiltinValue($type) { $$ = $1; } | ReferencedValue { $$ = $1; } | ObjectClassFieldValue($type) { $$ = $1; } ; BuiltinValue(type) : { if (GetTypeType($<<.Assignments, $type) != eType_Undefined && GetTypeType($<<.Assignments, $type) != eType_BitString) LLFAILED((&@@, "Bad type of value")); } BitStringValue($type) { $$ = $1; } | { if (GetTypeType($<<.Assignments, $type) != eType_Undefined && GetTypeType($<<.Assignments, $type) != eType_Boolean) LLFAILED((&@@, "Bad type of value")); } BooleanValue($type) { $$ = $1; } | CharacterStringValue($type) { $$ = $1; } | { if (GetTypeType($<<.Assignments, $type) != eType_Undefined && GetTypeType($<<.Assignments, $type) != eType_Choice) LLFAILED((&@@, "Bad type of value")); } ChoiceValue($type) { $$ = $1; } | { if (GetTypeType($<<.Assignments, $type) != eType_Undefined && GetTypeType($<<.Assignments, $type) != eType_EmbeddedPdv) LLFAILED((&@@, "Bad type of value")); } EmbeddedPDVValue($type) { $$ = $1; } | { if (GetTypeType($<<.Assignments, $type) != eType_Undefined && GetTypeType($<<.Assignments, $type) != eType_Enumerated) LLFAILED((&@@, "Bad type of value")); } EnumeratedValue($type) { $$ = $1; } | { if (GetTypeType($<<.Assignments, $type) != eType_Undefined && GetTypeType($<<.Assignments, $type) != eType_External) LLFAILED((&@@, "Bad type of value")); } ExternalValue($type) { $$ = $1; } | { if (GetTypeType($<<.Assignments, $type) != eType_Undefined && GetTypeType($<<.Assignments, $type) != eType_InstanceOf) LLFAILED((&@@, "Bad type of value")); } InstanceOfValue($type) { $$ = $1; } | { if (GetTypeType($<<.Assignments, $type) != eType_Undefined && GetTypeType($<<.Assignments, $type) != eType_Integer) LLFAILED((&@@, "Bad type of value")); } IntegerValue($type) { $$ = $1; } | { if (GetTypeType($<<.Assignments, $type) != eType_Undefined && GetTypeType($<<.Assignments, $type) != eType_Null) LLFAILED((&@@, "Bad type of value")); } NullValue($type) { $$ = $1; } | { if (GetTypeType($<<.Assignments, $type) != eType_Undefined && GetTypeType($<<.Assignments, $type) != eType_ObjectIdentifier) LLFAILED((&@@, "Bad type of value")); } ObjectIdentifierValue { $$ = $1; if ($1->Type != NULL) { PropagatePrivateDirectives($1->Type, &($type->PrivateDirectives)); } } | { if (GetTypeType($<<.Assignments, $type) != eType_Undefined && GetTypeType($<<.Assignments, $type) != eType_OctetString) LLFAILED((&@@, "Bad type of value")); } OctetStringValue($type) { $$ = $1; } | { if (GetTypeType($<<.Assignments, $type) != eType_Undefined && GetTypeType($<<.Assignments, $type) != eType_Real) LLFAILED((&@@, "Bad type of value")); } RealValue($type) { $$ = $1; } | { if (GetTypeType($<<.Assignments, $type) != eType_Undefined && GetTypeType($<<.Assignments, $type) != eType_GeneralizedTime) LLFAILED((&@@, "Bad type of value")); } GeneralizedTimeValue($type) { $$ = $1; } | { if (GetTypeType($<<.Assignments, $type) != eType_Undefined && GetTypeType($<<.Assignments, $type) != eType_UTCTime) LLFAILED((&@@, "Bad type of value")); } UTCTimeValue($type) { $$ = $1; } | { if (GetTypeType($<<.Assignments, $type) != eType_Undefined && GetTypeType($<<.Assignments, $type) != eType_ObjectDescriptor) LLFAILED((&@@, "Bad type of value")); } ObjectDescriptorValue($type) { $$ = $1; } | { if (GetTypeType($<<.Assignments, $type) != eType_Undefined && GetTypeType($<<.Assignments, $type) != eType_Sequence) LLFAILED((&@@, "Bad type of value")); } SequenceValue($type) { $$ = $1; } | { if (GetTypeType($<<.Assignments, $type) != eType_Undefined && GetTypeType($<<.Assignments, $type) != eType_SequenceOf) LLFAILED((&@@, "Bad type of value")); } SequenceOfValue($type) { $$ = $1; } | { if (GetTypeType($<<.Assignments, $type) != eType_Undefined && GetTypeType($<<.Assignments, $type) != eType_Set) LLFAILED((&@@, "Bad type of value")); } SetValue($type) { $$ = $1; } | { if (GetTypeType($<<.Assignments, $type) != eType_Undefined && GetTypeType($<<.Assignments, $type) != eType_SetOf) LLFAILED((&@@, "Bad type of value")); } SetOfValue($type) { $$ = $1; } | { if (GetTypeType($<<.Assignments, $type) != eType_Undefined && GetTypeType($<<.Assignments, $type) != eType_Open) LLFAILED((&@@, "Bad type of value")); } AnyValue($type) { $$ = $1; } | { if (GetTypeType($<<.Assignments, $type) != eType_Undefined && GetTypeType($<<.Assignments, $type) != eType_Macro) LLFAILED((&@@, "Bad type of value")); } MacroDefinedValue($type) { $$ = $1; } ; ReferencedValue : DefinedValue { $$ = $1; } | ValueFromObject { $$ = $1; } ; NamedValue(components) : identifier { Component_t *component; Type_t *type; component = FindComponent($<<.Assignments, $components, $1); if (component) type = component->U.NOD.NamedType->Type; else type = NULL; } Value(type) { $$ = NewNamedValue($1, $2); } ; BooleanValue(type) : "TRUE" { $$ = NewValue($>>.Assignments, $type); $$->U.Boolean.Value = 1; } | "FALSE" { $$ = NewValue($>>.Assignments, $type); $$->U.Boolean.Value = 0; } ; SignedNumber(type) : number { $$ = NewValue($>>.Assignments, $type); $$->U.Integer.Value = $1; } | '-' number { if (!intx_cmp(&$2, &intx_0)) LLFAILED((&@2, "Bad negative value")); $$ = NewValue($>>.Assignments, $type); intx_neg(&$$->U.Integer.Value, &$2); } ; IntegerValue(type) : SignedNumber($type) { $$ = $1; } | identifier { NamedNumber_t *n; Type_t *type; type = GetType($>>.Assignments, $type); if (type) { n = FindNamedNumber(type->U.Integer.NamedNumbers, $1); if (!n) LLFAILED((&@1, "Undefined integer value")); $$ = NewValue($>>.Assignments, $type); intx_dup(&$$->U.Integer.Value, &n->U.Normal.Value->U.Integer.Value); } else { $$ = NULL; } } ; EnumeratedValue(type) : identifier { NamedNumber_t *n; Type_t *type; type = GetType($>>.Assignments, $type); if (type) { n = FindNamedNumber(type->U.Enumerated.NamedNumbers, $1); if (!n) LLFAILED((&@1, "Undefined enumeration value")); $$ = NewValue($>>.Assignments, $type); $$->U.Enumerated.Value = intx2uint32(&n->U.Normal.Value->U.Integer.Value); } else { $$ = NULL; } } ; RealValue(type) : NumericRealValue($type) { $$ = $1; } | SpecialRealValue($type) { $$ = $1; } ; NumericRealValue(type) : number /* only 0 allowed! */ { if (intx_cmp(&$1, &intx_0)) LLFAILED((&@1, "Bad real value")); $$ = NewValue($>>.Assignments, $type); } | SequenceValue($type) { NamedValue_t *mant, *expo, *base; mant = FindNamedValue($1->U.Sequence.NamedValues, "mantissa"); expo = FindNamedValue($1->U.Sequence.NamedValues, "exponent"); base = FindNamedValue($1->U.Sequence.NamedValues, "base"); if (!mant || !expo || !base) { $$ = NULL; } else { $$ = NewValue($>>.Assignments, $type); intx_dup(&$$->U.Real.Value.mantissa, &mant->Value->U.Integer.Value); intx_dup(&$$->U.Real.Value.exponent, &expo->Value->U.Integer.Value); $$->U.Real.Value.base = intx2uint32(&base->Value->U.Integer.Value); } } ; SpecialRealValue(type) : "PLUS_INFINITY" { $$ = NewValue($>>.Assignments, $type); $$->U.Real.Value.type = eReal_PlusInfinity; } | "MINUS_INFINITY" { $$ = NewValue($>>.Assignments, $type); $$->U.Real.Value.type = eReal_MinusInfinity; } ; BitStringValue(type) : bstring { int i, len; if (GetTypeType($>>.Assignments, $type) == eType_BitString) { len = strlen($1); $$ = NewValue($>>.Assignments, $type); $$->U.BitString.Value.length = len; $$->U.BitString.Value.value = (octet_t *)malloc((len + 7) / 8); memset($$->U.BitString.Value.value, 0, (len + 7) / 8); for (i = 0; i < len; i++) { if ($1[i] == '1') ASN1BITSET($$->U.BitString.Value.value, i); } } else { $$ = NULL; } } | hstring { int i, len, c; if (GetTypeType($>>.Assignments, $type) == eType_BitString) { len = strlen($1); $$ = NewValue($>>.Assignments, $type); $$->U.BitString.Value.length = len * 4; $$->U.BitString.Value.value = (octet_t *)malloc((len + 1) / 2); memset($$->U.BitString.Value.value, 0, (len + 1) / 2); for (i = 0; i < len; i++) { c = isdigit($1[i]) ? $1[i] - '0' : $1[i] - 'A' + 10; $$->U.BitString.Value.value[i / 2] |= (i & 1) ? c : (c << 4); } } else { $$ = NULL; } } | '{' IdentifierList($type) '}' { $$ = $2; } | '{' '}' { $$ = NewValue($>>.Assignments, $type); } ; IdentifierList(type) : IdentifierList_Elem($type) Identifier_EList($type) { uint32_t bit, len; bitstring_t *src, *dst; if ($1 && $2) { bit = intx2uint32(&$1->U.Integer.Value); src = &$2->U.BitString.Value; len = bit + 1; if (len < src->length) len = src->length; $$ = DupValue($2); dst = &$$->U.BitString.Value; dst->length = len; dst->value = (octet_t *)malloc((len + 7) / 8); memcpy(dst->value, src->value, (src->length + 7) / 8); memset(dst->value + (src->length + 7) / 8, 0, (len + 7) / 8 - (src->length + 7) / 8); ASN1BITSET(dst->value, bit); } else if ($1) { bit = intx2uint32(&$1->U.Integer.Value); len = bit + 1; $$ = NewValue($>>.Assignments, $type); dst = &$$->U.BitString.Value; dst->length = len; dst->value = (octet_t *)malloc((len + 7) / 8); memset(dst->value, 0, (len + 7) / 8); ASN1BITSET(dst->value, bit); } else { $$ = NULL; } } ; Identifier_EList(type) : IdentifierList_Elem($type) Identifier_EList($type) { uint32_t bit, len; bitstring_t *src, *dst; if ($1 && $2) { bit = intx2uint32(&$1->U.Integer.Value); src = &$2->U.BitString.Value; len = bit + 1; if (len < src->length) len = src->length; $$ = DupValue($2); dst = &$$->U.BitString.Value; dst->length = len; dst->value = (octet_t *)malloc((len + 7) / 8); memcpy(dst->value, src->value, (src->length + 7) / 8); memset(dst->value + (src->length + 7) / 8, 0, (len + 7) / 8 - (src->length + 7) / 8); ASN1BITSET(dst->value, bit); } else if ($1) { bit = intx2uint32(&$1->U.Integer.Value); len = bit + 1; $$ = NewValue($>>.Assignments, $type); dst = &$$->U.BitString.Value; dst->length = len; dst->value = (octet_t *)malloc((len + 7) / 8); memset(dst->value, 0, (len + 7) / 8); ASN1BITSET(dst->value, bit); } else { $$ = NULL; } } | /* empty */ { if ($type) { $$ = NewValue($>>.Assignments, $type); } else { $$ = NULL; } } ; IdentifierList_Elem(type) : identifier { Value_t *v; NamedNumber_t *n; Type_t *type; type = GetType($>>.Assignments, $type); if (type) { n = FindNamedNumber(type->U.BitString.NamedNumbers, $1); if (!n) LLFAILED((&@1, "Bad bit string value")); v = GetValue($>>.Assignments, n->U.Normal.Value); if (v) { if (GetTypeType($>>.Assignments, v->Type) != eType_Integer) MyAbort(); $$ = v; } else { $$ = NULL; } } else { $$ = NULL; } } ; OctetStringValue(type) : bstring { int len, i; if (GetTypeType($>>.Assignments, $type) == eType_OctetString) { len = strlen($1); $$ = NewValue($>>.Assignments, $type); $$->U.OctetString.Value.length = (len + 7) / 8; $$->U.OctetString.Value.value = (octet_t *)malloc((len + 7) / 8); memset($$->U.OctetString.Value.value, 0, (len + 7) / 8); for (i = 0; i < len; i++) { if ($1[i] == '1') ASN1BITSET($$->U.OctetString.Value.value, i); } } else { $$ = NULL; } } | hstring { int i, len, c; if (GetTypeType($>>.Assignments, $type) == eType_OctetString) { len = strlen($1); $$ = NewValue($>>.Assignments, $type); $$->U.OctetString.Value.length = (len + 1) / 2; $$->U.OctetString.Value.value = (octet_t *)malloc((len + 1) / 2); memset($$->U.OctetString.Value.value, 0, (len + 1) / 2); for (i = 0; i < len; i++) { c = isdigit($1[i]) ? $1[i] - '0' : $1[i] - 'A' + 10; $$->U.OctetString.Value.value[i / 2] |= (i & 1) ? c : (c << 4); } } else { $$ = NULL; } } ; NullValue(type) : "NULL" { $$ = NewValue($>>.Assignments, $type); } ; GeneralizedTimeValue(type) : RestrictedCharacterStringValue($type) { $$ = NewValue($>>.Assignments, $type); if (!String2GeneralizedTime(&$$->U.GeneralizedTime.Value, &$1->U.RestrictedString.Value)) LLFAILED((&@1, "Bad time value")); } ; UTCTimeValue(type) : RestrictedCharacterStringValue($type) { $$ = NewValue($>>.Assignments, $type); if (!String2UTCTime(&$$->U.UTCTime.Value, &$1->U.RestrictedString.Value)) LLFAILED((&@1, "Bad time value")); } ; ObjectDescriptorValue(type) : RestrictedCharacterStringValue($type) { $$ = $1; } ; SequenceValue(type) : '{' { Component_t *components; Type_t *type; type = GetType($>1.Assignments, $type); components = type ? type->U.SSC.Components : NULL; } ComponentValueList(components) '}' { Component_t *c; NamedValue_t *v; if (type) { for (c = components, v = $2; c; c = c->Next) { switch (c->Type) { case eComponent_Normal: if (!v) LLFAILED((&@2, "Value for component `%s' is missing", c->U.NOD.NamedType->Identifier)); if (strcmp(v->Identifier, c->U.NOD.NamedType->Identifier)) LLFAILED((&@2, "Value for component `%s' expected", c->U.NOD.NamedType->Identifier)); v = v->Next; break; case eComponent_Optional: case eComponent_Default: if (v && !strcmp(v->Identifier, c->U.NOD.NamedType->Identifier)) v = v->Next; break; } } if (v) LLFAILED((&@2, "Component `%s' is unexpected", v->Identifier)); } $$ = NewValue($>>.Assignments, $type); $$->U.SSC.NamedValues = $2; } | '{' '}' { $$ = NewValue($>>.Assignments, $type); } ; ComponentValueList(components) : NamedValue($components) ComponentValueCList($components) { if ($2) { $$ = DupNamedValue($1); $$->Next = $2; } else { $$ = $1; } } ; ComponentValueCList(components) : ',' ComponentValueList($components) { $$ = $2; } | /* empty */ { $$ = NULL; } ; SequenceOfValue(type) : '{' { Type_t *type, *subtype; type = GetType($>1.Assignments, $type); subtype = (type ? type->U.SS.Type : NULL); } ValueList(subtype) '}' { $$ = NewValue($>>.Assignments, $type); $$->U.SequenceOf.Values = $2; } | '{' '}' { $$ = NewValue($>>.Assignments, $type); } ; ValueList(type) : Value($type) ValueCList($type) { $$ = DupValue($1); $$->Next = $2; } ; ValueCList(type) : ',' ValueList($type) { $$ = $2; } | /* empty */ { $$ = NULL; } ; SetValue(type) : '{' { Component_t *components; Type_t *type; type = GetType($>1.Assignments, $type); components = type ? type->U.SSC.Components : NULL; } ComponentValueList(components) '}' { Component_t *c; NamedValue_t *v; if (type) { for (c = components; c; c = c->Next) { switch (c->Type) { case eComponent_Normal: v = FindNamedValue($2, c->U.NOD.NamedType->Identifier); if (!v) LLFAILED((&@2, "Value for component `%s' is missing", c->U.NOD.NamedType->Identifier)); break; } } for (v = $2; v; v = v->Next) { if (!FindComponent($>>.Assignments, components, v->Identifier) || FindNamedValue(v->Next, v->Identifier)) LLFAILED((&@2, "Component `%s' is unexpected", v->Identifier)); } } $$ = NewValue($>>.Assignments, $type); $$->U.Set.NamedValues = $2; } | '{' '}' { $$ = NewValue($>>.Assignments, $type); } ; SetOfValue(type) : '{' { Type_t *type, *subtype; type = GetType($>1.Assignments, $type); subtype = (type ? type->U.SS.Type : NULL); } ValueList(subtype) '}' { $$ = NewValue($>>.Assignments, $type); $$->U.SetOf.Values = $2; } | '{' '}' { $$ = NewValue($>>.Assignments, $type); } ; ChoiceValue(type) : identifier ':' { Component_t *component; Type_t *type, *subtype; type = GetType($>2.Assignments, $type); if (type) { component = FindComponent($>2.Assignments, type->U.Choice.Components, $1); if (!component) LLFAILED((&@1, "Bad alternative `%s'", $1)); subtype = component->U.NOD.NamedType->Type; } else { subtype = NULL; } } Value(subtype) { $$ = NewValue($>>.Assignments, $type); $$->U.SSC.NamedValues = NewNamedValue($1, $3); } ; ObjectIdentifierValue : '{' ObjIdComponentList '}' { switch (GetAssignedObjectIdentifier( &$>>.AssignedObjIds, NULL, $2, &$$)) { case -1: LLFAILED((&@2, "Different numbers for equally named object identifier components")); /*NOTREACHED*/ case 0: if (pass <= 2) $$ = NULL; else LLFAILED((&@2, "Unknown object identifier component")); break; case 1: break; } } | '{' DefinedValue ObjIdComponentList '}' { Value_t *v; v = GetValue($>>.Assignments, $2); if (v) { if (GetTypeType($>>.Assignments, v->Type) != eType_ObjectIdentifier && GetTypeType($>>.Assignments, v->Type) != eType_Undefined) LLFAILED((&@2, "Bad type of value in object identifier")); if (GetTypeType($>>.Assignments, v->Type) == eType_ObjectIdentifier) { switch (GetAssignedObjectIdentifier( &$>>.AssignedObjIds, v, $3, &$$)) { case -1: LLFAILED((&@3, "Different numbers for equally named object identifier components")); /*NOTREACHED*/ case 0: if (pass <= 2) $$ = NULL; else LLFAILED((&@2, "Unknown object identifier component")); break; case 1: break; } } } else { $$ = NULL; } } ; ObjIdComponentList : ObjIdComponent ObjIdComponent_ESeq { if ($1) { $$ = DupNamedObjIdValue($1); $$->Next = $2; } else { $$ = NULL; } } ; ObjIdComponent_ESeq : ObjIdComponent ObjIdComponent_ESeq { if ($1) { $$ = DupNamedObjIdValue($1); $$->Next = $2; } else { $$ = NULL; } } | /* empty */ { $$ = NULL; } ; ObjIdComponent : NameForm { $$ = $1; } | NumberForm { $$ = $1; } | NameAndNumberForm { $$ = $1; } ; NameForm : identifier { $$ = NewNamedObjIdValue(eNamedObjIdValue_NameForm); $$->Name = $1; } ; NumberForm : number { $$ = NewNamedObjIdValue(eNamedObjIdValue_NumberForm); $$->Number = intx2uint32(&$1); } | DefinedValue { Value_t *v; v = GetValue($>>.Assignments, $1); if (v && GetTypeType($>>.Assignments, v->Type) != eType_Integer && GetTypeType($>>.Assignments, v->Type) != eType_Undefined) LLFAILED((&@1, "Bad type in object identifier")); if (v && GetTypeType($>>.Assignments, v->Type) == eType_Integer && intx_cmp(&v->U.Integer.Value, &intx_0) < 0) LLFAILED((&@1, "Bad value in object identifier")); if (v && GetTypeType($>>.Assignments, v->Type) == eType_Integer) { $$ = NewNamedObjIdValue(eNamedObjIdValue_NumberForm); $$->Number = intx2uint32(&v->U.Integer.Value); } else { $$ = NULL; } } ; NameAndNumberForm : identifier '(' NumberForm ')' { if ($3) { $$ = NewNamedObjIdValue(eNamedObjIdValue_NameAndNumberForm); $$->Name = $1; $$->Number = $3->Number; } else { $$ = NULL; } } ; EmbeddedPDVValue(type) : SequenceValue($type) { $$ = $1; } ; ExternalValue(type) : SequenceValue($type) { $$ = $1; } ; CharacterStringValue(type) : { Type_e type; type = GetTypeType($<<.Assignments, $type); if (type != eType_Undefined && !IsRestrictedString(type)) LLFAILED((&@@, "Bad type of value")); } RestrictedCharacterStringValue($type) { $$ = $1; } | { if (GetTypeType($<<.Assignments, $type) != eType_Undefined && GetTypeType($<<.Assignments, $type) != eType_CharacterString) LLFAILED((&@@, "Bad type of value")); } UnrestrictedCharacterStringValue($type) { $$ = $1; } ; RestrictedCharacterStringValue(type): cstring { $$ = NewValue($>>.Assignments, $type); $$->U.RestrictedString.Value.length = str32len($1); $$->U.RestrictedString.Value.value = $1; } | CharacterStringList($type) { $$ = $1; } | Quadruple { $$ = NewValue($>>.Assignments, $type); $$->U.RestrictedString.Value.length = 1; $$->U.RestrictedString.Value.value = (char32_t *)malloc(sizeof(char32_t)); $$->U.RestrictedString.Value.value[0] = 256 * (256 * (256 * $1.Group + $1.Plane) + $1.Row) + $1.Cell; } | Tuple { $$ = NewValue($>>.Assignments, $type); $$->U.RestrictedString.Value.length = 1; $$->U.RestrictedString.Value.value = (char32_t *)malloc(sizeof(char32_t)); *$$->U.RestrictedString.Value.value = $1.Column * 16 + $1.Row; } ; UnrestrictedCharacterStringValue(type) : SequenceValue($type) { $$ = $1; } ; CharacterStringList(type) : '{' CharSyms($type) '}' { $$ = $2; } ; CharSyms(type) : CharDefn($type) { $$ = $1; } | CharDefn($type) ',' CharSyms($type) { if (!$1 || !$3) { $$ = NULL; } else { $$ = NewValue($>>.Assignments, $type); $$->U.RestrictedString.Value.length = $1->U.RestrictedString.Value.length + $3->U.RestrictedString.Value.length; $$->U.RestrictedString.Value.value = (char32_t *)malloc( $$->U.RestrictedString.Value.length * sizeof(char32_t)); memcpy($$->U.RestrictedString.Value.value, $1->U.RestrictedString.Value.value, $1->U.RestrictedString.Value.length * sizeof(char32_t)); memcpy($$->U.RestrictedString.Value.value + $1->U.RestrictedString.Value.length, $3->U.RestrictedString.Value.value, $3->U.RestrictedString.Value.length * sizeof(char32_t)); } } ; CharDefn(type) : cstring { $$ = NewValue($>>.Assignments, $type); $$->U.RestrictedString.Value.length = str32len($1); $$->U.RestrictedString.Value.value = $1; } | DefinedValue { $$ = $1; } ; Quadruple : '{' number ',' number ',' number ',' number '}' { $$.Group = intx2uint32(&$2); $$.Plane = intx2uint32(&$4); $$.Row = intx2uint32(&$6); $$.Cell = intx2uint32(&$8); } ; Tuple : '{' number ',' number '}' { $$.Column = intx2uint32(&$2); $$.Row = intx2uint32(&$4); } ; AnyValue(type) : Type ':' Value($1) { $$ = $3; } ; #line 46 "constrai.ll" Constraint(type, permalpha) : '(' ConstraintSpec($type, $permalpha) ExceptionSpec ')' { $$ = $2; /*XXX ExceptionSpec */ } ; ConstraintSpec(type, permalpha) : SubtypeConstraint($type, $permalpha) { $$ = $1; } | GeneralConstraint { $$ = NULL; /*XXX*/ } ; SubtypeConstraint(type, permalpha) : ElementSetSpecs($type, $permalpha) { $$ = $1; } ; ExceptionSpec : '!' ExceptionIdentification | /* empty */ ; ExceptionIdentification : SignedNumber(Builtin_Type_Integer) | DefinedValue | Type ':' Value($1) ; ElementSetSpecs(type, permalpha) : ElementSetSpec($type, NULL, $permalpha) ElementSetSpecExtension($type, $permalpha) { if ($2) { $$ = DupConstraint($2); } else { $$ = NewConstraint(); } $$->Root = $1; } | "..." AdditionalElementSetSpec($type, $permalpha) { $$ = NewConstraint(); $$->Type = $2 ? eExtension_Extended : eExtension_Extendable; $$->Additional = $2; } ; ElementSetSpecExtension(type, permalpha) : ',' "..." AdditionalElementSetSpec($type, $permalpha) { $$ = NewConstraint(); $$->Type = $3 ? eExtension_Extended : eExtension_Extendable; $$->Additional = $3; } | /* empty */ { $$ = NULL; } ; AdditionalElementSetSpec(type, permalpha) : ',' ElementSetSpec($type, NULL, $permalpha) { $$ = $2; } | /* empty */ { $$ = NULL; } ; ElementSetSpec(type, objectclass, permalpha) : Unions($type, $objectclass, $permalpha) { $$ = $1; } | "ALL" Exclusions($type, $objectclass, $permalpha) { $$ = NewElementSetSpec(eElementSetSpec_AllExcept); $$->U.AllExcept.Elements = $2; } ; Unions(type, objectclass, permalpha) : Intersections($type, $objectclass, $permalpha) UnionList($type, $objectclass, $permalpha) { if ($2) { $$ = NewElementSetSpec(eElementSetSpec_Union); $$->U.Union.Elements1 = $1; $$->U.Union.Elements2 = $2; } else { $$ = $1; } } ; UnionList(type, objectclass, permalpha) : UnionMark Unions($type, $objectclass, $permalpha) { $$ = $2; } | /* empty */ { $$ = NULL; } ; Intersections(type, objectclass, permalpha) : IntersectionElements($type, $objectclass, $permalpha) IntersectionList($type, $objectclass, $permalpha) { if ($2) { $$ = NewElementSetSpec(eElementSetSpec_Intersection); $$->U.Intersection.Elements1 = $1; $$->U.Intersection.Elements2 = $2; } else { $$ = $1; } } ; IntersectionList(type, objectclass, permalpha) : IntersectionMark Intersections($type, $objectclass, $permalpha) { $$ = $2; } | /* empty */ { $$ = NULL; } ; IntersectionElements(type, objectclass, permalpha) : Elements($type, $objectclass, $permalpha) Exclusions_Opt($type, $objectclass, $permalpha) { if ($2) { $$ = NewElementSetSpec(eElementSetSpec_Exclusion); $$->U.Exclusion.Elements1 = $1; $$->U.Exclusion.Elements2 = $2; } else { $$ = $1; } } ; Exclusions_Opt(type, objectclass, permalpha) : Exclusions($type, $objectclass, $permalpha) { $$ = $1; } | /* empty */ { $$ = NULL; } ; Exclusions(type, objectclass, permalpha) : "EXCEPT" Elements($type, $objectclass, $permalpha) { $$ = $2; } ; UnionMark : '|' | "UNION" ; IntersectionMark : '^' | "INTERSECTION" ; Elements(type, objectclass, permalpha) : { if ($objectclass) LLFAILED((&@@, "Bad object set")); } SubtypeElements($type, $permalpha) { $$ = NewElementSetSpec(eElementSetSpec_SubtypeElement); $$->U.SubtypeElement.SubtypeElement = $1; } | { if ($type) LLFAILED((&@@, "Bad constraint")); } ObjectSetElements($objectclass) { $$ = NewElementSetSpec(eElementSetSpec_ObjectSetElement); $$->U.ObjectSetElement.ObjectSetElement = $1; } | '(' ElementSetSpec($type, $objectclass, $permalpha) ')' { $$ = $2; } ; SubtypeElements(type, permalpha) : { Type_e type; type = GetTypeType($<<.Assignments, $type); if (type == eType_Open) LLFAILED((&@@, "Bad constraint")); } SingleValue($type) { $$ = $1; } | { Type_e type; type = GetTypeType($<<.Assignments, $type); if (type == eType_EmbeddedPdv || type == eType_External || type == eType_Open || type == eType_CharacterString) LLFAILED((&@@, "Bad constraint")); } ContainedSubtype($type) { $$ = $1; } | { Type_e type; type = GetTypeType($<<.Assignments, $type); if ($permalpha ? (type != eType_Undefined && type != eType_BMPString && type != eType_IA5String && type != eType_NumericString && type != eType_PrintableString && type != eType_VisibleString && type != eType_UniversalString) : (type != eType_Undefined && type != eType_Integer && type != eType_Real)) LLFAILED((&@@, "Bad constraint")); } ValueRange($type) { $$ = $1; } | { Type_e type; type = GetTypeType($<<.Assignments, $type); if (type != eType_Undefined && !IsRestrictedString(type) || $permalpha) LLFAILED((&@@, "Bad constraint")); } PermittedAlphabet($type) { $$ = $1; } | { Type_e type; type = GetTypeType($<<.Assignments, $type); if (type != eType_Undefined && type != eType_BitString && type != eType_OctetString && type != eType_UTF8String && type != eType_SequenceOf && type != eType_SetOf && type != eType_CharacterString && !IsRestrictedString(type) || $permalpha) LLFAILED((&@@, "Bad constraint")); } SizeConstraint { $$ = $1; } | { Type_e type; type = GetTypeType($<<.Assignments, $type); if (type != eType_Undefined && type != eType_Open || $permalpha) LLFAILED((&@@, "Bad constraint")); } TypeConstraint { $$ = $1; } | { Type_e type; type = GetTypeType($<<.Assignments, $type); if (type != eType_Undefined && type != eType_Choice && type != eType_EmbeddedPdv && type != eType_External && type != eType_InstanceOf && type != eType_Real && type != eType_Sequence && type != eType_SequenceOf && type != eType_Set && type != eType_SetOf && type != eType_CharacterString || $permalpha) LLFAILED((&@@, "Bad constraint")); } InnerTypeConstraints($type) { $$ = $1; } ; SingleValue(type) : Value($type) { $$ = NewSubtypeElement(eSubtypeElement_SingleValue); $$->U.SingleValue.Value = $1; } ; ContainedSubtype(type) : Includes Type { if (GetTypeType($>>.Assignments, $2) == eType_Null && !$1) LLFAILED((&@1, "Bad constraint")); if (GetTypeType($>>.Assignments, $type) != eType_Undefined && GetTypeType($>>.Assignments, $2) != eType_Undefined && GetTypeType($>>.Assignments, $type) != GetTypeType($>>.Assignments, $2) && GetTypeType($>>.Assignments, $type) != eType_Open && GetTypeType($>>.Assignments, $2) != eType_Open && (!IsRestrictedString(GetTypeType($>>.Assignments, $type)) || !IsRestrictedString(GetTypeType($>>.Assignments, $2)))) LLFAILED((&@2, "Bad type of contained-subtype-constraint")); $$ = NewSubtypeElement(eSubtypeElement_ContainedSubtype); $$->U.ContainedSubtype.Type = $2; } ; Includes : "INCLUDES" { $$ = 1; } | /* empty */ { $$ = 0; } ; ValueRange(type) : LowerEndpoint($type) ".." UpperEndpoint($type) { if (!$type) { $$ = NULL; } else { $$ = NewSubtypeElement(eSubtypeElement_ValueRange); $$->U.ValueRange.Lower = $1; $$->U.ValueRange.Upper = $3; } } ; LowerEndpoint(type) : LowerEndValue($type) '<' { $$ = $1; $$.Flags |= eEndPoint_Open; } | LowerEndValue($type) { $$ = $1; } ; UpperEndpoint(type) : '<' UpperEndValue($type) { $$ = $2; $$.Flags |= eEndPoint_Open; } | UpperEndValue($type) { $$ = $1; } ; LowerEndValue(type) : Value($type) { $$.Value = $1; $$.Flags = 0; } | "MIN" { $$.Value = NULL; $$.Flags = eEndPoint_Min; } ; UpperEndValue(type) : Value($type) { $$.Value = $1; $$.Flags = 0; } | "MAX" { $$.Value = NULL; $$.Flags = eEndPoint_Max; } ; SizeConstraint : "SIZE" Constraint(Builtin_Type_PositiveInteger, 0) { $$ = NewSubtypeElement(eSubtypeElement_Size); $$->U.Size.Constraints = $2; } ; TypeConstraint : Type { $$ = NewSubtypeElement(eSubtypeElement_Type); $$->U.Type.Type = $1; } ; PermittedAlphabet(type) : "FROM" Constraint($type, 1) { $$ = NewSubtypeElement(eSubtypeElement_PermittedAlphabet); $$->U.PermittedAlphabet.Constraints = $2; } ; InnerTypeConstraints(type) : { Type_t *subtype; if (GetTypeType($<<.Assignments, $type) != eType_Undefined && GetTypeType($<<.Assignments, $type) != eType_SequenceOf && GetTypeType($<<.Assignments, $type) != eType_SetOf) LLFAILED((&@@, "Bad constraint")); if (GetTypeType($<<.Assignments, $type) == eType_Undefined) subtype = NULL; else subtype = GetType($<<.Assignments, $type)->U.SS.Type; } "WITH" "COMPONENT" SingleTypeConstraint(subtype) { $$ = $3; } | { Component_t *components; if (GetTypeType($<<.Assignments, $type) != eType_Undefined && GetTypeType($<<.Assignments, $type) != eType_Sequence && GetTypeType($<<.Assignments, $type) != eType_Set && GetTypeType($<<.Assignments, $type) != eType_Choice && GetTypeType($<<.Assignments, $type) != eType_Real && GetTypeType($<<.Assignments, $type) != eType_External && GetTypeType($<<.Assignments, $type) != eType_EmbeddedPdv && GetTypeType($<<.Assignments, $type) != eType_CharacterString) LLFAILED((&@@, "Bad constraint")); if (GetTypeType($<<.Assignments, $type) == eType_Undefined) components = NULL; else components = GetType($<<.Assignments, $type)->U.SSC.Components; } "WITH" "COMPONENTS" MultipleTypeConstraints(components) { $$ = $3; } ; SingleTypeConstraint(type) : Constraint($type, 0) { $$ = NewSubtypeElement(eSubtypeElement_SingleType); $$->U.SingleType.Constraints = $1; } ; MultipleTypeConstraints(components) : FullSpecification($components) { $$ = $1; } | PartialSpecification($components) { $$ = $1; } ; FullSpecification(components) : '{' TypeConstraints($components) '}' { $$ = NewSubtypeElement(eSubtypeElement_FullSpecification); $$->U.FullSpecification.NamedConstraints = $2; } ; PartialSpecification(components) : '{' "..." ',' TypeConstraints($components) '}' { $$ = NewSubtypeElement(eSubtypeElement_PartialSpecification); $$->U.PartialSpecification.NamedConstraints = $4; } ; TypeConstraints(components) : NamedConstraint($components) { $$ = $1; } | NamedConstraint($components) ',' TypeConstraints($components) { $$ = $1; $$->Next = $3; } ; NamedConstraint(components) : identifier { Component_t *component; Type_t *type; component = FindComponent($>1.Assignments, $components, $1); type = component ? component->U.NOD.NamedType->Type : NULL; } ComponentConstraint(type) { $$ = $2; $$->Identifier = $1; } ; ComponentConstraint(type) : ValueConstraint($type) PresenceConstraint { $$ = NewNamedConstraint(); $$->Constraint = $1; $$->Presence = $2; } ; ValueConstraint(type) : Constraint($type, 0) { $$ = $1; } | /* empty */ { $$ = NULL; } ; PresenceConstraint : "PRESENT" { $$ = ePresence_Present; } | "ABSENT" { $$ = ePresence_Absent; } | "OPTIONAL" { $$ = ePresence_Optional; } | /* empty */ { $$ = ePresence_Normal; } ; GeneralConstraint : CON_XXX1 { MyAbort(); } ; #line 28 "directiv.ll" LocalTypeDirectiveSeq : LocalTypeDirective LocalTypeDirectiveESeq { if ($2) { $$ = DupDirective($1); $$->Next = $2; } else { $$ = $1; } } ; LocalTypeDirectiveESeq : LocalTypeDirective LocalTypeDirectiveESeq { if ($2) { $$ = DupDirective($1); $$->Next = $2; } else { $$ = $1; } } | /* empty */ { $$ = NULL; } ; LocalTypeDirective : "--$zero-terminated--" { $$ = NewDirective(eDirective_ZeroTerminated); } | "--$pointer--" { $$ = NewDirective(eDirective_Pointer); } | "--$no-pointer--" { $$ = NewDirective(eDirective_NoPointer); } ; LocalSizeDirectiveSeq : LocalSizeDirective LocalSizeDirectiveESeq { if ($2) { $$ = DupDirective($1); $$->Next = $2; } else { $$ = $1; } } ; LocalSizeDirectiveESeq : LocalSizeDirective LocalSizeDirectiveESeq { if ($2) { $$ = DupDirective($1); $$->Next = $2; } else { $$ = $1; } } | /* empty */ { $$ = NULL; } ; LocalSizeDirective : "--$fixed-array--" { $$ = NewDirective(eDirective_FixedArray); } | "--$doubly-linked-list--" { $$ = NewDirective(eDirective_DoublyLinkedList); } | "--$singly-linked-list--" { $$ = NewDirective(eDirective_SinglyLinkedList); } | "--$length-pointer--" { $$ = NewDirective(eDirective_LengthPointer); } ; PrivateDir_Type : "PrivateDir_TypeName" lcsymbol { $$ = $2; } | /* empty */ { $$ = NULL; }; PrivateDir_Field : "PrivateDir_FieldName" lcsymbol { $$ = $2; } | /* empty */ { $$ = NULL; }; PrivateDir_Value : "PrivateDir_ValueName" lcsymbol { $$ = $2; } | /* empty */ { $$ = NULL; }; PrivateDir_Public : "PrivateDir_Public" { $$ = 1; } | /* empty */ { $$ = 0; }; PrivateDir_Intx : "PrivateDir_Intx" { $$ = 1; } | /* empty */ { $$ = 0; }; PrivateDir_LenPtr : "PrivateDir_LenPtr" { $$ = 1; } | /* empty */ { $$ = 0; }; PrivateDir_Pointer : "PrivateDir_Pointer" { $$ = 1; } | /* empty */ { $$ = 0; }; PrivateDir_Array : "PrivateDir_Array" { $$ = 1; } | /* empty */ { $$ = 0; }; PrivateDir_NoCode : "PrivateDir_NoCode" { $$ = 1; } | /* empty */ { $$ = 0; }; PrivateDir_NoMemCopy : "PrivateDir_NoMemCopy" { $$ = 1; } | /* empty */ { $$ = 0; }; PrivateDir_OidPacked : "PrivateDir_OidPacked" { $$ = 1; } | /* empty */ { $$ = 0; }; PrivateDir_OidArray : "PrivateDir_OidArray" { $$ = 1; } | /* empty */ { $$ = 0; }; PrivateDir_SLinked : "PrivateDir_SLinked" { $$ = 1; } | /* empty */ { $$ = 0; }; PrivateDir_DLinked : "PrivateDir_DLinked" { $$ = 1; } | /* empty */ { $$ = 0; }; PrivateDirectives : PrivateDir_Intx PrivateDir_LenPtr PrivateDir_Pointer PrivateDir_Array PrivateDir_NoCode PrivateDir_NoMemCopy PrivateDir_Public PrivateDir_OidPacked PrivateDir_OidArray PrivateDir_Type PrivateDir_Field PrivateDir_Value PrivateDir_SLinked PrivateDir_DLinked { $$ = (PrivateDirectives_t *) malloc(sizeof(PrivateDirectives_t)); if ($$) { memset($$, 0, sizeof(PrivateDirectives_t)); $$->fIntx = $1; $$->fLenPtr = $2; $$->fPointer = $3; $$->fArray = $4; $$->fNoCode = $5; $$->fNoMemCopy = $6; $$->fPublic = $7; $$->fOidPacked = $8; $$->fOidArray = $9 | g_fOidArray; $$->pszTypeName = $10; $$->pszFieldName = $11; $$->pszValueName = $12; $$->fSLinked = $13; $$->fDLinked = $14; } } | /* empty */ { $$ = NULL; }; #line 73 "object.ll" DefinedObjectClass : ExternalObjectClassReference { $$ = $1; } | objectclassreference { $$ = $1; } | Usefulobjectclassreference { $$ = $1; } ; DefinedObject : ExternalObjectReference { $$ = $1; } | objectreference { $$ = $1; } ; DefinedObjectSet : ExternalObjectSetReference { $$ = $1; } | objectsetreference { $$ = $1; } ; Usefulobjectclassreference : "TYPE-IDENTIFIER" { $$ = Builtin_ObjectClass_TypeIdentifier; } | "ABSTRACT-SYNTAX" { $$ = Builtin_ObjectClass_AbstractSyntax; } ; ObjectClassAssignment : objectclassreference "::=" ObjectClass($1) { if (!AssignObjectClass(&$>>.Assignments, $1, $3)) LLFAILED((&@1, "Type `%s' twice defined", $1->U.Reference.Identifier)); } ; ObjectClass(oc) : DefinedObjectClass { $$ = $1; } | ObjectClassDefn($oc) { $$ = $1; } | ParameterizedObjectClass { MyAbort(); } ; ObjectClassDefn(oc) : "CLASS" '{' FieldSpec_List($oc) '}' WithSyntaxSpec_opt($oc) { ObjectClass_t *oc; oc = NewObjectClass(eObjectClass_ObjectClass); oc->U.ObjectClass.FieldSpec = $3; oc->U.ObjectClass.SyntaxSpec = $5; $$ = oc; } ; FieldSpec_List(oc) : FieldSpec($oc) FieldSpec_EList($oc) { if ($1) { if ($2) { $$ = DupFieldSpec($1); $$->Next = $2; } else { $$ = $1; } } else { $$ = $2; } } ; FieldSpec_EList(oc) : ',' FieldSpec($oc) FieldSpec_EList($oc) { if ($2) { if ($3) { $$ = DupFieldSpec($2); $$->Next = $3; } else { $$ = $2; } } else { $$ = $3; } } | /* empty */ { $$ = NULL; } ; WithSyntaxSpec_opt(oc) : "WITH" "SYNTAX" SyntaxList($oc) { $$ = $3; } | /* empty */ { $$ = NULL; } ; FieldSpec(oc) : TypeFieldSpec($oc) { $$ = $1; } | FixedTypeValueFieldSpec($oc) { $$ = $1; } | VariableTypeValueFieldSpec($oc) { $$ = $1; } | FixedTypeValueSetFieldSpec($oc) { $$ = $1; } | VariableTypeValueSetFieldSpec($oc) { $$ = $1; } | ObjectFieldSpec($oc) { $$ = $1; } | ObjectSetFieldSpec($oc) { $$ = $1; } ; TypeFieldSpec(oc) : typefieldreference($oc) TypeOptionalitySpec_opt { $$ = NewFieldSpec(eFieldSpec_Type); $$->Identifier = $1; $$->U.Type.Optionality = $2; } ; TypeOptionalitySpec_opt : "OPTIONAL" { $$ = NewOptionality(eOptionality_Optional); } | "DEFAULT" Type { $$ = NewOptionality(eOptionality_Default_Type); $$->U.Type = $2; } | /* empty */ { $$ = NewOptionality(eOptionality_Normal); } ; FixedTypeValueFieldSpec(oc) : valuefieldreference($oc) Type UNIQUE_opt ValueOptionalitySpec_opt($2) { if (GetType($>>.Assignments, $2)) { $$ = NewFieldSpec(eFieldSpec_FixedTypeValue); $$->Identifier = $1; $$->U.FixedTypeValue.Type = $2; $$->U.FixedTypeValue.Unique = $3; $$->U.FixedTypeValue.Optionality = $4; } else { $$ = NULL; } } ; UNIQUE_opt : "UNIQUE" { $$ = 1; } | /* empty */ { $$ = 0; } ; ValueOptionalitySpec_opt(type) : "OPTIONAL" { $$ = NewOptionality(eOptionality_Optional); } | "DEFAULT" Value($type) { $$ = NewOptionality(eOptionality_Default_Value); $$->U.Value = $2; } | /* empty */ { $$ = NewOptionality(eOptionality_Normal); } ; VariableTypeValueFieldSpec(oc) : valuefieldreference($oc) FieldName($oc) { Type_t *deftype; FieldSpec_t *fs, *deffs; fs = GetFieldSpecFromObjectClass($>2.Assignments, $oc, $2); deffs = GetFieldSpec($>2.Assignments, fs); if (deffs && deffs->Type == eFieldSpec_Type && deffs->U.Type.Optionality->Type == eOptionality_Default_Type) deftype = deffs->U.Type.Optionality->U.Type; else deftype = NULL; } ValueOptionalitySpec_opt(deftype) { $$ = NewFieldSpec(eFieldSpec_VariableTypeValue); $$->Identifier = $1; $$->U.VariableTypeValue.Fields = $2; $$->U.VariableTypeValue.Optionality = $3; } ; FixedTypeValueSetFieldSpec(oc) : valuesetfieldreference($oc) Type ValueSetOptionalitySpec_opt($2) { if (GetType($>>.Assignments, $2)) { $$ = NewFieldSpec(eFieldSpec_FixedTypeValueSet); $$->Identifier = $1; $$->U.FixedTypeValueSet.Type = $2; $$->U.FixedTypeValueSet.Optionality = $3; } else { $$ = NULL; } } ; ValueSetOptionalitySpec_opt(type) : "OPTIONAL" { $$ = NewOptionality(eOptionality_Optional); } | "DEFAULT" ValueSet($type) { $$ = NewOptionality(eOptionality_Default_ValueSet); $$->U.ValueSet = $2; } | /* empty */ { $$ = NewOptionality(eOptionality_Normal); } ; VariableTypeValueSetFieldSpec(oc) : valuesetfieldreference($oc) FieldName($oc) { Type_t *deftype; FieldSpec_t *fs, *deffs; fs = GetFieldSpecFromObjectClass($>2.Assignments, $oc, $2); deffs = GetFieldSpec($>2.Assignments, fs); if (deffs && deffs->Type == eFieldSpec_Type && deffs->U.Type.Optionality->Type == eOptionality_Default_Type) deftype = deffs->U.Type.Optionality->U.Type; else deftype = NULL; } ValueSetOptionalitySpec_opt(deftype) { $$ = NewFieldSpec(eFieldSpec_VariableTypeValueSet); $$->Identifier = $1; $$->U.VariableTypeValueSet.Fields = $2; $$->U.VariableTypeValueSet.Optionality = $3; } ; ObjectFieldSpec(oc) : objectfieldreference($oc) DefinedObjectClass ObjectOptionalitySpec_opt($2) { if (GetObjectClass($>>.Assignments, $2)) { $$ = NewFieldSpec(eFieldSpec_Object); $$->Identifier = $1; $$->U.Object.ObjectClass = $2; $$->U.Object.Optionality = $3; } else { $$ = NULL; } } ; ObjectOptionalitySpec_opt(oc) : "OPTIONAL" { $$ = NewOptionality(eOptionality_Optional); } | "DEFAULT" Object($oc) { $$ = NewOptionality(eOptionality_Default_Object); $$->U.Object = $2; } | /* empty */ { $$ = NewOptionality(eOptionality_Normal); } ; ObjectSetFieldSpec(oc) : objectsetfieldreference($oc) DefinedObjectClass ObjectSetOptionalitySpec_opt($2) { if (GetObjectClass($>>.Assignments, $2)) { $$ = NewFieldSpec(eFieldSpec_ObjectSet); $$->Identifier = $1; $$->U.ObjectSet.ObjectClass = $2; $$->U.ObjectSet.Optionality = $3; } else { $$ = NULL; } } ; ObjectSetOptionalitySpec_opt(oc) : "OPTIONAL" { $$ = NewOptionality(eOptionality_Optional); } | "DEFAULT" ObjectSet($oc) { $$ = NewOptionality(eOptionality_Default_ObjectSet); $$->U.ObjectSet = $2; } | /* empty */ { $$ = NewOptionality(eOptionality_Normal); } ; PrimitiveFieldName(oc) : typefieldreference($oc) { $$ = $1; } | valuefieldreference($oc) { $$ = $1; } | valuesetfieldreference($oc) { $$ = $1; } | objectfieldreference($oc) { $$ = $1; } | objectsetfieldreference($oc) { $$ = $1; } ; FieldName(oc) : objectfieldreference($oc) '.' { FieldSpec_t *fs; ObjectClass_t *oc; fs = GetObjectClassField($>2.Assignments, $oc, $1); if (fs) oc = fs->U.Object.ObjectClass; else oc = NULL; } FieldName(oc) { $$ = NewString(); $$->String = $1; $$->Next = $3; } | objectsetfieldreference($oc) '.' { FieldSpec_t *fs; ObjectClass_t *oc; fs = GetObjectClassField($>2.Assignments, $oc, $1); if (fs) oc = fs->U.ObjectSet.ObjectClass; else oc = NULL; } FieldName(oc) { $$ = NewString(); $$->String = $1; $$->Next = $3; } | PrimitiveFieldName($oc) { $$ = NewString(); $$->String = $1; } ; SyntaxList(oc) : '{' TokenOrGroupSpec_Seq($oc) '}' { $$ = $2; } ; TokenOrGroupSpec_Seq(oc) : TokenOrGroupSpec($oc) TokenOrGroupSpec_ESeq($oc) { $$ = DupSyntaxSpec($1); $$->Next = $2; } ; TokenOrGroupSpec_ESeq(oc) : TokenOrGroupSpec($oc) TokenOrGroupSpec_ESeq($oc) { $$ = DupSyntaxSpec($1); $$->Next = $2; } | /* empty */ { $$ = NULL; } ; TokenOrGroupSpec(oc) : RequiredToken($oc) { $$ = $1; } | OptionalGroup($oc) { $$ = $1; } ; OptionalGroup(oc) : '[' TokenOrGroupSpec_Seq($oc) ']' { $$ = NewSyntaxSpec(eSyntaxSpec_Optional); $$->U.Optional.SyntaxSpec = $2; } ; RequiredToken(oc) : Literal { $$ = NewSyntaxSpec(eSyntaxSpec_Literal); $$->U.Literal.Literal = $1; } | PrimitiveFieldName($oc) { $$ = NewSyntaxSpec(eSyntaxSpec_Field); $$->U.Field.Field = $1; } ; Literal : word { $$ = $1; } | ',' { $$ = ","; } ; ObjectAssignment : objectreference DefinedObjectClass "::=" Object($2) { AssignObject(&$>>.Assignments, $1, $4); } ; Object(oc) : ObjectDefn($oc) { $$ = $1; } | ObjectFromObject { $$ = $1; } | DefinedObject { $$ = $1; } | ParameterizedObject { MyAbort(); } ; ObjectDefn(oc) : DefaultSyntax($oc) { $$ = $1; } | DefinedSyntax($oc) { $$ = $1; } ; DefaultSyntax(oc) : '{' FieldSetting_EList($oc, NULL) '}' { $$ = NewObject(eObject_Object); $$->U.Object.ObjectClass = $oc; $$->U.Object.Settings = $2; } ; FieldSetting_EList(oc, se) : FieldSetting($oc, $se) { Setting_t *s, **ss, *se; for (s = $1, ss = &se; s; s = s->Next, ss = &(*ss)->Next) *ss = DupSetting(s); *ss = $se; } FieldSetting_EListC($oc, se) { for (s = $1, ss = &$$; s; s = s->Next, ss = &(*ss)->Next) *ss = DupSetting(s); *ss = $2; } | /* empty */ { $$ = NULL; } ; FieldSetting_EListC(oc, se) : ',' FieldSetting($oc, $se) { Setting_t *s, **ss, *se; for (s = $2, ss = &se; s; s = s->Next, ss = &(*ss)->Next) *ss = DupSetting(s); *ss = $se; } FieldSetting_EListC($oc, se) { for (s = $2, ss = &$$; s; s = s->Next, ss = &(*ss)->Next) *ss = DupSetting(s); *ss = $3; } | /* empty */ { $$ = NULL; } ; FieldSetting(oc, se) : PrimitiveFieldName($oc) Setting($oc, $se, $1) { $$ = $2; } ; DefinedSyntax(oc) : { ObjectClass_t *oc; SyntaxSpec_t *sy; oc = GetObjectClass($<<.Assignments, $oc); if (oc && !oc->U.ObjectClass.SyntaxSpec) LLFAILED((&@@, "Bad settings")); sy = oc ? oc->U.ObjectClass.SyntaxSpec : UndefSyntaxSpecs; } '{' DefinedSyntaxToken_ESeq($oc, NULL, sy) '}' { $$ = NewObject(eObject_Object); $$->U.Object.ObjectClass = $oc; $$->U.Object.Settings = $2; } ; DefinedSyntaxToken_ESeq(oc, se, sy) : { if (!$sy) LLFAILED((&@@, "Bad settings")); } DefinedSyntaxToken($oc, $se, $sy) { Setting_t *s, **ss, *se; for (s = $1, ss = &se; s; s = s->Next, ss = &(*ss)->Next) *ss = DupSetting(s); *ss = $se; } DefinedSyntaxToken_ESeq($oc, se, DEFINED($sy) ? $sy->Next : $sy) { for (s = $1, ss = &$$; s; s = s->Next, ss = &(*ss)->Next) *ss = DupSetting(s); *ss = $2; } | /* empty */ { if (DEFINED($sy)) LLFAILED((&@@, "Bad settings")); $$ = NULL; } ; DefinedSyntaxToken(oc, se, sy) : { if (!DEFINED($sy) || $sy->Type != eSyntaxSpec_Optional) LLFAILED((&@@, "Bad settings")); } DefinedSyntaxToken_ESeq($oc, $se, $sy->U.Optional.SyntaxSpec) { $$ = $1; } | { if (!DEFINED($sy) || $sy->Type != eSyntaxSpec_Optional) LLFAILED((&@@, "Bad settings")); } /* empty */ { $$ = NULL; } | { if (DEFINED($sy) && $sy->Type == eSyntaxSpec_Optional) LLFAILED((&@@, "Bad settings")); } DefinedSyntaxToken_Elem($oc, $se, $sy) { $$ = $1; } ; DefinedSyntaxToken_Elem(oc, se, sy) : { if (!$sy || (DEFINED($sy) && $sy->Type != eSyntaxSpec_Literal)) LLFAILED((&@@, "Bad settings")); } Literal { if (DEFINED($sy) && strcmp($sy->U.Literal.Literal, $1)) LLFAILED((&@@, "Bad settings")); $$ = NULL; } | { if (!$sy || (DEFINED($sy) && $sy->Type != eSyntaxSpec_Field)) LLFAILED((&@@, "Bad settings")); } Setting($oc, $se, DEFINED($sy) ? $sy->U.Field.Field : NULL) { $$ = $1; } ; Setting(oc, se, f) : { FieldSpec_t *fs; FieldSpecs_e fe; fs = GetObjectClassField($<<.Assignments, $oc, $f); fe = GetFieldSpecType($<<.Assignments, fs); if (fe != eFieldSpec_Undefined && fe != eFieldSpec_Type) LLFAILED((&@@, "Bad setting")); } Type { $$ = NewSetting(eSetting_Type); $$->Identifier = $f; $$->U.Type.Type = $1; } | { Type_t *type; FieldSpec_t *fs; FieldSpecs_e fe; Setting_t *se; fs = GetObjectClassField($<<.Assignments, $oc, $f); fe = GetFieldSpecType($<<.Assignments, fs); if (fe != eFieldSpec_Undefined && fe != eFieldSpec_FixedTypeValue && fe != eFieldSpec_VariableTypeValue) LLFAILED((&@@, "Bad setting")); if (fe == eFieldSpec_FixedTypeValue) { type = fs->U.FixedTypeValue.Type; } else if (fe == eFieldSpec_VariableTypeValue) { se = GetSettingFromSettings($<<.Assignments, $se, fs->U.VariableTypeValue.Fields); if (GetSettingType(se) != eSetting_Type && GetSettingType(se) != eSetting_Undefined) MyAbort(); if (GetSettingType(se) == eSetting_Type) type = se->U.Type.Type; else type = NULL; } else { type = NULL; } } Value(type) { if (type) { $$ = NewSetting(eSetting_Value); $$->Identifier = $f; $$->U.Value.Value = $1; } else { $$ = NULL; } } | { Type_t *type; FieldSpec_t *fs; FieldSpecs_e fe; Setting_t *se; fs = GetObjectClassField($<<.Assignments, $oc, $f); fe = GetFieldSpecType($<<.Assignments, fs); if (fe != eFieldSpec_Undefined && fe != eFieldSpec_FixedTypeValueSet && fe != eFieldSpec_VariableTypeValueSet) LLFAILED((&@@, "Bad setting")); if (fe == eFieldSpec_FixedTypeValueSet) { type = fs->U.FixedTypeValueSet.Type; } else if (fe == eFieldSpec_VariableTypeValueSet) { se = GetSettingFromSettings($<<.Assignments, $se, fs->U.VariableTypeValueSet.Fields); if (GetSettingType(se) != eSetting_Type && GetSettingType(se) != eSetting_Undefined) MyAbort(); if (GetSettingType(se) == eSetting_Type) type = se->U.Type.Type; else type = NULL; } else { type = NULL; } } ValueSet(type) { if (type) { $$ = NewSetting(eSetting_ValueSet); $$->Identifier = $f; $$->U.ValueSet.ValueSet = $1; } else { $$ = NULL; } } | { ObjectClass_t *oc; FieldSpec_t *fs; FieldSpecs_e fe; fs = GetObjectClassField($<<.Assignments, $oc, $f); fe = GetFieldSpecType($<<.Assignments, fs); if (fe != eFieldSpec_Undefined && fe != eFieldSpec_Object) LLFAILED((&@@, "Bad setting")); if (fe == eFieldSpec_Object) oc = fs->U.Object.ObjectClass; else oc = NULL; } Object(oc) { $$ = NewSetting(eSetting_Object); $$->Identifier = $f; $$->U.Object.Object = $1; } | { ObjectClass_t *oc; FieldSpec_t *fs; FieldSpecs_e fe; fs = GetObjectClassField($<<.Assignments, $oc, $f); fe = GetFieldSpecType($<<.Assignments, fs); if (fe != eFieldSpec_Undefined && fe != eFieldSpec_ObjectSet) LLFAILED((&@@, "Bad setting")); if (fe == eFieldSpec_ObjectSet) oc = fs->U.ObjectSet.ObjectClass; else oc = NULL; } ObjectSet(oc) { $$ = NewSetting(eSetting_ObjectSet); $$->Identifier = $f; $$->U.ObjectSet.ObjectSet = $1; } ; ObjectSetAssignment : objectsetreference DefinedObjectClass "::=" ObjectSet($2) { AssignObjectSet(&$>>.Assignments, $1, $4); } ; ObjectSet(oc) : '{' ObjectSetSpec($oc) '}' { $$ = $2; } ; ObjectSetSpec(oc) : ElementSetSpec(NULL, $oc, 0) { $$ = NewObjectSet(eObjectSet_ObjectSet); $$->U.ObjectSet.ObjectClass = $oc; $$->U.ObjectSet.Elements = $1; } | "..." { $$ = NewObjectSet(eObjectSet_ExtensionMarker); $$->U.ExtensionMarker.ObjectClass = $oc; } ; ObjectSetElements(oc) : ObjectSetFromObjects { $$ = NewObjectSetElement(eObjectSetElement_ObjectSet); $$->U.ObjectSet.ObjectSet = $1; } | Object($oc) { $$ = NewObjectSetElement(eObjectSetElement_Object); $$->U.Object.Object = $1; } | DefinedObjectSet { $$ = NewObjectSetElement(eObjectSetElement_ObjectSet); $$->U.ObjectSet.ObjectSet = $1; } | ParameterizedObjectSet { MyAbort(); } ; ObjectClassFieldType : DefinedObjectClass '.' FieldName($1) { FieldSpec_t *fs; fs = GetFieldSpecFromObjectClass($>>.Assignments, $1, $3); if (!fs) { $$ = NewType(eType_Undefined); } else { switch (fs->Type) { case eFieldSpec_Type: case eFieldSpec_VariableTypeValue: case eFieldSpec_VariableTypeValueSet: $$ = NewType(eType_Open); break; case eFieldSpec_FixedTypeValue: $$ = fs->U.FixedTypeValue.Type; break; case eFieldSpec_FixedTypeValueSet: $$ = fs->U.FixedTypeValueSet.Type; break; case eFieldSpec_Object: LLFAILED((&@1, "Object field not permitted")); /*NOTREACHED*/ case eFieldSpec_ObjectSet: LLFAILED((&@1, "ObjectSet field not permitted")); /*NOTREACHED*/ default: MyAbort(); } } } ; ObjectClassFieldValue(type) : OpenTypeFieldVal { $$ = $1; } | FixedTypeFieldVal($type) { $$ = $1; } ; OpenTypeFieldVal : Type ':' Value($1) { $$ = $3; } ; FixedTypeFieldVal(type) : BuiltinValue($type) { $$ = $1; } | ReferencedValue { $$ = $1; } ; %comment InformationFromObjects : ValueFromObject | ValueSetFromObjects | TypeFromObject | ObjectFromObject | ObjectSetFromObjects ; %endcomment %comment ValueFromObject : OBJ_XXX1 ; ValueSetFromObjects : OBJ_XXX1 ; TypeFromObject : OBJ_XXX1 ; ObjectFromObject : OBJ_XXX1 ; ObjectSetFromObjects : OBJ_XXX1 ; %endcomment ValueFromObject : ReferencedObjects '.' { Object_t *o; ObjectClass_t *oc; o = GetObject($>2.Assignments, $1); oc = o ? o->U.Object.ObjectClass : NULL; } FieldName(oc) { FieldSpec_t *fs; FieldSpecs_e fe; fs = GetFieldSpecFromObjectClass($>>.Assignments, oc, $3); fe = GetFieldSpecType($>>.Assignments, fs); if (fe != eFieldSpec_Undefined && fe != eFieldSpec_FixedTypeValue && fe != eFieldSpec_VariableTypeValue) LLFAILED((&@2, "Bad field type")); if (fe != eFieldSpec_Undefined) { $$ = GetValueFromObject($>>.Assignments, $1, $3); } else { $$ = NULL; } } ; ValueSetFromObjects : ReferencedObjects '.' { Object_t *o; ObjectClass_t *oc; o = GetObject($>2.Assignments, $1); oc = o ? o->U.Object.ObjectClass : NULL; } FieldName(oc) { FieldSpec_t *fs; FieldSpecs_e fe; fs = GetFieldSpecFromObjectClass($>>.Assignments, oc, $3); fe = GetFieldSpecType($>>.Assignments, fs); if (fe != eFieldSpec_Undefined && fe != eFieldSpec_FixedTypeValueSet && fe != eFieldSpec_VariableTypeValueSet) LLFAILED((&@2, "Bad field type")); if (fe != eFieldSpec_Undefined) { $$ = GetValueSetFromObject($>>.Assignments, $1, $3); } else { $$ = NULL; } } | ReferencedObjectSets '.' { ObjectSet_t *os; ObjectClass_t *oc; os = GetObjectSet($>2.Assignments, $1); oc = os && os->Type == eObjectSet_ObjectSet ? os->U.ObjectSet.ObjectClass : NULL; } FieldName(oc) { FieldSpec_t *fs; FieldSpecs_e fe; fs = GetFieldSpecFromObjectClass($>>.Assignments, oc, $3); fe = GetFieldSpecType($>>.Assignments, fs); if (fe != eFieldSpec_Undefined && fe != eFieldSpec_FixedTypeValue && fe != eFieldSpec_FixedTypeValueSet) LLFAILED((&@2, "Bad field type")); if (fe != eFieldSpec_Undefined) { $$ = GetValueSetFromObjectSet($>>.Assignments, $1, $3); } else { $$ = NULL; } } ; TypeFromObject : ReferencedObjects '.' { Object_t *o; ObjectClass_t *oc; o = GetObject($>2.Assignments, $1); oc = o ? o->U.Object.ObjectClass : NULL; } FieldName(oc) { FieldSpec_t *fs; FieldSpecs_e fe; fs = GetFieldSpecFromObjectClass($>>.Assignments, oc, $3); fe = GetFieldSpecType($>>.Assignments, fs); if (fe != eFieldSpec_Undefined && fe != eFieldSpec_Type) LLFAILED((&@2, "Bad field type")); if (fe != eFieldSpec_Undefined) $$ = GetTypeFromObject($>>.Assignments, $1, $3); else $$ = NULL; } ; ObjectFromObject : ReferencedObjects '.' { Object_t *o; ObjectClass_t *oc; o = GetObject($>2.Assignments, $1); oc = o ? o->U.Object.ObjectClass : NULL; } FieldName(oc) { FieldSpec_t *fs; FieldSpecs_e fe; fs = GetFieldSpecFromObjectClass($>>.Assignments, oc, $3); fe = GetFieldSpecType($>>.Assignments, fs); if (fe != eFieldSpec_Undefined && fe != eFieldSpec_Object) LLFAILED((&@2, "Bad field type")); if (fe != eFieldSpec_Undefined) $$ = GetObjectFromObject($>>.Assignments, $1, $3); else $$ = NULL; } ; ObjectSetFromObjects : ReferencedObjects '.' { Object_t *o; ObjectClass_t *oc; o = GetObject($>2.Assignments, $1); oc = o ? o->U.Object.ObjectClass : NULL; } FieldName(oc) { FieldSpec_t *fs; FieldSpecs_e fe; fs = GetFieldSpecFromObjectClass($>>.Assignments, oc, $3); fe = GetFieldSpecType($>>.Assignments, fs); if (fe != eFieldSpec_Undefined && fe != eFieldSpec_ObjectSet) LLFAILED((&@2, "Bad field type")); if (fe != eFieldSpec_Undefined) $$ = GetObjectSetFromObject($>>.Assignments, $1, $3); else $$ = NULL; } | ReferencedObjectSets '.' { ObjectSet_t *os; ObjectClass_t *oc; os = GetObjectSet($>2.Assignments, $1); oc = os ? os->U.OE.ObjectClass : NULL; } FieldName(oc) { FieldSpec_t *fs; FieldSpecs_e fe; fs = GetFieldSpecFromObjectClass($>>.Assignments, oc, $3); fe = GetFieldSpecType($>>.Assignments, fs); if (fe != eFieldSpec_Undefined && fe != eFieldSpec_Object && fe != eFieldSpec_ObjectSet) LLFAILED((&@2, "Bad field type")); if (fe != eFieldSpec_Undefined) $$ = GetObjectSetFromObjectSet($>>.Assignments, $1, $3); else $$ = NULL; } ; ReferencedObjects : DefinedObject { $$ = $1; } | ParameterizedObject { MyAbort(); } ; ReferencedObjectSets : DefinedObjectSet { $$ = $1; } | ParameterizedObjectSet { MyAbort(); } ; InstanceOfType : "INSTANCE" "OF" DefinedObjectClass { Component_t *co1, *co2; Type_t *ty; $$ = NewType(eType_InstanceOf); $$->U.Sequence.Components = co1 = NewComponent(eComponent_Normal); co1->Next = co2 = NewComponent(eComponent_Normal); ty = NewType(eType_FieldReference); ty->U.FieldReference.Identifier = "&id"; ty->U.FieldReference.ObjectClass = $3; co1->U.Normal.NamedType = NewNamedType("type-id", ty); ty = NewType(eType_FieldReference); ty->Tags = NewTag(eTagType_Explicit); ty->Tags->Tag = Builtin_Value_Integer_0; ty->U.FieldReference.Identifier = "&Type"; ty->U.FieldReference.ObjectClass = $3; co2->U.Normal.NamedType = NewNamedType("value", ty); } ; InstanceOfValue(type) : SequenceValue($type) { $$ = $1; } ; #line 29 "future.ll" MacroDefinition : DUM_XXX1 { MyAbort(); } ; MacroDefinedType : DUM_XXX2 { MyAbort(); } ; MacroDefinedValue(type) : DUM_XXX3 { MyAbort(); } ; ParameterizedValueSetType : DUM_XXX4 { MyAbort(); } ; ParameterizedReference : DUM_XXX5 { MyAbort(); } ; ParameterizedType : DUM_XXX7 { MyAbort(); } ; ParameterizedValue : DUM_XXX9 { MyAbort(); } ; ParameterizedAssignment : DUM_XXX16 { MyAbort(); } ; ParameterizedObjectClass : DUM_XXX17 { MyAbort(); } ; ParameterizedObject : DUM_XXX2 { MyAbort(); } ; ParameterizedObjectSet : DUM_XXX12 { MyAbort(); } ; %% #line 1242 "main.ll" #line 280 "directiv.ll"