|
|
#line 1 "main.ll" /* Copyright (C) Boris Nikolaus, Germany, 1996-1997. All rights reserved. */ /* Copyright (C) Microsoft Corporation, 1997-1998. All rights reserved. */
%{ #include <stdio.h> #include <string.h> #include <ctype.h> #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 <XNumber> number %token <XString> bstring %token <XString> hstring %token <XString32> cstring %token <XString> only_uppercase_symbol %token <XString> only_uppercase_digits_symbol %token <XString> uppercase_symbol %token <XString> lcsymbol %token <XString> ampucsymbol %token <XString> amplcsymbol
%prefix T_
%type <XModuleIdentifier> ModuleIdentifier %type <XValue> DefinitiveIdentifier %type <XNamedObjIdValue> DefinitiveObjIdComponentList %type <XNamedObjIdValue> DefinitiveObjIdComponent %type <XNamedObjIdValue> DefinitiveNumberForm %type <XNamedObjIdValue> DefinitiveNameAndNumberForm %type <XTagType> TagDefault %type <XExtensionType> ExtensionDefault %type <XModuleIdentifier> GlobalModuleReference %type <XValue> AssignedIdentifier %type <XStrings> Exports %type <XStrings> SymbolsExported %type <XStringModules> Imports %type <XStringModules> SymbolsImported %type <XStringModules> SymbolsFromModule_ESeq %type <XStringModules> SymbolsFromModule %type <XStrings> SymbolList %type <XString> Symbol %type <XString> Reference %type <XType> typereference %type <XType> Externaltypereference %type <XValue> valuereference %type <XValue> Externalvaluereference %type <XObjectClass> objectclassreference %type <XObjectClass> ExternalObjectClassReference %type <XObject> objectreference %type <XObject> ExternalObjectReference %type <XObjectSet> objectsetreference %type <XObjectSet> ExternalObjectSetReference %type <XModuleIdentifier> modulereference %type <XMacro> macroreference %type <XMacro> Externalmacroreference %type <XString> localtypereference %type <XString> localvaluereference %type <XString> productionreference %type <XString> typefieldreference<XObjectClass> %type <XString> valuefieldreference<XObjectClass> %type <XString> valuesetfieldreference<XObjectClass> %type <XString> objectfieldreference<XObjectClass> %type <XString> objectsetfieldreference<XObjectClass> %type <XString> word %type <XString> identifier %type <XString> ucsymbol %type <XString> ocsymbol %type <XString> 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 <XType> DefinedType %type <XValueSet> ValueSet<XType> %type <XType> Type %type <XType> UndirectivedType %type <XType> UntaggedType %type <XType> ConstrainableType %type <XConstraints> Constraint_ESeq<XType> %type <XType> BuiltinType %type <XType> ReferencedType %type <XNamedType> NamedType %type <XType> BooleanType %type <XType> IntegerType %type <XNamedNumbers> NamedNumberList %type <XNamedNumbers> NamedNumber %type <XType> EnumeratedType %type <XNamedNumbers> Enumerations %type <XNamedNumbers> EnumerationExtension %type <XNamedNumbers> Enumeration %type <XNamedNumbers> EnumerationItem %type <XType> RealType %type <XType> BitStringType %type <XNamedNumbers> NamedBitList %type <XNamedNumbers> NamedBit %type <XType> OctetStringType %type <XType> UTF8StringType %type <XType> NullType %type <XType> SequenceType %type <XComponents> ExtensionAndException %type <XComponents> ExtendedComponentTypeList %type <XComponents> ComponentTypeListExtension %type <XComponents> AdditionalComponentTypeList %type <XComponents> ComponentTypeList %type <XComponents> ComponentType %type <XComponents> ComponentTypePostfix<XType> %type <XType> SequenceOfType %type <XType> SetType %type <XType> SetOfType %type <XType> ChoiceType %type <XType> AnyType %type <XComponents> ExtendedAlternativeTypeList %type <XComponents> AlternativeTypeListExtension %type <XComponents> AdditionalAlternativeTypeList %type <XComponents> AlternativeTypeList %type <XType> SelectionType %type <XType> TaggedType %type <XTagType> TagType %type <XTags> Tag %type <XValue> ClassNumber %type <XTagClass> Class %type <XType> ObjectIdentifierType %type <XType> EmbeddedPDVType %type <XType> ExternalType %type <XType> CharacterStringType %type <XType> RestrictedCharacterStringType %type <XType> UnrestrictedCharacterStringType %type <XType> UsefulType %type <XType> 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 <XValue> DefinedValue %type <XValue> Value<XType> %type <XValue> BuiltinValue<XType> %type <XValue> ReferencedValue %type <XNamedValues> NamedValue<XComponents> %type <XValue> BooleanValue<XType> %type <XValue> SignedNumber<XType> %type <XValue> IntegerValue<XType> %type <XValue> EnumeratedValue<XType> %type <XValue> RealValue<XType> %type <XValue> NumericRealValue<XType> %type <XValue> SpecialRealValue<XType> %type <XValue> BitStringValue<XType> %type <XValue> IdentifierList<XType> %type <XValue> Identifier_EList<XType> %type <XValue> IdentifierList_Elem<XType> %type <XValue> OctetStringValue<XType> %type <XValue> NullValue<XType> %type <XValue> GeneralizedTimeValue<XType> %type <XValue> UTCTimeValue<XType> %type <XValue> ObjectDescriptorValue<XType> %type <XValue> SequenceValue<XType> %type <XNamedValues> ComponentValueList<XComponents> %type <XNamedValues> ComponentValueCList<XComponents> %type <XValue> SequenceOfValue<XType> %type <XValue> ValueList<XType> %type <XValue> ValueCList<XType> %type <XValue> SetValue<XType> %type <XValue> SetOfValue<XType> %type <XValue> ChoiceValue<XType> %type <XValue> ObjectIdentifierValue %type <XNamedObjIdValue> ObjIdComponentList %type <XNamedObjIdValue> ObjIdComponent_ESeq %type <XNamedObjIdValue> ObjIdComponent %type <XNamedObjIdValue> NameForm %type <XNamedObjIdValue> NumberForm %type <XNamedObjIdValue> NameAndNumberForm %type <XValue> EmbeddedPDVValue<XType> %type <XValue> ExternalValue<XType> %type <XValue> CharacterStringValue<XType> %type <XValue> RestrictedCharacterStringValue<XType> %type <XValue> UnrestrictedCharacterStringValue<XType> %type <XValue> CharacterStringList<XType> %type <XValue> CharSyms<XType> %type <XValue> CharDefn<XType> %type <XQuadruple> Quadruple %type <XTuple> Tuple %type <XValue> AnyValue<XType>
#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 <XConstraints> Constraint<XType><XBoolean> %type <XConstraints> ConstraintSpec<XType><XBoolean> %type <XConstraints> SubtypeConstraint<XType><XBoolean> %type <XConstraints> ElementSetSpecs<XType><XBoolean> %type <XConstraints> ElementSetSpecExtension<XType><XBoolean> %type <XElementSetSpec> AdditionalElementSetSpec<XType><XBoolean> %type <XElementSetSpec> ElementSetSpec<XType><XObjectClass><XBoolean> %type <XElementSetSpec> Unions<XType><XObjectClass><XBoolean> %type <XElementSetSpec> UnionList<XType><XObjectClass><XBoolean> %type <XElementSetSpec> Intersections<XType><XObjectClass><XBoolean> %type <XElementSetSpec> IntersectionList<XType><XObjectClass><XBoolean> %type <XElementSetSpec> IntersectionElements<XType><XObjectClass><XBoolean> %type <XElementSetSpec> Exclusions_Opt<XType><XObjectClass><XBoolean> %type <XElementSetSpec> Exclusions<XType><XObjectClass><XBoolean> %type <XElementSetSpec> Elements<XType><XObjectClass><XBoolean> %type <XSubtypeElement> SubtypeElements<XType><XBoolean> %type <XSubtypeElement> SingleValue<XType> %type <XSubtypeElement> ContainedSubtype<XType> %type <XBoolean> Includes %type <XSubtypeElement> ValueRange<XType> %type <XEndPoint> LowerEndpoint<XType> %type <XEndPoint> UpperEndpoint<XType> %type <XEndPoint> LowerEndValue<XType> %type <XEndPoint> UpperEndValue<XType> %type <XSubtypeElement> SizeConstraint %type <XSubtypeElement> TypeConstraint %type <XSubtypeElement> PermittedAlphabet<XType> %type <XSubtypeElement> InnerTypeConstraints<XType> %type <XSubtypeElement> SingleTypeConstraint<XType> %type <XSubtypeElement> MultipleTypeConstraints<XComponents> %type <XSubtypeElement> FullSpecification<XComponents> %type <XSubtypeElement> PartialSpecification<XComponents> %type <XNamedConstraints> TypeConstraints<XComponents> %type <XNamedConstraints> NamedConstraint<XComponents> %type <XNamedConstraints> ComponentConstraint<XType> %type <XConstraints> ValueConstraint<XType> %type <XPresence> 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 <XDirectives> LocalTypeDirectiveSeq %type <XDirectives> LocalTypeDirectiveESeq %type <XDirectives> LocalTypeDirective %type <XDirectives> LocalSizeDirectiveSeq %type <XDirectives> LocalSizeDirectiveESeq %type <XDirectives> LocalSizeDirective
%type <XString> PrivateDir_Field %type <XString> PrivateDir_Type %type <XString> PrivateDir_Value %type <int> PrivateDir_Public %type <int> PrivateDir_Intx %type <int> PrivateDir_LenPtr %type <int> PrivateDir_Pointer %type <int> PrivateDir_Array %type <int> PrivateDir_NoCode %type <int> PrivateDir_NoMemCopy %type <int> PrivateDir_OidPacked %type <int> PrivateDir_OidArray %type <int> PrivateDir_SLinked %type <int> PrivateDir_DLinked %type <XPrivateDirectives> 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 <XObjectClass> DefinedObjectClass %type <XObject> DefinedObject %type <XObjectSet> DefinedObjectSet %type <XObjectClass> Usefulobjectclassreference %type <XObjectClass> ObjectClass<XObjectClass> %type <XObjectClass> ObjectClassDefn<XObjectClass> %type <XFieldSpecs> FieldSpec_List<XObjectClass> %type <XFieldSpecs> FieldSpec_EList<XObjectClass> %type <XSyntaxSpecs> WithSyntaxSpec_opt<XObjectClass> %type <XFieldSpecs> FieldSpec<XObjectClass> %type <XFieldSpecs> TypeFieldSpec<XObjectClass> %type <XOptionality> TypeOptionalitySpec_opt %type <XFieldSpecs> FixedTypeValueFieldSpec<XObjectClass> %type <XBoolean> UNIQUE_opt %type <XOptionality> ValueOptionalitySpec_opt<XType> %type <XFieldSpecs> VariableTypeValueFieldSpec<XObjectClass> %type <XFieldSpecs> FixedTypeValueSetFieldSpec<XObjectClass> %type <XOptionality> ValueSetOptionalitySpec_opt<XType> %type <XFieldSpecs> VariableTypeValueSetFieldSpec<XObjectClass> %type <XFieldSpecs> ObjectFieldSpec<XObjectClass> %type <XOptionality> ObjectOptionalitySpec_opt<XObjectClass> %type <XFieldSpecs> ObjectSetFieldSpec<XObjectClass> %type <XOptionality> ObjectSetOptionalitySpec_opt<XObjectClass> %type <XString> PrimitiveFieldName<XObjectClass> %type <XStrings> FieldName<XObjectClass> %type <XSyntaxSpecs> SyntaxList<XObjectClass> %type <XSyntaxSpecs> TokenOrGroupSpec_Seq<XObjectClass> %type <XSyntaxSpecs> TokenOrGroupSpec_ESeq<XObjectClass> %type <XSyntaxSpecs> TokenOrGroupSpec<XObjectClass> %type <XSyntaxSpecs> OptionalGroup<XObjectClass> %type <XSyntaxSpecs> RequiredToken<XObjectClass> %type <XString> Literal %type <XObject> Object<XObjectClass> %type <XObject> ObjectDefn<XObjectClass> %type <XObject> DefaultSyntax<XObjectClass> %type <XSettings> FieldSetting_EList<XObjectClass><XSettings> %type <XSettings> FieldSetting_EListC<XObjectClass><XSettings> %type <XSettings> FieldSetting<XObjectClass><XSettings> %type <XObject> DefinedSyntax<XObjectClass> %type <XSettings> DefinedSyntaxToken_ESeq<XObjectClass><XSettings><XSyntaxSpecs> %type <XSettings> DefinedSyntaxToken<XObjectClass><XSettings><XSyntaxSpecs> %type <XSettings> DefinedSyntaxToken_Elem<XObjectClass><XSettings><XSyntaxSpecs> %type <XSettings> Setting<XObjectClass><XSettings><XString> %type <XObjectSet> ObjectSet<XObjectClass> %type <XObjectSet> ObjectSetSpec<XObjectClass> %type <XObjectSetElement> ObjectSetElements<XObjectClass> %type <XType> ObjectClassFieldType %type <XValue> ObjectClassFieldValue<XType> %type <XValue> OpenTypeFieldVal %type <XValue> FixedTypeFieldVal<XType> %type <XValue> ValueFromObject %type <XValueSet> ValueSetFromObjects %type <XType> TypeFromObject %type <XObject> ObjectFromObject %type <XObjectSet> ObjectSetFromObjects %type <XObject> ReferencedObjects %type <XObjectSet> ReferencedObjectSets %type <XType> InstanceOfType %type <XValue> InstanceOfValue<XType>
#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 <XType> MacroDefinedType %type <XValue> MacroDefinedValue<XType>
%% #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"
|