|
|
/* 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
%%
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(); } ;
|