X680 25 Sequence类型标识

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值