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序列应该是同一顺序的。