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

Python 如何在cfg解析器中解决左递归?,python,python-3.x,nltk,context-free-grammar,left-recursion,Python,Python 3.x,Nltk,Context Free Grammar,Left Recursion,如何解决这个左递归?我用了很长时间来寻找解决方案,但我仍在努力。鲍勃给了马克斯汽车。我想在这里展示的要点是发生的左递归。哪一个是NP->NP,我如何解决这个问题?如果我现在在python3中运行此代码,它将崩溃 import nltk.grammar grammar = nltk.CFG.fromstring(""" S -> NP VP VP -> V NP NP -> "cars" | "Bob" | NP | "Max" V -> "gives" """)

如何解决这个左递归?我用了很长时间来寻找解决方案,但我仍在努力。鲍勃给了马克斯汽车。我想在这里展示的要点是发生的左递归。哪一个是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)

通过不编写递归规则来解决问题。如果你甚至不能想出一个你需要的句子,你就不需要了


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

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

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


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

您今天早些时候问了同样的问题。使用代码会更好,但为什么要删除代码并重新发布,而不是编辑现有的问题?这严重违反了现场规则。以后不要这样做。我认为你需要重新阅读你正在使用的任何教科书,了解
的含义。正如你所说,“Bob give Max car”不是一个符合语法的英语句子。然而,“鲍勃给马克斯汽车”是可以的。使用一个语法句子会使你的问题更加清晰。@aom97:在这个图表中,最右边的NP似乎是凭空出现的。事实上,其母公司应该是副总裁;它是动词的宾语。(Max是间接宾语。)但不清楚你是在问英语语法还是如何使用NLTK。如果你问的是英语语法,这可能不是正确的论坛。在解析树中,最右边的NP(在“car”上方)似乎是下一个最右边的NP(在“Max”上方)的子级。理解解析树中的任何给定节点最多只能使用语法中的一个结果是很重要的。因此,右边的第二个NP可以有一行到“Max”(使用production
NP->Max
),也可以有一行到另一个“NP”(使用production
NP->NP
),但不能同时有两个(除非您更改语法)。