如何解决这个左递归问题?我花了很长时间才找到解决方案,但我很努力。一句话:鲍勃给出了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)
答案 0 :(得分:0)
通过不编写递归规则来解决问题。如果你甚至无法提出你需要的句子,你就不需要它了。
递归规则在CFG中是合法的;这就是他们如何产生无限数量的句子。使用左递归语法,递归下降解析器将永远运行一些输入。这就是它的作用,这就是为什么有更智能的解析算法。
答案 1 :(得分:0)
NP -> NP
确实是左递归规则。然而,它也是一个毫无意义的规则,因为它不会改变语法生成的语言,只会使语法模糊不清。
因此,如果您认为在语法中添加NP -> NP
将允许您解析“Bob给Max car”,那么它就不会。这与解析器无关,只是该句子不在语法生成的语言中。
尝试绘制您希望获得该句子的解析树。你会发现没有一个符合那个语法。但是如果你发现一个不符合符合语法的那个,那就应该告诉你如何改变语法来处理这样的句子。 (注意,可能有各种这样的树,反映了可以生成该句子的各种不同的语法。你的工作然后将选择你的解析器可以处理的一个。)