为什么静态解析器生成器比动态解析器​​生成器更普遍?

时间:2018-04-12 06:37:45

标签: parsing dynamic static runtime parser-generator

解析器是一个接受输入字符串并吐出AST的东西。

解析器生成器是一种需要语法并吐出解析器的东西。

静态解析器生成器是一种语法,并为解析器吐出代码。

动态解析器生成器是在运行时

这让我大吃一惊,因为元编程通常比运行时替代方案更难。我理解为什么它更有效率,我明白为什么它不那么错误;我不明白的是它是如何成为常态的。

进入解析器世界令人沮丧。我无法理解为什么每个人都指着Yacc或Bison。我只是希望我的程序采用任意的EBNF,一个任意的输入字符串;并吐出AST。

"在某些标准"语法文件"中,每种语言都有明确定义的EBNF somewhere 。格式。我可以编写一个编辑器来支持任何语言!"

"好的,没有发生。什么是解析器组合器?它们看起来很酷,但没有简单的方法将EBNF转换为一个。"

"好的......所以我有EBNF 以某种方式,我怎么解析我的文字?什么?!生成一个完整的解析器?!"

我一直在考虑这个问题。以下是我提出的建议:

  • 电脑很慢。编译器是必要的。当时,写一些生成解析器的东西似乎比手工编写更安全。
  • 解析器很难推理,因此写一个动态生成的实际上比一个静态更难。
  • 有些人认为静态解析器生成器是他们要走的路,写了一个成功的实现,由于流行的用法现在已成为常态。

我可能错了,所以这个问题:

为什么静态解析器生成器比动态解析器​​生成器更普遍?

1 个答案:

答案 0 :(得分:1)

[挑剔:解析器解析;他们发现子结构,并告诉你的输入是你指定langauge的有效短语。他们(大多数)不会建立AST。您通常可以使用代码来增强您的解析器描述[请参阅Bison或许多其他人],这些代码通过在识别次要词语时发生的解析器回调来实现这一点。

真正的原因是对于任何特定工具,语法都不会非常快速地改变。您不需要动态解析器​​生成器。是的,早期的机器较小,无法提供空间或时间。

当前的工作站具有足够的容量,因此空间不再是问题。 现在问题是性能或工程上的不便。

性能方面,您可以使用动态解析器​​生成器来生成与静态解析器一样快的解析器,因此这不是问题。

问题是使用动态解析器​​生成器,我必须包含在我的应用程序中。除非它被设计成易于使用的插件,否则会很尴尬。更糟糕的是,我能得到/想要/好的那个可能与我的语言不匹配; Bison很容易插入java,因为它是C代码。因此,构建我的应用程序变得更加困难。

现在,如果某人构建了一个非常好的动态解析器​​生成器并将其放入您正在使用的语言库中,那么您可能会很高兴。 (查看其中一个的Perl's MARPA)。

但是,现在我们又回到了,您是否需要动态解析器​​生成?如果没有,静态的那些就好了,通常非常好。

如果你坚持使用你的应用程序,请派一个子任务来运行一个静态解析器生成器,并将其结果导入你的应用程序。 Voila,从静态解析器生成器生成动态解析器​​。

你不会找到很多人。

[我亲自为几十种语言构建了解析器。总是设法使用静态解析器生成器方案成功]。

[现在,我对解析器生成器的不满是他们通常不会构建AST,并且这比定义语法更难实现。 如果你制定了正确的规则,你可以让他们这样做;我使用的解析器生成器会自动执行此操作(请参阅bio),这对于大型语法来说是一个巨大的胜利]。