解析器生成的制作方法_4

文档序号:9769170阅读:来源:国知局
,数 据格式的容器对象和模式对象被表示为树中的节点("容器节点"和"数据节点"),并且容器 对象与数据对象之间的关系被表示为连接树的节点的边缘。在一些示例中,如果数据格式 包括矢量,则编译树表示700包括额外的"VectorCon化iner(矢量容器r节点762,其由转换 分析模块424内部地使用并且协助转换分析过程。
[0078] 转换分析模块424遍历编译树700,并且为表示容器对象的每个节点计算节点的 "扇入(fan-in)"和"扇出(fan-outr。给定容器节点的扇入被限定为可W由容器节点外的 另一个节点直接访问的容器节点范围内的所有节点(包括容器和数据节点)。类似地,给定 容器节点的扇出被限定为给定容器节点外的节点能够直接访问的容器节点中所包含的所 有节点。
[0079] -般地,当为集合类型容器计算扇入和扇出时,集合的子元素山1111化611 Of set) 们必须彼此互为目标。运可W通过对集合的所有成员进行笛卡尔积、将集合本身作为循环 并且使得所有扇出节点W所有的扇入节点为目标来完成。注意确保如果集合是矢量,则集 合的给定成员仅仅W它自身为目标。对于选择类型容器,容器的成员都不W彼此为目标。对 于序列类型容器,除了最后一个,每个子元素的扇出都W下一个子元素的扇入为目标,并且 如果下一个子元素是可选的则还W该子元素之后的一个为目标(W此类推)。如果节点本身 是矢量,则通过访问矢量节点的扇入来创建循环边缘,并且对于每个扇入节点,访问矢量节 点的扇出从而创建从扇出到扇入的边缘。
[0080] 对于图2所示的示例性数据格式,SEQ_A具有单个扇入节点P(al)和单个扇出节点U (曰6),因为P(al)和P(al)和U(a6)是容器对象中的第一个和最后一个模式对象(分别地)并 且是所需要的模式对象。因为R(b3)是可选模式对象,所Wc册1〔6_8具有包含R(b3)和SET_C 的扇入节点的列表,运意味着Q(a2)可WWR(b3)或SET_(^目标。C册1〔6_8的扇出节点列表 包含R(b3)和561'_(:。561'_(:具有包含S(c4)和T(c5)的扇入节点的列表和包含S(c4)和T(c5) 的扇出节点的列表。VectorContainer (矢量容器)节点762表示特殊、编译特定类型的容器 对象,其指定该容器的扇出可WW该容器的扇入W及序列中下一个节点的扇入为目标。
[0081] 利用所有计算出的容器节点的扇入和扇出,边缘创建过程开始。边缘创建过程开 始于形成在它本身与它的子元素(即,所有容器和容器的范围内的模式对象)之间边缘的顶 层容器。在一些示例中,从顶层容器的节点到与容器相关联的每个扇入节点创建边缘。然 后,容器的子元素被适当地连接。当边缘创建完成时,边缘被"组合",包括禁用重复的和不 完整的边缘(例如,在容器内创建但是由外部容器消除的边缘)。
[0082] 然后转换分析模块424遍历编译树表示700来创建树节点(称为源节点和目标节 点)之间的精细边缘。精细边缘被定义为从源节点到目的节点的边缘,其包括诸如循环行为 的路由信息和与该边缘相关联的最高节点。在一些示例中,精细边缘包括W下数据,该数据 表示边缘的源节点、边缘的目标节点、边缘循环行为W及边缘的最高节点。循环行为的可能 值包括No_Loop(无_循环,即,边缘不存在循环行为)、ErKl_Instance(尾_实例,即,边缘存在 循环行为,其中矢量的当前实例在结束,并且在开始新实例),W及End_Record(尾_记录, 即,边缘存在循环行为,其中当前记录在结束,并且在开始新记录)。边缘的最高节点被定义 为其中创建边缘的容器。如果当循环行为是End_Instance时在VectorContaineH矢量容 器)内创建边缘,则边缘的最高节点是VectorContainer(矢量容器)节点。否则,如果当循环 行为是End_Record时在VectorContainer (矢量容器)内创建边缘,则边缘的最高节点是被 指定为"top node(最高节点)"的特殊类型节点。一般地,当存在循环行时(即,循环行为不 是No_Loop),则边缘的树中的最高节点是VectorContainer(矢量容器)节点。例如,当从具 有End_Instance的循环行为的VectorContainer(矢量容器)包!建自S(c4)至IjT(c5)的边缘 时,S(c4)是起始节点,c5是目标节点,并且Vectorhtrl是边缘的最高节点。
[0083 ] 参照图8,示出图7的编译树表示700的精细边缘的枚举列表。
[0084] 2.3模糊求解
[0085] 由于在数据格式105中可能包括可选模式对象、不确定长度的矢量、反复标签、W 及多范围,则在识别输入流中从一个数据对象到另一个数据对象的转换中可能存在模糊。 运些模糊可能产生,作为枚举列表(图8)中具有相同源和目的的边缘。在一些示例中,转换 分析模块424发现并解决(自动地或者根据用户输入)目标数据格式105中的模糊。
[0086] 2.3.1模糊求解示例
[0087] 例如,对于图2的示例性数据格式,由于SET和矢量容器的组合,模糊存在于边缘T (c5) -乂 (c4)的多版本之间、W及边缘S (c4) -〉T (c5)的多版本之间。特别地,当存在从叮"标 签到"S"标签的转换、或者从"S"标签到叩'标签的转换时,不清楚该转换是存在于相同集合 内的数据对象之间(即,非循环"内边缘")、还是存在于一个集合中的最后一个数据对象与 后续集合中的第一个数据对象之间(即,循环"外边缘")。因为模糊是由于循环构造而产生 的,所W通过将具有相同源和目的的两个版本的边缘结合至具有多个可能目标动作的一个 边缘,可W自动地求解模糊。为了做到运点,在运个示例中,不包括循环行为的内边缘与包 括循环行为的外边缘相结合。一般地,W可能目标动作的有序列表来存储多边缘的目标动 作,其中基于按顺序遍历清单来选择特别动作(例如,基于边缘范围顺序的顺序,从最近 (内巧Ij最远(外))。选择可W基于用户输入,或者基于检查上下文(context),诸如被处理的 最后一个值的特征、或者递减计数(例如,在一对两个条目中留下一个条目)、或者径迹长度 (例如,从集合中的8个字节读取4个字节),如下更详细地描述的。
[0088] 在一些示例中,使用各种类型模糊中的任意一个。例如,如果输入数据被格式化为 ASN.1基本编码规则(B邸)数据,则数据包括标签-长度-值S元组并且不可能存在真正的模 糊。在运种情况下,利用标签-长度-值=元组中的长度信息可W自动地求解任何感知模糊。 更一般地,模糊检测和求解可W被用于快速地和有效地解决模糊问题,包括提供诸如忽略 模糊的选项、执行自动消除模糊、或者执行用户协助消除模糊。
[0089] W下是可能出现在待解析的输入流内的一系列数据对象的示例。运个示例是基于 ASN.1数据的,只是为了便于阅读,运里整数并不像在ASN.1数据中实际编码那样会进行编 码。数据对象是T I LIV形式(Tag I Length I化Iue,标签I长度I值),其中任何化Iue(值)可W是 另一个嵌套TLVS元组。
[0090] 在运个示例中,集合和序列总是具有与它们相关联的标签。ASN.1中的SET(集合) 容器默认地具有[UNIVERSAL(通用)17]的标签,并且SEQUENCE(序列)容器默认地具有 [UNIV邸SAL(通用)16]的标签。一组容器具有与SET相同的标签。元素类型的标签(在该示例 中为SET)出现在矢量的每个元素的SET标签之后。在W下示例中对应于作为"叶值"(即,不 是本身化VS元组)的Value的数字在Value的末尾用来标记。运个示例中的Tag仅仅是 16、17、81、82、83、84、85;并且不属于¥31116(值)或化肖(标签)的所有其它数字是1^6叫地(长 度)。
[0091] 16 I 36 I 811 2 I 888*117 I 24 117 110 I 83 I 2 11010*I 84 I 2 I 2020*117 110 I 83 I 2 I 444*I 84 2|555*|85|2|999*
[0092] 长度被用于维持累加器,当存在模糊或者当需要验证数据的结构完整性时,检查 该累加器(例如,当离开具有与其相关联的预期长度的容器节点时,执行检查来确保已经收 集正确长度或数据量)。在模糊的情形下,可W检查累加器来确定对于从之前标签到当前标 签的模糊边缘应该执行多目标动作中的哪个。
[0093] 在一些示例中,解析器被配置为执行输入数据的结构验证。例如,如果从输入流接 收到的数据W意外的顺序到达,则解析器将发出错误。在另一个示例中,如果从输入流接收 到的数据不能被成功地解析,则解析器将发出错误。 巧094] 2.4解析器生成
[0095] -旦目标数据格式105的精细边缘的列表被确定,则该列表被提供给程序生成模 块430,其生成解析器程序418。精细边缘的列表包括建立程序的充分信息,W填充为图6的 范围树表示600所创建的表。特别地,因为编译树表示700是具有单个根的树,所W从与边缘 相关联的源、目的和最高节点可W获得解析器操作(例如,push推送O、pop弹出()和 process处理O命令)的序列,并且循环行为指定如何处理VectorContainer(矢量容器)。
[0096] 为了建立程序,再次遍历图7的编译树表示。对于编译树表示700的每个节点,处理 与节点相关联的每个边缘,W为边缘产生程序。一般地,为了为边缘生成程序,程序生成模 块430首先为边缘生成控制流图,控制流图包括生成的代码(例如,push〇、pop( WPprocess 0命令)。然后,控制生成模块430遍历控制流图W生成程序。一旦为边缘生成程序,则程序 被添加至范围树表示600中的合适表中。在一些示例中,使用与边缘(与程序相关联)的源节 点相关联的标签将程序键入表中。
[0097] 在一些示例中,当遍历编译树表示700时,当进入容器时,容器对象的预期长度被 编码,使得当退出容器时可W进行与累积长度的比较。当进入节点时,考虑标签开销(例如, W字节为单位的标签长度),对累积进行编码,并且当退出容器时,完成对容器期望长度的 检查。在一些示例中,无论何时进入节点都将累加器清零,并将长度变量的索引(index)保 存至全局变量阵列的已知索引,使得解析器可W处理不确定长度。
[0098] 当退出容器时,累积值被添加到其父容器的累积值。在一些示例中,在可扩展容器 内对未识别标签的默认动作进行编码。对于集合容器,当退出容器时执行检查W确保集合 所需的所有字段被分配。当将来自输入流的值解析为其适当形式时,数据转换被编码,使得 可W适当地解码整数值、对象标识符等等。
[0099] 2.4.1程序生成示例
[0100] W下是编译树表示700的单个边缘(即,S(c4)一T(c5),End_Instance边缘,其在边 缘结合之后也包括No_Loop转换)的程序生成的详细说明。
[0101] 为了为运个边缘创建程序,执行代码生成,包括首先创建控制流图。控制流图是标 准的编译器数据结构,其是包括节点(节点包括语句和单个条件)的二进制树:
[0102] Stmtl,
[0103] stmt2,
[0104] ...,
[010 引 cond
[0106] 其中cond具有两个控制流图边缘:真边缘和伪边缘。与cond相关联的边缘转到控 制流图中的其他节点。给定
当前第4页1 2 3 4 5 6 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1