区别:'消除左递归'和'构建一个等效的明确语法'

时间:2016-05-28 13:36:23

标签: parsing recursion compiler-construction

例如:

R → R bar R|RR|R star|(R)|a|b

构造一个等效的无歧义语法:

R → S|RbarS S→T|ST
T → U|Tstar U→a|b|(R)

如何消除R → R bar R|RR|R star|(R)|a|b的左递归?

Eliminate left-recursionconstruct an equivalent unambiguous grammar之间的差异是什么?

1 个答案:

答案 0 :(得分:1)

一个明确的语法是对于语言中的每个字符串,只有一种方法可以从语法中导出它。在编译器构造的上下文中,模糊语法的问题是从语法中看不出给定输入字符串的解析树应该是什么。有些工具使用他们的规则解决歧义,而其他工具则只需要语法明确。

左递归语法是指给定非终端的派生可以在不首先生成终端的情况下再次产生相同的非终端的语法。这导致递归下降样式解析器中的无限循环,但对于shift-reduce解析器没有问题。

请注意,明确的语法仍然可以是左递归的,没有左递归的语法仍然可能是不明确的。另请注意,根据您的工具,您可能只需要消除歧义,但不能删除左递归,或者您可能需要删除左递归,但不要模糊(尽管通常更喜欢明确的语法)。

所以区别在于消除左递归和歧义可以解决不同的问题,并且在不同情况下是必要的。