如何在cfg解析器中解决左递归?

时间:2017-04-30 14:10:12

标签: python python-3.x nltk context-free-grammar left-recursion

如何解决这个左递归问题?我花了很长时间才找到解决方案,但我很努力。一句话:鲍勃给出了Max汽车。我想在这里展示的主要观点是发生的左递归。哪个是NP - > NP,我该如何解决这个问题?如果我现在在python3中运行此代码,它将崩溃。

import nltk.grammar

grammar = nltk.CFG.fromstring(""" 
S -> NP VP
VP -> V NP 
NP -> "cars" | "Bob" | NP | "Max" 
V -> "gives"
""") 

sent = "Bob gives Max cars".split() 
rd_parser = nltk.RecursiveDescentParser(grammar)
for tree in rd_parser.parse(sent):
    print(tree)

2 个答案:

答案 0 :(得分:0)

通过不编写递归规则来解决问题。如果你甚至无法提出你需要的句子,你就不需要它了。

递归规则在CFG中是合法的;这就是他们如何产生无限数量的句子。使用左递归语法,递归下降解析器永远运行一些输入。这就是它的作用,这就是为什么有更智能的解析算法。

答案 1 :(得分:0)

NP -> NP确实是左递归规则。然而,它也是一个毫无意义的规则,因为它不会改变语法生成的语言,只会使语法模糊不清。

因此,如果您认为在语法中添加NP -> NP将允许您解析“Bob给Max car”,那么它就不会。这与解析器无关,只是该句子不在语法生成的语言中。

尝试绘制您希望获得该句子的解析树。你会发现没有一个符合那个语法。但是如果你发现一个不符合符合语法的那个,那就应该告诉你如何改变语法来处理这样的句子。 (注意,可能有各种这样的树,反映了可以生成该句子的各种不同的语法。你的工作然后将选择你的解析器可以处理的一个。)