14 引用类型和值定义
14.1 定义类型和值的表达式:
DefinedType ::=
ExternalTypeReference
| typereference
| ParameterizedType
| ParameterizedValueSetType
DefinedValue ::=
ExternalValueReference
| valuereference
| ParameterizedValue
定义了引用类型和值的定义。ParameterizedType和ParameterizedValueSetType的类型和ParameterizedValue定义的值在X683中详细定义。
14.2 NonParameterizedTypeName表达式:
NonParameterizedTypeName ::=
ExternalTypeReference
| typereference
| xmlasn1typename
该表达式在当XML标签名称用于代表ASN.1类型的时候使用。如果XML标签名称起始字符串是“XML”,那么短横线应用被用于构成NonParameterizedTypeName结构。
14.3 当XML值标识用于ASN.1模块中时,如果xmlasn1typename是CHOICE, ENUMERATED, SEQUENCE, SEQUENCE_OF, SET或SET_OF,那么XMLValueAssignment(详见16.2)或XMLOpenTypeFieldVal(详见X681 14.6)的XMLTypedValue不应该使用NonParameterizedTypeName选项。
注-在ASN.1模块中使用XML值标识加上该约束的主要原因是xmlasn1typename没有定义ASN.1类型。该规则对在编码规则(例如X693定义的XER编码)中使用该标识无效,因为由xmlasn1typename构成的XML标签名称并不用于决定编码类型。
14.4 除13.19定义外,typereference,valuereference,ParameterizedType或ParameterizedValueSetType,ParameterizedValue选项不应该在ModuleBody中使用,除非ModuleBody中定义的应用的类型或值(详见16.1和16.2)是分配给typereference或valuereference。
14.5 在ModuleBody中定义对应的modulereference的时候,ExternalTypeReference和ExternalValueReference只有在以下条件之一情况下才能使用:
a) 对应typereference或valuereference已经各自分配了值和类型;或
b) 对应typereference或valuereference在Imports部分。
从另外一个模块的Imports部分引用名称只有在那么模块的Imports部分只包含1个Symbol。
注-这里不禁止在两个不同模块中定义相同的Symbol,然后被引入到另外一个模块。然而,如果在模块A的Imports中相同Symbol出现多次,那么那个Symbol不可以通过模块A的外部引用方式引用。
14.6 外部引用用于在一个模块中请求另外一个模块定义的引用名称,定义的表达式如下:
ExternalTypeReference ::=
modulereference
“.”
typereference
ExternalValueReference ::=
modulereference
“.”
valuereference
注-其他外部引用表达式(ExternalClassReference,ExternalObjectReference, ExternalObjectSetReference)在X681中定义。
14.7 当引用模块是使用Imports的SymbolsImported选项定义,外部引用中的modulereference应该作为SymbolsImported中的GlobalModuleReference中的SymbolsFromModule确切一员出现。当引用模块使用Imports的empty选项定义,外部引用中的modulereference应该出现在模块的Reference定义的ModuleDefinition中。
14.8 当Type使用DefinedType作为标识的一部分(例如,在SubtypeConstraint),那么DefinedType应用兼容于控制它的Type。C.6.2定义该部份。
14.9 ASN.1规范中,DefinedType的每个事件都是被Type控制,DefinedType引用的某一类型的值应该与控制Type兼容。C.6.2定义该部份。