为什么右递归解析器不能无限循环?

时间:2016-05-27 07:27:27

标签: parsing compiler-construction left-recursion

左递归将使解析器进入无限循环。那么为什么右递归也不会发生同样的情况呢?

1 个答案:

答案 0 :(得分:3)

在递归下降解析器中,通过尝试在当前位置解析B来实现像A -> B C | D这样的语法规则,然后,如果成功,则尝试在B结束的位置解析C.如果失败,我们尝试在当前位置解析D。

如果C等于A(右递归),那没关系。这只是意味着如果B成功,我们尝试在B之后的位置解析A,这意味着我们尝试先在那里解析B然后再尝试A在新位置或尝试D.这将继续直到最后B失败我们尝试D。

但是,如果B等于A(左递归),则这是一个非常大的问题。因为现在要解析A,我们首先尝试在当前位置解析A,它试图在当前位置解析A ...无限广告。我们永远不会提升我们的位置,也不会尝试除A之外的任何事情(只是不断尝试),所以我们永远不会达到可以终止的程度。

¹假设完全回溯。否则如果B和/或C消耗了任何令牌(或者比我们预测的更多的令牌),A可能会在没有尝试D的情况下失败,但这对于这个讨论都不重要。