首页> 中国专利> 上下文无关文法的解析方法

上下文无关文法的解析方法

摘要

本发明公开了一种上下文无关文法的解析方法,在现有的上下文无关文法的解析算法中,引入了三种方法,即:规则首字索引哈希;状态跳转首字查询哈希;以及对同一位置同一规则的解析结果进行重用,这三种方法可以任意组合的形式应用于解析过程。该解析方法可以减少上下文无关文法的解析时间,提高解析的效率。通过规则首字索引哈希以及对局部解析结果进行重用,避免了对所有嵌套子规则的搜索,减少了搜索空间;同时,通过状态跳转首字查询哈希,使系统只需要极少次数的跳转,甚至只需一次跳转,即可搜索到匹配的规则,从而极大地提高了解析的效率。

著录项

  • 公开/公告号CN102339228A

    专利类型发明专利

  • 公开/公告日2012-02-01

    原文格式PDF

  • 申请/专利权人 盛乐信息技术(上海)有限公司;

    申请/专利号CN201010233639.6

  • 发明设计人 翟鲁峰;燕鹏举;

    申请日2010-07-22

  • 分类号G06F9/45(20060101);G06F17/27(20060101);

  • 代理机构31211 上海浦一知识产权代理有限公司;

  • 代理人刘昌荣

  • 地址 201203 上海市浦东新区张江高科技园区郭守敬路356号

  • 入库时间 2023-12-18 04:25:54

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2018-04-20

    专利权的转移 IPC(主分类):G06F9/45 登记生效日:20180403 变更前: 变更后: 申请日:20100722

    专利申请权、专利权的转移

  • 2018-04-20

    专利权人的姓名或者名称、地址的变更 IPC(主分类):G06F9/45 变更前: 变更后: 申请日:20100722

    专利权人的姓名或者名称、地址的变更

  • 2017-05-10

    授权

    授权

  • 2014-08-20

    专利申请权的转移 IPC(主分类):G06F9/45 变更前: 变更后: 登记生效日:20140728 申请日:20100722

    专利申请权、专利权的转移

  • 2013-08-07

    实质审查的生效 IPC(主分类):G06F9/45 申请日:20100722

    实质审查的生效

  • 2012-02-01

    公开

    公开

查看全部

说明书

技术领域

本发明涉及一种上下文无关文法的解析方法。

背景技术

上下文无关文法(Content Free Grammar,CFG)是一种形式文法,其定义 为:对某文法G[S],如果文法规则集P中的每一条规则的形式为A→α,A∈VN, α∈{VN∪VT)*,则该文法G为上下文无关文法。按照上下文无关文法的定义,在 推导中应用规则A→α时,无需考虑非终结符号A所在的上下文,总能把A替换 为符号串α,因此,上下文无关文法具有足够强的表达力,能被用来定义大多 数计算机程序设计语言(C,XML等),并在自然语言处理领域被广泛地用来描述 自然语言的语法和语义。

上下文无关文法虽然相比于另一种形式文法正则语言,具有更广泛的描述 能力,但是它在实时或准实时需求环境下的应用,如机器翻译,网页显示,脚 本语言解释执行等,却因其效率低下而受到限制。统观目前上下文无关文法解 释器系统的工作流程,基本可以划分为三个步骤:文法编译、解析源语言、翻 译成目标语言,如图1所示:

首先,解释器根据针对某一特定应用定义并存储在文本文件中的上下文无 关文法的规则集,将用符号表述的上下文无关文法转换为网络图,并保存在二 进制文件中。这里,网络图是一个有向图,每一个网络图对应一个文法规则, 网络图中的每一个点代表一个状态(相当于一个叉路口),连接着各种可能的跳 转,每一个箭头代表一个所引用的子规则(每条规则可以引用自己和其他规则, 被引用的规则被称为子规则)或一个终结串,还可以承载该子规则或终结串所 对应的翻译规则。为便于理解,下面以一个简单的算术文法为例来详细说明, 该算术文法的定义为:

S->T‘+’/‘加’S

|T‘-’/‘减去’S

|T

T->T‘*’/‘乘以’T

|T‘/’/‘除以’T

|‘(’/‘括号’S‘)’/‘括起来’

|‘x’/‘x’

|‘y’/‘y’

|‘z’/‘z’

