使用从右到左的解析器绕过左递归

时间:2015-12-19 20:07:11

标签: parsing recursion

我正在为我的OOP课程开展项目。部分任务是为非常简单的语法开发解析器。据我所知,到目前为止,手工实现的最简单的解析器是递归下降解析器。

然而,我解析的语言的所有运算符本质上都是左关联的。据我所知,处理左关联性强制执行的左递归的最佳方法是使用LR解析器。

我的想法是从右到左解析令牌,我认为应该让我能够将左关联规则重写为正确的关联规则。

这是否有效,如果没有,为什么不呢?

2 个答案:

答案 0 :(得分:2)

如果您愿意,可以这样做,但这不一定能解决您的所有问题。如果您熟悉LL或LR解析器,则有从右到左工作的相应版本称为RR和RL解析器,它们的工作方式类似于LL或LR解析器在相反方向上扫描。因此,它们与原始LL或LR解析算法具有相似的弱点,因此虽然这可能对您有所帮助,但它实际上可能无法解决任何问题。

作为替代方案,您可以尝试重写语法,以查看是否可以直接编码优先级和关联性。根据语法,您还可以考虑使用优先解析算法,如Dijkstra的分流码算法。您还可以考虑使用带有回溯的递归下降解析器。最后,您可以使用类似Earley解析器的东西,它可以处理任何语法,并且编码起来也不会太难。

答案 1 :(得分:1)

洞察力很好-事实证明,这对于解决左递归问题确实非常有效,但是您还必须解析自下而上的方法,而不仅仅是从右到左。我为此发表了预印本。

Pika解析:反向解析解决了左递归和错误恢复问题

https://arxiv.org/abs/2005.06444