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章定義。