其中,S和T各是一条规则,->左边是规则,右边是该规则的定义,每一行 是一个顺序逻辑,|表示逻辑“或”,+、-、*、/、x、y、z每个都是终结字串, 而它们对应的翻译字串分别为加、减去、乘以、除以、x、y、z。根据该算术文 法的规则集,对该算术文法进行编译后,产生的网络图如图2所示,其中,规 则S可以有3个定义,每个定义用网络图中的一条路径表示,因此,规则S的 网络图有3条路径;规则T可以有6个定义,因此,其网络图有6条路径。图2 中,带编号(如S1,S2,…S14)的圆圈表示状态,每个状态可比作一个路口, 有时候为了引用子规则没有分叉也可以有路口,单向箭头表示跳转,每个跳转 就像一条单行道,跳转如果引用子规则,则在箭头上加注子规则名字,如果表 示终结字串,则加注终结字串和它的翻译字串,如‘x’/‘x’。

编译后,就要在实时的应用中,对源语言文件按照文法规则进行解析,即 在文法编译后所产生的网络图中搜索跟源语言字串(用源语言表达的某个字符 串,如C语言源文件中的一条语句)匹配的路径,并生成用于结果路径的树结 构,即解析树,解析树是仅存在于内存中的数据结构,解析树上的每一个叶子 节点代表一对终结字串和它的翻译字串,解析树的顶层和中间节点则代表规则, 父节点的规则引用子节点的规则或终结字符串,子节点从左到右按引用顺序排 列。

最后,先序遍历(Preorder Traversal)解析树,并按照翻译规则(可包 含在源语言的文法规则中),把解析树叶子节点的翻译字串串起来生成用目标语 言表达的相应字符串,例如,将用C语言表达的字串翻译成用汇编语言表达的 字串,目标语言字串与源语言字串表达相同的语义。

上述系统流程中,解析过程由于要对所有可能的文法规则及嵌套子规则进 行搜索匹配,搜索空间较大,因此需要花费的时间较长,尤其是对一个由成千 上万条规则组成的复杂文法,花费的时间就更长了;同时,目前的文法解析, 对每个状态都要遍历和匹配其后接的所有可能跳转,对于后接跳转数多的情况, 例如自然语言中的数词后可接上千个可能的量词,时间上的开销就比较可观了。 而文法编译一般是在线下预先完成的,翻译由于不涉及路径搜索,相对于解析 来说,翻译的时间可以忽略不计,因此,解析效率是制约上述CFG解释器运行 效率的关键因素,要提高上下文无关文法的效率,就必须减少用于解析的时间。

发明内容

本发明要解决的技术问题是提供一种上下文无关文法的解析方法,它可以 减少解析需要花费的时间,提高上下文无关文法的解析效率。

为解决上述技术问题,本发明的上下文无关文法的解析方法,在对上下文 无关文法进行解析的过程中,引入了以下三种方法:

(1)规则首字索引哈希;

(2)对后接跳转数多的状态,使用状态跳转首字查询哈希;

(3)对同一位置同一规则的解析结果进行重用;

上述三种方法可以任意组合的形式应用于解析过程,即可以同时使用上述 三种方法,或者使用其中的任意两种,或者仅使用其中的任意一种。

所述规则首字索引哈希,包括下列步骤:

(a)以规则编号和规则首字为索引关键字,通过哈希函数计算哈希值,并构 造出规则首字索引哈希表;

(b)对每条规则进行解析前,查找该规则首字索引哈希表,判断输入字串的 当前字符是否在该规则首字索引哈希表中,如果存在,则对该规则进行解析, 如果不存在,则不对该规则进行解析。

所述状态跳转首字查询哈希,包括下列步骤:

(a)以状态编号和跳转首字为索引关键字,通过哈希函数计算哈希值,并构 造出状态跳转首字查询哈希表;

(b)解析时,查找该状态跳转首字查询哈希表,并将该状态跳转首字查询哈 希表中所有首字与输入字串的当前字符匹配的跳转的编号反馈给系统。

所述对同一位置同一规则的解析结果的重用,通过结合使用完成令牌表、 进行状态表以及等待令牌表来实现,具体步骤是:令牌在开展搜索前,首先查 询进行状态表,判断是否有其他令牌正在进行同样的搜索,如果有,就在原地 等待,由其他令牌完成搜索后,通过等待令牌表查找到该令牌,让该令牌重用 其搜索结果;如果没有,则再继续查找完成令牌表,判断是否有其他令牌已经 完成了同样的搜索,并且在源字符串中有相同的起始位置,如果有,则重用搜 索结果,如果没有,则开展搜索。

与现有的解析方法相比,本发明的上下文无关文法的解析方法,通过规则 首字索引哈希以及对局部的规则解析结果进行重用,避免了对所有嵌套子规则 的搜索,大大减少了搜索空间,节省了解析时间;而通过状态跳转首字查询哈 希,并针对连续编码字符所作的对哈希表的进一步优化,使系统只需要极少次 数的跳转,甚至只需要一次跳转,即可搜索到匹配的规则,因此,极大地提高 了解析的效率。

