25 Sequence類型標識
25.1 定義sequence類型(詳見3.8.67)的標識是SequenceType:
SequenceType ::=
SEQUENCE “{” “}”
| SEQUENCE “{”ExtensionAndException OptionalExtensionMarker “}”
| SEQUENCE “{” ComponentTypeLists “}”
ExtensionAndException ::= “…” | “…”ExceptionSpec
OptionalExtensionMarker ::= “,” “…” |empty
ComponentTypeLists ::=
RootComponentTypeList
| RootComponentTypeList “,”ExtensionAndException ExtensionAdditions OptionalExtensionMarker
| RootComponentTypeList “,”ExtensionAndException ExtensionAdditions ExtensionEndMarker “,”ROotComponentTypeList
| ExtensionAndExceptionExtensionAdditions ExtensionEndMarker “,” RootComponentTypeList
| ExtensionAndExceptionExtensionAdditions OptionalExtensionMarker
RootComponentTypeList ::= ComponentTypeList
ExtensionEndMarker ::= “,” “…”
ExtensionAdditions ::= “,”ExtensionAdditionList
| empty
ExtensionAdditionList ::=
ExtensionAddition
| ExtensionAdditionList “,” ExtensionAddition
ExtensionAddition ::=
ComponentType
| ExtensionAdditionGroup
ExtensionAdditionGroup ::= “[[” VersionNumberComponentTypeList “]]”
VersionNumber ::= empty | number “:”
ComponnentTypeList ::=
ComponentType
| ComponentTypeList “,”ComponentType
ComponentType ::=
NamedType
| NamedType OPTIONAL
| NamedType DEFAULT Value
| COMPONENTS OF Type
25.2 出於以下目的,PrefixedType被用於定義一個原本加標籤了的類型:
a) PrefixedType是一個TaggedType;或
b) PrefixedType中的Type是一個已經存在的被加標籤了的類型。
25.3 當ComponentTypeLists表達式所在的模塊使用自動標籤模式的時候,ComponentType的任意三個NamedType選項都不是已經被加標籤的類型,那麼自動標籤功能被使用與整個ComponentTypeList,否則沒有使用。
注1- 在定義sequence類型的組件列表時使用TaggedType標識爲定義者提供了標籤控制功能,這與自動標籤機制的自動分配功能正好相反。例如:
T ::= SEQUENCE {a INTEGER, b [1] BOOLEAN,c OCTET STRING}
對於組件a,b,c 即使sequence類型T定義模塊選擇了自動標籤模式,它們也不會被自動標籤。
注2- 只有那些使用自動標籤模塊的ComponentTypeLists表達式可以使用自動標籤轉換功能。
25.4 是否使用自動標籤轉換功能由每個ComponentTypeList自行決定,並且是在25.5.定義的COMPONENTOF之前。然而,在25.8到25.10的定義中,自動標籤轉換定義在COMPONENT OF轉換定義之後生效。
注- 應用是否使用自動標籤功能取決與ComponentTypeList中是否存在標籤,而不是取決與COMPONENT OF之後的Type中的標籤。
25.5 COMPONENTS OF Type的Type應該是一個sequence類型。COMPONENTSOF Type標識應該用於定義以下內容:除可能出現在Type中的任何擴展標誌和擴展增加之外的當前組件列表,被引用的類型的所有組件類型(至少1個)。(只有RootComponentTypeList中的COMPONENT OF Type的Type包含的;擴展標記和額外擴展被COMPONENT OF Type標識忽視。)被引用類型的子類型約束被該轉換忽視。
注- 該轉換邏輯上滿足以下章節的要求。
25.6 以下章節定義了一系列根ComponentType或擴展ComponentType或同時的事件。25.6.1應適用於所有場景。
25.6.1 當一個或多個ComponentType被標誌爲OPTIONAL或DEFAULT,那些ComponentType和後續組件的標籤應該是不同的(詳見31.2)。如果選擇自動標籤,那麼要求標籤必須在自動標籤生效後必須完全不同,並且永遠有效。
25.6.2 25.6.1節必須適用於根ComponentType場景。
25.6.3 25.6.1節必須根或擴展ComponentType所有場景,在原有類型定義順序中。(忽視版本號和省略符標識)(詳見52.7)
25.7 當ComponentTypeList使用第三或第四選項,在額外擴展中的所有ComponentType應該包含唯一的標籤,並且和其他原有的ComponentType的標籤都不同。直到第一個沒有被標誌爲OPTIONAL或DEFAULT的在RootComponentTypeList尾部的ComponentType爲止。(詳見52.7)
25.8 ComponentTypeLists觸發自動標籤轉換邏輯上是在25.5定義的轉換之後,但是如果25.3決定它應該適用於ComponentTypeLists的時候才執行。自動標籤轉換通過覆蓋ComponentTypeLists中的每個ComponentType的舊NamedType表達式來實現,詳見25.10定義。
25.9 如果使用自動標籤機制,並且擴展根的ComponentType沒有包含標籤,那麼在ExtensionAdditionList中的任意ComponentType都不應該是預先標籤類型。
25.10 如果使用自動標籤,TaggedType替換定義如下:
a) 替換的TaggedType標識使用Tag Type選項;
b) 替換的TaggedType的類型爲空(如,標籤是context-specific);
c) RootComponentTypeList的第一個ComponentType的替換TaggedType的ClassNumber的標籤值爲0,第二個是1等等,升序計數;
d) 如果RootComponentTypeList缺失,那麼ExtensionAdditionList中的第一個ComponentType的TaggedType的ClassNumber的值爲0,否則它比RootComponentTypeList的最大的ClassNumber大1,ExtensionAdditionList的下一個ComponentType的ClassNumber的值比第一個大1等等,升序計數;
e) 替換的TaggedType中的Type是被替換的原有的Type。
注1- TaggedType替換隱式標籤或顯示標籤在規則在31.2.7節提供。自動標籤一般都是隱式標籤,除非Type是choice類型或一個開放類型標識,或DummyReference(詳見X683)等顯示標籤。
注2- 當25.8被滿足,組件標籤完全被定義,將不會再被修改即使當sequence類型引用另外一個使用自動標籤轉換的ComponentTypeLists。例如:
T ::= SEQUENCE {a Ta, b Tb, c Tc}
E ::= SEQUENCE {f1 E1, f2 T, f3 E3}
對於E的組件的自動標籤不會影響T的組件a,b,c的標籤,不管任何T的標籤環境。如果T被定義使用自動標籤環境,E不是自動標籤環境,自動標籤同樣適用於T的組件a,b,c。
注3- 當sequence 、類型作爲COMPONENTOF Type的Type出現,它的每個ComponentType在可能的應用自動標籤之前被應用複製至被引用的sequence type。例如:
T ::= SEQUENCE {a Ta, b SEQUENCE {b1 T1, b2T2, b3 T3}, c Tc }
W ::= SEQUENCE {x Wx, COMPONENTS OF T, yWy}
T中的a,b,c的標籤應該和W中的a,b,c的標籤不一樣,如果W被定義爲自動標籤環境,但是b1,b2,b3的標籤在T和W中是一樣的。換句話說,自動標籤轉換隻適用於提供的ComponentTypeLists。
注4- 子類型不影響自動標籤。
注5- 當使用自動標籤時,在擴展插入點之外的其他地方插入一個新的組件可能該表其他組件,導致標籤改變的副作用,可能導致與老版本的定義交互出現問題。
25.11 如果DEFAULT或OPTIONAL出現,那麼在新類型的值中對應的值可能缺失。
25.12 如果DEFAULT出現,該類型缺失的值應該等於Value指定的值,Value應該定義與NamedType表達式序列,Type定義的類型的值。
25.13 ExtensionAdditionGroup(所有組件)對應的值是可選的。然後如果該值存在,那麼對應的ComponentTypeList的沒有被標誌爲OPTIONAL或DEFAULT的組件的值必須存在。
25.14 (連同從COMPONENTS OF獲取的)ComponentTypeLists中的NamedType表達式中的identifier應該是唯一的。
25.15 除非所有的額外擴展類型和根擴展類型中的沒有被標誌爲OPTIONAL或DEFAULT的額外類型都指定了值以後,否則其他額外擴展類型的值不能指定值。
注1- 當類型中根擴展版本1通過增加額外擴展上升到版本2、版本3時,在版本3編碼中要求包含版本2的所有沒有被標誌爲OPTIONAL或DEFAULT的編碼。
注2- 如果ComponentType沒有標誌爲OPTIONAL或DEFAULT並且是額外擴展,但不在ExtensionAdditionGroup中,那麼通常應該被編碼,除非發送者使用一個較早的ComponentType沒有定義的版本發送的。
注3- 推薦使用ExtensionAdditionGroup表達式,因爲:
a) 基於編碼規則,它能夠提供更加嚴密的編碼(例如:PER);
b) 它明確的指定如果額外擴展組被編碼的時候,定義在ExtensionAdditionList中的沒有標誌爲OPTIONAL或DEFAULT的類型的值應該進行編碼(對照第一點),這使得句法更加周密。
c) 在ExtensionAdditionList中的類型必須作爲一個組被應用支持,使得句法更加明確。
25.16 VersionNumber只有在所有ExtensionAdditions和ExtensionAdditionAlternatives在ExtensionAdditionGroup中,或在攜帶VersionNumber的ExtensionAdditionAlternativesGroup中使用。ExtensionAdditionGroup中的VersionNumber的number應該大於等於2,並且應該大於插入點先前的ExtensionAdditionGroup的number。
注1- 這裏使用的協議約定沒有額外擴展組是版本1,第一個額外擴展組的數字應該大於或等於2。當單一的ExtensionAddition被ExtensionAdditions需要,那麼ExtensionAdditionGroup可以使用單個的ExtensionAddition。
注2- VersionNumber的使用約束僅限於針對單個模塊,對於引入類型沒有任何約束。
25.17 sequence類型標籤是universal類型,值16。
注- Sequence-of類型包含同樣的標籤。
25.18 定義sequence類型的值應該使用SequenceValue,或當使用XMLValue時,使用XMLSequenceValue定義。表達式如下:
SequenceValue ::=
“{” ComponentValueList “}”
| “{” “}”
ComponentValueList ::=
NamedValue
| ComponentValueList “,”NamedValue
XMLSequenceValue ::=
XMLComponentValueList
| empty
XMLComponentValueList ::=
XMLNamedValue
| XMLComponentValueListXMLNamedValue
25.19 “{” “}”或empty標識只有在以下情況下使用:
a) SequenceType中的所有ComponentType都標誌爲DEFAULT或OPTIONAL,並且所有的值都缺失;或
b) 類型標識是 SEQUENCE{}。
25.20 對於SequenceType中的NamedType,必須至少有一個NamedValue或XMLNamedValue不是標識爲OPTIONAL或DEFAULT,並且值對應NamedType序列應該是同一順序的。