13 模块定义
13.1 ModuleDefinition通过以下表达式定义:
ModuleDefinition ::=
ModuleIdentifier
DEFINITIONS
EncodingReferenceDefault
TagDefault
ExtensionDefault
“::=”
BEGIN
ModuleBody
EncodingControlSections
END
ModuleIdentifier ::=
modulereference
DefinitiveIdentification
DefinitiveIdentification ::=
| DefinitiveOID
| DefinitiveOIDandIRI
| empty
DefinitiveOID ::=
“{” DefinitiveObjIdComponentList ”}”
DefinitiveOIDandIRI ::=
DefinitiveOID
IRIValue
DefinitiveObjIdComponentList ::=
DefinitiveObjIdComponent
| DefinitiveObjIdComponentDefinitiveObjIdComponentList
DefinitiveObjIdComponent ::=
NameForm
| DefinitiveNumberForm
| DefinitiveNameAndNumberForm
DefinitiveNumberForm ::= number
DefinitiveNameAndNumberForm ::=identifier “(” DefinitiveNumberForm ”)”
EncodingReferenceDefault ::=
encodingreference INSTRUCTIONS
| empty
TagDefault ::=
EXPLICIT TAGS
| IMPLICIT TAGS
| AUTOMATIC TAGS
|empty
ExtensionDefault ::=
EXTENSIONBILITY IMPLIED
| empty
ModuleBody ::=
Exports Imports AssignmentList
| empty
Exports ::=
EXPORTS SymbolsExported”;”
| EXPORTS ALL”;”
| empty
SymbolsExported ::=
SymbolList
| empty
Imports ::=
IMPORTS SymbolsImported”;”
| empty
SymbolsImported ::=
SymbolsFromModuleList
| empty
SymbolsFromModuleList ::=
SymbolsFromModule
| SymbolsFromModuleList SymbolsFromModule
SymbolsFromModule ::=
SymbolList FROMGlobalModuleReference
GlobalModuleReference ::=
modulereference AssignedIdentifier
AssignedIdentifier ::=
ObjectIdentifierValue
| DefinedValue
| empty
SymbolList ::=
Symbol
| SymbolList”,”Symbol
Symbol ::=
Reference
| ParameterizedReference
Reference ::=
typereference
| valuereference
| objectclassreference
| objectreference
| objectsetreference
AssignmentList ::=
Assignment
| AssignmentList Assignment
Assignment ::=
TypeAssignment
| ValueAssignment
| XMLValueAssignment
| ValueSetTypeAssignment
| ObjectClassAssignment
| ObjectAssignment
| ObjectSetAssignment
| ParameterizedAssignment
注1- Exports和Imports列表中使用的ParameterizedReference在X683中定义。
注2- ModuleBody可以在ModuleDefinition之外使用。例如本规范定义的universal类标签。
注3- TypeAssignment,ValueAssignment, XMLValueAssignment, ValueSetTypeAssignment表达式在16章定义。
注4- TagDefault的值只影响在模块中显示定义的类型。不影响引入的类型。
注5- 分号不在分配列表及其子表达式中使用,它保留给ASN.1工具开发者使用。
13.2 TagDefault如果为空,那么是EXPLICIT TAGS。
注-31.2节提供了EXPLICITTAGS, IMPLICIT TAGS 和AUTOMATIC TAGS的含义。
13.3 当TagDefault选择AUTOMATIC TAGS时,意味着该模块选择了自动标签,否则就是没有选择。自动标签应用与ComponentTypeLists和AlternativeTypeLists表达式,并根据模块定义依照语法改变。这个改变过程在25.8到25.10,27.3,29.2到29.5解释sequence类型、set类型和choice类型的时候分别详细介绍。
13.4 EXTENSIBILITY IMPLIED 选项等同于在模块的每个类型中插入扩展符(…)。隐式扩展符一般都在类型的显示扩展符之后。EXTENSIBILITY IMPLIED的缺席意味着扩展性只提供给那些具备显式扩展符模块的类型。
注-EXTESIBILITYIMPLIED只对类型有效。对对象集和子类型约束无效。
13.5 EncodingReferenceDefault指定encodingreference是模块的默认编码引用。如果EncodingReferenceDefault非空,那么模块的默认编码引用是TAG。
注-附录E包含了允许编码引用列表,与本规范一同定义了编码指南的结构和含义。
13.6 ModuleIdentifier表达式中定义的modulereference被成为模块名称。
注-在单个ASN.1模块中定义多个ModuleBody,并使用同一个modulereference在以前版本的规范中是允许的。但是在本版本的规范中是禁止的。
13.7 模块名称在模块定义领域中只使用一次(13.10定义除外)。
13.8 如果DefinitiveIdentification非空,那么对象标识符和其他任意IRIValue值应该唯一的表示OID树的同样节点用于识别已定义的模块。没有被定义的值或许可能被用于定义对象标识符的值。IRIValue表达式在34.3中定义。
注1-强烈推荐至少一个对象标识符值(最好是一个对象标识符值加国际资源标识符值)分配给模块,以便于其他用户可以唯一的引用模块。
注2-模块要求使用一个新的DefinitiveIdentification不在本规范中讨论。
13.9 如果AssignedIdentifier非空,那么ObjectIdentifierValue和DefinedValue应该分别可以在引入名称中识别模块。当AssignedIdentifier选择DefinedValue,它应该是对象类型标识符的值。AssignedIdentifier中的每个valuereference应该符合以下规定中的一条:
a) 已经在已定义的模块的AssignmentList中定义,并且所有的出现在右侧的valuereference也已经符合本规则a或下一条规则b。
b) 它作为AssignmentList中不包含任何valuereference的SymbolsFromModule的一个Symbol出现。
注1-推荐指定对象标识符已方便其他人可以唯一的引用模块。
注2-本句法并没有提供包含一个国际资源标识符引用给被引用模块,但是推荐包含在一个ASN.1注释中。
13.10 SymbolsFromModule中的GlobalModuleReference应该包含在另一模块的ModuleDefinition中,除非他包含一个非空的DefinitiveIdentification,modulerefernce在两者之间可能是不同的。
注-只有在从两个模块中引用相同名称的symbol时,不同的modulereference在其他的模块中才可能被使用。截然不同的名字使得这些名称在模块体中可以使用。
13.11 当modulereference和非空的AssignedIdentifier同时使用与引用模块,那么后者应该被认为是权威的。
13.12 如果被引用的模块包含一个非空的DefinitiveIdentification,那引用那个模块的GlobalModuleReference应该包含一个非空的AssignedIdentifier。
13.13 如果Exports选择SymbolsExported:
a) 每个SymbolsExported中的Symbol应该符合且只符合一下条件中的一条:
i) 在模块创建时定义;或
ii) 在Imports的SymbolsImported中出现且仅出现一次。
b) 每个从模块外引用的Symbol应该通过SymbolsExported,并且只有这些Symbol可以从外部模块引用进来(服从于13.14的约束);
c) 如果没有Symbol,那么SymbolsExported应该选择empty。
13.14 如果Exports选择empty或EXPORTS ALL,那么模块定义的所有Symbol和从其他模块引用的的Symbol服从13.13a定义的约束。
注-Exports包含empty选项是为了向后兼容。
13.15如果在NamedNumberList,Enumeration,NamedBitList中的标识符的引用类型是输出或一个输出类型的组件,那么该标识符是被隐性输出的。
13.16 如果Imports选择SymbolsImported:
a) SymbolsFromModule应该定义在模块体中,或出现模块通过GlobalModuleReference在SymbolsFromModule指定的Imports部分。只有在Symbol不是定义在被引入的模块中,而且Symbol在那个从句中是唯一的的情况下允许通过引入模块的Imports部分引入Symbol。
注1-这并不禁止在两个不同的模块中定义一样的记号名称,并引用到第三个模块中。然而如果模块A中如果在Imports部分出现Symbol名称一样的情况,那么那个Symbol名称不可以从模块A引入到模块B。
b) 如果SymbolsFromModule的Exports选择了以GlobalModuleReference为符号的SymbolsExported,Symbol应该在SymbolsExported中定义。
c) 只有SymbolsFromModule中的SymbolList中定义的Symbol可能作为任意modulereference使用GlobalModuleReference指定的External<X>Reference的记号。
d) 如果Symbol为空,那么SymbolsImported选择empty。
注2- c) 和 d)对IMPORTS的声明隐含着模块不能包含External<X>Reference。
e) SymbolsFromModuleList中的SymbolsFromModule应该包含与GlobalModuleReference:
i) 包含的modulereference应该是不同的,且与模块引入的也不同;
ii) AssignedIdentifier如果非空,那么应该相互是不同的,且与模块引入的也不同。
13.17 如果Imports选择的是empty,模块依然可以通过External<X>reference引用其他模块定义的Symbols。
注-Imports保留empty选项是为向后兼容。
13.18 如果在NamedNumberList,Enumeration,NamedBitList中的标识符的引用类型是引入的或作为组件或子组件的引入类型的,那么该标识符被隐性引入。
13.19 SymbolsFromModule中的Symbol可能作为Reference出现在ModuleBody。Symbol的意义是它在模块中对应与GlobalModuleReference。
13.20 如果Symbol出现在AssignmentList中,或出现在SymbolsFromModule的一个或多个实例中,它应该只用于External<X>Reference。如果Symbol不出现,他应该直接作为Reference使用。
13.21 Assignment的众多选项在本规范或其他规范中定义:
TypeAssignment 16.1
ValueAssignment 16.2
XMLValueAssignment 16.2
ValueSetTypeAssignment 16.6
ObjectClassAssignment X681 9.1
ObjectAssignment X681 11.1
ObjectSetAssignment X681 12.1
ParameterizedAssignment X683 8.1
13.22 EncodingControlSections在第54章定义。