《上下文无关文法的解析方法.pdf》由会员分享,可在线阅读,更多相关《上下文无关文法的解析方法.pdf(10页珍藏版)》请在专利查询网上搜索。
1、10申请公布号CN102339228A43申请公布日20120201CN102339228ACN102339228A21申请号201010233639622申请日20100722G06F9/45200601G06F17/2720060171申请人盛乐信息技术上海有限公司地址201203上海市浦东新区张江高科技园区郭守敬路356号72发明人翟鲁峰燕鹏举74专利代理机构上海浦一知识产权代理有限公司31211代理人刘昌荣54发明名称上下文无关文法的解析方法57摘要本发明公开了一种上下文无关文法的解析方法,在现有的上下文无关文法的解析算法中,引入了三种方法,即规则首字索引哈希;状态跳转首字查询哈希;以。
2、及对同一位置同一规则的解析结果进行重用,这三种方法可以任意组合的形式应用于解析过程。该解析方法可以减少上下文无关文法的解析时间,提高解析的效率。通过规则首字索引哈希以及对局部解析结果进行重用,避免了对所有嵌套子规则的搜索,减少了搜索空间;同时,通过状态跳转首字查询哈希,使系统只需要极少次数的跳转,甚至只需一次跳转,即可搜索到匹配的规则,从而极大地提高了解析的效率。51INTCL19中华人民共和国国家知识产权局12发明专利申请权利要求书1页说明书5页附图3页CN102339241A1/1页21一种上下文无关文法的解析方法,其特征在于,在对上下文无关文法进行解析的过程中,引入了以下三种方法1规则首。
3、字索引哈希;2对后接跳转数多的状态,使用状态跳转首字查询哈希;3对同一位置同一规则的解析结果进行重用;上述三种方法以任意组合的形式应用于解析过程,即同时使用上述三种方法,或者使用其中的任意两种,或者仅使用其中的任意一种。2如权利要求1所述的解析方法,其特征在于,所述规则首字索引哈希,包括下列步骤A以规则编号和规则首字为索引关键字,通过哈希函数计算哈希值,并构造出规则首字索引哈希表;B对每条规则进行解析前,查找该规则首字索引哈希表,判断输入字串的当前字符是否在该规则首字索引哈希表中,如果存在,则对该规则进行解析,如果不存在,则不对该规则进行解析。3如权利要求1所述的解析方法,其特征在于,所述状态。
4、跳转首字查询哈希,包括下列步骤A以状态编号和跳转首字为索引关键字,通过哈希函数计算哈希值,并构造出状态跳转首字查询哈希表;B解析时,查找该状态跳转首字查询哈希表,并将该状态跳转首字查询哈希表中所有首字与输入字串的当前字符匹配的跳转的编号反馈给系统。4如权利要求2或3所述的解析方法,其特征在于所述哈希函数采用TIME33算法。5如权利要求2或3所述的解析方法,其特征在于所述哈希表采用拉链法哈希结构,主要包括一个数组,该数组各单元的下标对应于每个哈希值。6如权利要求2或3所述的解析方法,其特征在于所述首字为连续编码字符或者半连续编码字符时,所述哈希表的哈希键值通过该首字的编码与连续或半连续编码字符。
5、的最小编码之间的差值计算得出,并存储在一个数组中。7如权利要求1所述的解析方法,其特征在于所述对同一位置同一规则的解析结果的重用,通过结合使用完成令牌表、进行状态表以及等待令牌表来实现,即令牌在开展搜索前,首先查询进行状态表,判断是否有其他令牌正在进行同样的搜索,如果有,就在原地等待,由其他令牌完成搜索后,通过等待令牌表查找到该令牌,让该令牌重用其搜索结果;如果没有,则再继续查找完成令牌表,判断是否有其他令牌已经完成了同样的搜索,并且在源字符串中有相同的起始位置,如果有,则重用搜索结果,如果没有,则开展搜索。8如权利要求7所述的解析方法,其特征在于所述完成令牌表的各单元中分别存储了所有已完成相。
6、应搜索的令牌的编号链表。9如权利要求7所述的解析方法,其特征在于所述进行状态表的各单元中分别存储了一个布尔标志,该标志为1,表示已有令牌正在进行相应的搜索,该标志为0,表示没有令牌正在进行相应的搜索。10如权利要求7所述的解析方法,其特征在于所述等待令牌表的各单元中分别存储了所有等待相应搜索的令牌的编号链表。权利要求书CN102339228ACN102339241A1/5页3上下文无关文法的解析方法技术领域0001本发明涉及一种上下文无关文法的解析方法。背景技术0002上下文无关文法CONTENTFREEGRAMMAR,CFG是一种形式文法,其定义为对某文法GS,如果文法规则集P中的每一条规则。
7、的形式为A,AVN,VNVT,则该文法G为上下文无关文法。按照上下文无关文法的定义,在推导中应用规则A时,无需考虑非终结符号A所在的上下文,总能把A替换为符号串,因此,上下文无关文法具有足够强的表达力,能被用来定义大多数计算机程序设计语言C,XML等,并在自然语言处理领域被广泛地用来描述自然语言的语法和语义。0003上下文无关文法虽然相比于另一种形式文法正则语言,具有更广泛的描述能力,但是它在实时或准实时需求环境下的应用,如机器翻译,网页显示,脚本语言解释执行等,却因其效率低下而受到限制。统观目前上下文无关文法解释器系统的工作流程,基本可以划分为三个步骤文法编译、解析源语言、翻译成目标语言,如。
8、图1所示0004首先,解释器根据针对某一特定应用定义并存储在文本文件中的上下文无关文法的规则集,将用符号表述的上下文无关文法转换为网络图,并保存在二进制文件中。这里,网络图是一个有向图,每一个网络图对应一个文法规则,网络图中的每一个点代表一个状态相当于一个叉路口,连接着各种可能的跳转,每一个箭头代表一个所引用的子规则每条规则可以引用自己和其他规则,被引用的规则被称为子规则或一个终结串,还可以承载该子规则或终结串所对应的翻译规则。为便于理解,下面以一个简单的算术文法为例来详细说明,该算术文法的定义为0005ST/加S0006|T/减去S0007|T0008TT/乘以T0009|T/除以T0010。
9、|/括号S/括起来0011|X/X0012|Y/Y0013|Z/Z0014其中,S和T各是一条规则,左边是规则,右边是该规则的定义,每一行是一个顺序逻辑,|表示逻辑“或”,、/、X、Y、Z每个都是终结字串,而它们对应的翻译字串分别为加、减去、乘以、除以、X、Y、Z。根据该算术文法的规则集,对该算术文法进行编译后,产生的网络图如图2所示,其中,规则S可以有3个定义,每个定义用网络图中的一条路径表示,因此,规则S的网络图有3条路径;规则T可以有6个定义,因此,其网络图有6条路径。图2中,带编号如S1,S2,S14的圆圈表示状态,每个状态可比作一个路口,有时候为说明书CN102339228ACN10。
10、2339241A2/5页4了引用子规则没有分叉也可以有路口,单向箭头表示跳转,每个跳转就像一条单行道,跳转如果引用子规则,则在箭头上加注子规则名字,如果表示终结字串,则加注终结字串和它的翻译字串,如X/X。0015编译后,就要在实时的应用中,对源语言文件按照文法规则进行解析,即在文法编译后所产生的网络图中搜索跟源语言字串用源语言表达的某个字符串,如C语言源文件中的一条语句匹配的路径,并生成用于结果路径的树结构,即解析树,解析树是仅存在于内存中的数据结构,解析树上的每一个叶子节点代表一对终结字串和它的翻译字串,解析树的顶层和中间节点则代表规则,父节点的规则引用子节点的规则或终结字符串,子节点从左。
11、到右按引用顺序排列。0016最后,先序遍历PREORDERTRAVERSAL解析树,并按照翻译规则可包含在源语言的文法规则中,把解析树叶子节点的翻译字串串起来生成用目标语言表达的相应字符串,例如,将用C语言表达的字串翻译成用汇编语言表达的字串,目标语言字串与源语言字串表达相同的语义。0017上述系统流程中,解析过程由于要对所有可能的文法规则及嵌套子规则进行搜索匹配,搜索空间较大,因此需要花费的时间较长,尤其是对一个由成千上万条规则组成的复杂文法,花费的时间就更长了;同时,目前的文法解析,对每个状态都要遍历和匹配其后接的所有可能跳转,对于后接跳转数多的情况,例如自然语言中的数词后可接上千个可能的。
12、量词,时间上的开销就比较可观了。而文法编译一般是在线下预先完成的,翻译由于不涉及路径搜索,相对于解析来说,翻译的时间可以忽略不计,因此,解析效率是制约上述CFG解释器运行效率的关键因素,要提高上下文无关文法的效率,就必须减少用于解析的时间。发明内容0018本发明要解决的技术问题是提供一种上下文无关文法的解析方法,它可以减少解析需要花费的时间,提高上下文无关文法的解析效率。0019为解决上述技术问题,本发明的上下文无关文法的解析方法,在对上下文无关文法进行解析的过程中,引入了以下三种方法00201规则首字索引哈希;00212对后接跳转数多的状态,使用状态跳转首字查询哈希;00223对同一位置同一。
13、规则的解析结果进行重用;0023上述三种方法可以任意组合的形式应用于解析过程,即可以同时使用上述三种方法,或者使用其中的任意两种,或者仅使用其中的任意一种。0024所述规则首字索引哈希,包括下列步骤0025A以规则编号和规则首字为索引关键字,通过哈希函数计算哈希值,并构造出规则首字索引哈希表;0026B对每条规则进行解析前,查找该规则首字索引哈希表,判断输入字串的当前字符是否在该规则首字索引哈希表中,如果存在,则对该规则进行解析,如果不存在,则不对该规则进行解析。0027所述状态跳转首字查询哈希,包括下列步骤0028A以状态编号和跳转首字为索引关键字,通过哈希函数计算哈希值,并构造出状说明书C。
14、N102339228ACN102339241A3/5页5态跳转首字查询哈希表;0029B解析时,查找该状态跳转首字查询哈希表,并将该状态跳转首字查询哈希表中所有首字与输入字串的当前字符匹配的跳转的编号反馈给系统。0030所述对同一位置同一规则的解析结果的重用,通过结合使用完成令牌表、进行状态表以及等待令牌表来实现,具体步骤是令牌在开展搜索前,首先查询进行状态表,判断是否有其他令牌正在进行同样的搜索,如果有,就在原地等待,由其他令牌完成搜索后,通过等待令牌表查找到该令牌,让该令牌重用其搜索结果;如果没有,则再继续查找完成令牌表,判断是否有其他令牌已经完成了同样的搜索,并且在源字符串中有相同的起始。
15、位置,如果有,则重用搜索结果,如果没有,则开展搜索。0031与现有的解析方法相比,本发明的上下文无关文法的解析方法,通过规则首字索引哈希以及对局部的规则解析结果进行重用,避免了对所有嵌套子规则的搜索,大大减少了搜索空间,节省了解析时间;而通过状态跳转首字查询哈希,并针对连续编码字符所作的对哈希表的进一步优化,使系统只需要极少次数的跳转,甚至只需要一次跳转,即可搜索到匹配的规则,因此,极大地提高了解析的效率。附图说明0032下面结合附图与具体实施方式对本发明作进一步详细的说明0033图1是现有的上下文无关文法解释器的系统流程图;0034图2是现有的上下文无关文法解释器系统在文法编译后产生的网络图。
16、的示例图;0035图3是本发明的完成令牌表;0036图4是本发明的进行状态表;0037图5是本发明的等待令牌表。具体实施方式0038为对本发明的技术内容、特点与功效有更具体的了解,现结合图示的实施方式,详述如下0039本发明的上下文无关文法的解析方法,在当前的上下文无关文法的解析算法中引入了三种提高解析效率的方法,即规则首字索引哈希、状态跳转首字查询哈希和规则解析结果的重用,这三种方法可以同时使用,以最大限度地提高解析的效率,也可以只使用其中的任意一种,或者是使用其中的任意两种。以下是对这三种方法的详细说明。0040首先,本发明在当前的上下文无关文法的解析算法中引入了规则首字索引哈希。由于最终。
17、能与输入的一条源语言字串相匹配的文法规则只有一条,绝大多数的规则匹配都是无效的,因此,为减少搜索空间,本发明对每一条规则建立了一个规则首字索引哈希表,以用于快速索引。哈希表的实现方法有多种,本发明在实施时可采用最常用的拉链法哈希结构,即以规则编号和首字作为规则首字索引哈希表的索引关键字KEY,以这两个索引关键字为自变量计算哈希函数可采用传统的TIME33算法的值,即哈希值VALUE,并以哈希值作为一个数组各单元的下标,索引值是一个布尔值,表示是否存在。在对每条规则进行解析前,首先根据该规则编号和输入字串的当前字符计算出哈希值,然后查找规则首字索引哈希表,判断是否有与之对应的数组下标,即判断输入。
18、字串的当前字符是否在哈希表中,说明书CN102339228ACN102339241A4/5页6如果存在,则对该规则进行剖析,如果不存在,则放弃这一可能路径,不进入该规则的解析。引入规则首字索引哈希表后,解析时就只需要对首字与输入字串的当前字符相同的规则进行解析,不需要再对所有的规则及子规则和孙子规则等等进行嵌套搜索匹配,虽然采用哈希查询会不可避免的存在查询冲突,但相对于现有的解析方法,显然能够大大减少搜索的空间,节省搜索的时间。0041其次,与规则首字索引哈希类似的,本发明针对每个后接跳转数较多的状态引入了状态跳转首字查询哈希,其哈希表的索引关键字是状态编号和首字,指针数组的每个指针指向一个链。
19、表的头,每个链表中存储了所有首字相同即哈希值相同的跳转的编号,索引值是所有首字匹配的跳转的编号序列。解析的时候,根据输入字串的当前字符,在状态跳转首字查询哈希表中查找首字与该当前字符匹配的跳转,大部分情况下可以直接返回匹配的跳转,而直接进入下一状态,从而缩小了搜索的范围。0042针对首字是连续编码或半连续在编码区间上有短程的跳跃编码的情况,本发明又对上述状态跳转首字查询哈希表作了进一步的优化,利用字符的连续编码,设计了一种特殊的哈希表。例如,阿拉伯数字09在字符集上是连续编码的,如UNICODE编码是从48到57,假设某个状态后接十个跳转,每个跳转代表一个阿拉伯数字,从0到9,哈希键值的计算可。
20、以采用一种简单的算法,例如,跳转字符3的键值就等于3的UNICODE编码51减去最小UNICODE编码48,等于3,所以09对应的内部哈希键值就是09,将这些哈希键值存储在一个简单的数组中,查询哈希表时,只要直接用哈希键值作为数组下标直接访问该数组元素即可,如此,不仅减少了哈希键值的计算时间,还能因去掉了一般哈希结构中存在的链表等冗余结构而节省存储的空间。0043经过上述优化后,状态跳转的效率可以由0NN为该状态所有可能的跳转数目减小到接近于01,系统只需要极少次数的跳转,甚至只需要一次跳转,即可搜索到匹配的规则,从而极大地提高了解析的效率。0044需要说明的是,上述对状态跳转首字查询哈希表的。
21、优化方法同样适用于规则首字索引哈希表,即针对规则首字是连续或半连续编码的情况,规则首字索引哈希表的哈希键值也可以使用上述或者类似的计算方法,并存储在一个简单的数组中,以进一步提高对规则进行搜索匹配的速度。0045最后,本发明还可以对局部的搜索结果进行重用。在实际的文法中,常会有多个规则甚至同一规则内在源语言字串同一位置多次引用同一规则,从理论上可以证明,对同一位置同一规则的解析结果是完全相同的,因此,本发明可以对这种情况的解析结果进行重用,即如果已经在某一位置解析过该规则,今后同样的解析将直接使用其结果,不必进入该规则做重复解析。为实现重用,本发明又引入了以下三个表结构00461完成令牌表。在。
22、网络图中,对与源语言字串匹配的路径的搜索是并行展开的,每一条路径都有一个令牌令牌可以比作是搜索路径的工兵,每个工兵手里有一幅相同的扑克牌,其中每张扑克牌代表字符串中的一个字符,扑克牌从上到下的顺序跟源字符串相同,假设每条路径也有一些扑克牌即代表输入的字符串,工兵每尝试一条路径,就将手上最上面的扑克牌与该路径上的扑克牌比较,如果匹配一张就放下一张,匹配多张就放下多张。当某一令牌完成对某一规则的搜索后,就把令牌号加入完成令牌表相应单元的链表里。如图3所示,该完成令牌表中,规则编号为I1、起始位置为J1的单元,即单元I1,J1,说明书CN102339228ACN102339241A5/5页7存储了所。
23、有从J1起始位置开始并对I1规则完成搜索的令牌的编号链表。使用链表是因为从源字符串同位置开始搜索同一条规则可能有多个结果路径比如,表示数字的规则可以接受各种位长的数字串,而令牌在搜索过程中对各条可能路径都会产生新的令牌,所以结果可能是多个令牌号。0047建立完成令牌表后,一个令牌在进入一条子规则的网络前,会首先去查询完成令牌表,看是否有其他令牌已经完成对这条子规则的搜索,并且在源字符串中有相同的起始位置按照前述的比方,此处可以理解为,进入该规则前,手上的扑克牌跟他是一样的,如果有这种情况,就使用相同的搜索结果,直接跳到下一状态。00482进行状态表。完成令牌表的使用仅限于某一规则在某一起始位置。
24、第一次被搜索完之后,可以对其结果重用。如果第一次搜索仍在进行中,而恰巧第二个令牌也要从同一位置搜索该路径,由于第一次搜索尚未完成,所以不会反映在完成令牌表中,为了对这种将要产生但尚未产生的结果进行重用,本发明引入了进行状态表,如图4所示,规则编号为I2、起始位置为J2的单元,即单元I2,J2,为一个布尔标志,标志是否已存在从J2起始位置开始并正在对I2规则进行搜索的令牌,如果有,则标志为1,否则标志为0。0049引入进行状态表后,每个令牌在开展搜索前会先查询进行状态表,如果发现有其他令牌已经开展了同样的搜索,就在原地等待,直到其他令牌完成搜索;如果没有同样的正在进行的搜索,再查完成令牌表里有没。
25、有同样的已完成的结果,有则重用,都没有的话再开展搜索。这样结合进行状态表和完成令牌表这两张表查询的结果是,同样的搜索只允许开展一次。00503等待令牌表。在进行状态表中提到过,令牌在搜索一个规则前,如果发现有其他同样搜索正在进行,就进入等待状态,我们可以把处于等待状态的令牌比作是在睡眠,睡眠的令牌是不懂得自己唤醒自己的,所以当其他令牌对该规则完成搜索时,就要找到等待该搜索的令牌们,将他们一一唤醒,并让他们重用自己的搜索结果进行下去。本发明即使用了等待令牌表,帮助已完成搜索的令牌找到正在等待该搜索的令牌。如图5所示,该等待令牌表中,规则编号为I3、起始位置为J3的单元,即单元I3,J3,表示所有。
26、在J3起始位置等待搜索I3规则的令牌号链表。0051这样,通过以上三个表的结合使用,就实现了对局部搜索完全重用的目的,从而避免了不必要的重复搜索匹配,减少了解析的时间。0052综上所述,本发明的上下文无关文法的解析方法,在当前的上下文无关文法的解析算法中引入了三种提高解析效率的方法,即规则首字索引哈希、状态跳转首字查询哈希以及局部规则解析结果的重用,并可针对首字是连续或半连续编码的情况再对上述两个哈希做进一步的优化,从而减少了解析需要消耗的时间,大幅提高了解析的效率,并进而拓展了上下文无关文法的应用范围,使上下文无关文法能更好地应用于实时或准实时的环境。说明书CN102339228ACN102339241A1/3页8图1说明书附图CN102339228ACN102339241A2/3页9图2图3说明书附图CN102339228ACN102339241A3/3页10图4图5说明书附图CN102339228A。