【发布时间】:2011-05-04 16:19:57
【问题描述】:
我正在寻找具有语法/代码分离的上下文无关语法解析器生成器,并且可以添加对新目标语言的支持。例如,如果我想要 Pascal 中的解析器,我可以编写自己的 pascal 代码生成器,而无需重新实现整个东西。
我知道大多数开源解析器生成器理论上都可以扩展,但我仍然更喜欢计划和记录可扩展性的东西。
在功能方面,我需要解析器至少支持 Python 风格的缩进,也许还需要做一些额外的工作。对生成的解析器类型没有要求,但我更喜欢快速的。
哪些是最知名/维护最多的选项?
流行的解析器生成器似乎主要使用我真的不喜欢的混合语法/代码方法。 Comparison list on Wikipedia 列出了一些,但我是这方面的新手,不知道该尝试哪个。
为什么我不喜欢混合语法/代码:因为这种方法看起来一团糟。语法就是语法,实现细节就是实现细节。它们是用不同语言编写的不同内容,将它们放在不同的地方很直观。
如果我想在另一个项目中使用不同的实现细节重用部分语法怎么办?如果我想用不同的语言编译解析器怎么办?所有这些都需要将语法分开。
【问题讨论】:
-
你为什么不喜欢混合语法/代码?例如,您是否要构建一个具体语法树,然后将其单独转换为抽象语法树?
-
我从来不理解反对混合解析器规则和语义操作的反对意见。创建解析树然后遍历它要慢得多,并且不允许语法灵活性(例如,最简单的情况:仅在满足给定谓词或 lambda 时才匹配一个数字)。我也认为创建一个单独的解析器没有用,它以多种语言输出。您总是只需要一个,也是最高效的一个。
-
@Gene Bushuyev:我会满足于调用虚函数并让我在解析器后代中完成这项工作。这几乎与混合解析/实现一样有效,但更清晰,嗯,合乎逻辑。规则以及它们的具体实施方式是不同的,不是吗?
-
对于许多语言,我只需要一种我需要为其制作解析器的语言。如果您不是 C++ 或 Java,那么您的选择会突然变得非常有限。无论您的语言有多不幸,您基本上都会被任何一两个可用于您的语言的解析器所困扰。这就是为什么我想要一些可扩展的东西。我可以自己写一个后端。
-
不,我不同意这些说法。使用虚函数的解析器通常很慢,因为许多语法规则很短并且经常检查。我什至不会去那里。其次,我从未见过以不同语义重用相同语法的解析器。即使在极少数情况下可行,它也非常低效,实际上会导致复杂且容易出错的代码。向语法规则添加语义操作使代码更清晰、更易于理解、更易于调试,并具有最佳性能。而且我已经用两种方式做了很多解析器。
标签: parser-generator