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

Parsing 使用从右到左的解析器绕过左递归,parsing,recursion,Parsing,Recursion,我正在为我的OOP课程做一个项目。任务的一部分是为一个非常简单的语法开发一个解析器。据我所知,到目前为止,手工实现的最简单的解析器是递归下降解析器 但是,我正在解析的语言的所有运算符本质上都是关联的。据我所知,处理由左关联性强制执行的左递归的最佳方法是使用LR解析器 我的想法是从右向左解析标记,我相信这将使我能够将左关联规则重写为右关联规则 这行得通吗?如果不行,为什么不行?如果你愿意,你可以这样做,尽管这不一定能解决你所有的问题。如果您熟悉LL或LR解析器,那么有一些从右到左工作的对应版本称为

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

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

我的想法是从右向左解析标记,我相信这将使我能够将左关联规则重写为右关联规则


这行得通吗?如果不行,为什么不行?

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

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

很好的洞察力——事实证明,这对于解决左递归问题非常有效,但是您还必须自底向上解析,而不仅仅是从右向左解析。我出版了一本关于这个的预印本

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


到目前为止,最容易编写的解析器是只指定(上下文无关)语法的解析器,解析器生成器工具处理所有问题。我对GLR解析器有非常好的经验。(基于Earley的解析器也很好,但由于速度问题,通常不适合生产)。我同意。虽然我对这个项目的解析器生成器(YACC/Bison)有一些经验,但我更喜欢使用手工编写的解析器。首先,我甚至不认为我被允许使用外部库,而使用Bison或类似的东西可能需要这样做。第二,我想学习更多关于解析和编译器设计的知识,所以我想借此机会学习,特别是因为我需要解析的语法非常简单,所以这是学习新知识的绝佳机会。无论如何,我相信在这个上下文中递归下降解析器是最简单的解决方案。然后查看我关于如何编写递归下降解析器的SO答案。这些函数很容易处理左递归。若我并没有弄错的话,我尝试编写的递归下降解析器和RR解析器是等价的。因此,考虑到我的语法中没有正确的关联表达式,没有陷入无限递归的危险。请详细说明一下,我想知道我的观点是否有偏差。另外,感谢您提出的其他解决方案,我一定会研究您提到的算法和技术。在没有看到您的语法的情况下,我无法评论从右到左解析器是否有效。但是,如果您的语法没有正确的递归,并且同一个非终结符的两个结果没有共同的后缀,那么您的策略可能会起作用。我主要是警告不要认为RR解析器可以处理LL解析器不能处理的任何事情。