附图说明

下面结合附图与具体实施方式对本发明作进一步详细的说明:

图1是现有的上下文无关文法解释器的系统流程图;

图2是现有的上下文无关文法解释器系统在文法编译后产生的网络图的示 例图;

图3是本发明的完成令牌表;

图4是本发明的进行状态表;

图5是本发明的等待令牌表。

具体实施方式

为对本发明的技术内容、特点与功效有更具体的了解,现结合图示的实施 方式,详述如下:

本发明的上下文无关文法的解析方法,在当前的上下文无关文法的解析算 法中引入了三种提高解析效率的方法,即规则首字索引哈希、状态跳转首字查 询哈希和规则解析结果的重用,这三种方法可以同时使用,以最大限度地提高 解析的效率,也可以只使用其中的任意一种,或者是使用其中的任意两种。以 下是对这三种方法的详细说明。

首先,本发明在当前的上下文无关文法的解析算法中引入了规则首字索引 哈希。由于最终能与输入的一条源语言字串相匹配的文法规则只有一条,绝大 多数的规则匹配都是无效的,因此,为减少搜索空间,本发明对每一条规则建 立了一个规则首字索引哈希表,以用于快速索引。哈希表的实现方法有多种, 本发明在实施时可采用最常用的拉链法哈希结构,即以规则编号和首字作为规 则首字索引哈希表的索引关键字(key),以这两个索引关键字为自变量计算哈 希函数(可采用传统的Time33算法)的值,即哈希值(value),并以哈希值作 为一个数组各单元的下标,索引值是一个布尔值,表示是否存在。在对每条规 则进行解析前,首先根据该规则编号和输入字串的当前字符计算出哈希值,然 后查找规则首字索引哈希表,判断是否有与之对应的数组下标,即判断输入字 串的当前字符是否在哈希表中,如果存在,则对该规则进行剖析,如果不存在, 则放弃这一可能路径,不进入该规则的解析。引入规则首字索引哈希表后,解 析时就只需要对首字与输入字串的当前字符相同的规则进行解析,不需要再对 所有的规则及子规则和孙子规则等等进行嵌套搜索匹配,虽然采用哈希查询会 不可避免的存在查询冲突,但相对于现有的解析方法,显然能够大大减少搜索 的空间,节省搜索的时间。

其次,与规则首字索引哈希类似的,本发明针对每个后接跳转数较多的状 态引入了状态跳转首字查询哈希,其哈希表的索引关键字是状态编号和首字, 指针数组的每个指针指向一个链表的头,每个链表中存储了所有首字相同(即 哈希值相同)的跳转的编号,索引值是所有首字匹配的跳转的编号序列。解析 的时候,根据输入字串的当前字符,在状态跳转首字查询哈希表中查找首字与 该当前字符匹配的跳转,大部分情况下可以直接返回匹配的跳转,而直接进入 下一状态,从而缩小了搜索的范围。

针对首字是连续编码或半连续(在编码区间上有短程的跳跃)编码的情况, 本发明又对上述状态跳转首字查询哈希表作了进一步的优化,利用字符的连续 编码,设计了一种特殊的哈希表。例如,阿拉伯数字0-9在字符集上是连续编 码的,如Unicode编码是从48到57,假设某个状态后接十个跳转,每个跳转代 表一个阿拉伯数字,从0到9,哈希键值的计算可以采用一种简单的算法,例如, 跳转字符3的键值就等于3的Unicode编码51减去最小Unicode编码48,等于 3,所以0-9对应的内部哈希键值就是0-9,将这些哈希键值存储在一个简单的 数组中,查询哈希表时,只要直接用哈希键值作为数组下标直接访问该数组元 素即可,如此,不仅减少了哈希键值的计算时间,还能因去掉了一般哈希结构 中存在的链表等冗余结构而节省存储的空间。

经过上述优化后,状态跳转的效率可以由0(N)(N为该状态所有可能的跳 转数目)减小到接近于0(1),系统只需要极少次数的跳转,甚至只需要一次跳 转,即可搜索到匹配的规则,从而极大地提高了解析的效率。

需要说明的是,上述对状态跳转首字查询哈希表的优化方法同样适用于规 则首字索引哈希表,即针对规则首字是连续或半连续编码的情况,规则首字索 引哈希表的哈希键值也可以使用上述或者类似的计算方法,并存储在一个简单 的数组中,以进一步提高对规则进行搜索匹配的速度。

最后,本发明还可以对局部的搜索结果进行重用。在实际的文法中,常会 有多个规则甚至同一规则内在源语言字串同一位置多次引用同一规则,从理论 上可以证明,对同一位置同一规则的解析结果是完全相同的,因此,本发明可 以对这种情况的解析结果进行重用,即如果已经在某一位置解析过该规则,今 后同样的解析将直接使用其结果,不必进入该规则做重复解析。为实现重用, 本发明又引入了以下三个表结构:

(1)完成令牌表。在网络图中,对与源语言字串匹配的路径的搜索是并行 展开的,每一条路径都有一个令牌(令牌可以比作是搜索路径的工兵,每个工 兵手里有一幅相同的扑克牌,其中每张扑克牌代表字符串中的一个字符,扑克 牌从上到下的顺序跟源字符串相同,假设每条路径也有一些扑克牌即代表输入 的字符串,工兵每尝试一条路径,就将手上最上面的扑克牌与该路径上的扑克 牌比较,如果匹配一张就放下一张,匹配多张就放下多张)。当某一令牌完成对 某一规则的搜索后,就把令牌号加入完成令牌表相应单元的链表里。如图3所 示,该完成令牌表中,规则编号为i1、起始位置为j1的单元,即单元(i1,j1), 存储了所有从j1起始位置开始并对i1规则完成搜索的令牌的编号链表。使用链 表是因为从源字符串同位置开始搜索同一条规则可能有多个结果路径(比如, 表示数字的规则可以接受各种位长的数字串),而令牌在搜索过程中对各条可能 路径都会产生新的令牌,所以结果可能是多个令牌号。

建立完成令牌表后,一个令牌在进入一条子规则的网络前,会首先去查询 完成令牌表,看是否有其他令牌已经完成对这条子规则的搜索,并且在源字符 串中有相同的起始位置(按照前述的比方,此处可以理解为,进入该规则前, 手上的扑克牌跟他是一样的),如果有这种情况,就使用相同的搜索结果,直接 跳到下一状态。

(2)进行状态表。完成令牌表的使用仅限于某一规则在某一起始位置第一 次被搜索完之后,可以对其结果重用。如果第一次搜索仍在进行中,而恰巧第 二个令牌也要从同一位置搜索该路径,由于第一次搜索尚未完成,所以不会反 映在完成令牌表中,为了对这种将要产生但尚未产生的结果进行重用,本发明 引入了进行状态表,如图4所示,规则编号为i2、起始位置为j2的单元,即单 元(i2,j2),为一个布尔标志,标志是否已存在从j2起始位置开始并正在对i2规则进行搜索的令牌,如果有,则标志为1,否则标志为0。

引入进行状态表后,每个令牌在开展搜索前会先查询进行状态表,如果发 现有其他令牌已经开展了同样的搜索,就在原地等待,直到其他令牌完成搜索; 如果没有同样的正在进行的搜索,再查完成令牌表里有没有同样的已完成的结 果,有则重用,都没有的话再开展搜索。这样结合进行状态表和完成令牌表这 两张表查询的结果是,同样的搜索只允许开展一次。

(3)等待令牌表。在进行状态表中提到过,令牌在搜索一个规则前,如果 发现有其他同样搜索正在进行,就进入等待状态,我们可以把处于等待状态的 令牌比作是在睡眠,睡眠的令牌是不懂得自己唤醒自己的,所以当其他令牌对 该规则完成搜索时,就要找到等待该搜索的令牌们,将他们一一唤醒,并让他 们重用自己的搜索结果进行下去。本发明即使用了等待令牌表,帮助已完成搜 索的令牌找到正在等待该搜索的令牌。如图5所示,该等待令牌表中,规则编 号为i3、起始位置为j3的单元,即单元(i3,j3),表示所有在j3起始位置等待 搜索i3规则的令牌号链表。

这样,通过以上三个表的结合使用,就实现了对局部搜索完全重用的目的, 从而避免了不必要的重复搜索匹配,减少了解析的时间。

综上所述,本发明的上下文无关文法的解析方法,在当前的上下文无关文 法的解析算法中引入了三种提高解析效率的方法,即规则首字索引哈希、状态 跳转首字查询哈希以及局部规则解析结果的重用,并可针对首字是连续或半连 续编码的情况再对上述两个哈希做进一步的优化,从而减少了解析需要消耗的 时间,大幅提高了解析的效率,并进而拓展了上下文无关文法的应用范围,使 上下文无关文法能更好地应用于实时或准实时的环境。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号