Parsing 为什么静态解析器生成器比动态解析器生成器更流行?

Parsing 为什么静态解析器生成器比动态解析器生成器更流行?,parsing,dynamic,static,runtime,parser-generator,Parsing,Dynamic,Static,Runtime,Parser Generator,解析器是一种获取输入字符串并输出AST的东西 解析器生成器是一种获取语法并输出解析器的东西 静态解析器生成器是一种获取语法并为解析器输出代码的工具 动态解析器生成器是在运行时获取语法并在运行时输出解析器的东西 这让我大吃一惊,因为元编程通常比运行时更难。我理解为什么它更有效,我理解为什么它不那么错误;我不明白的是它是如何成为常态的 进入解析器的世界是令人沮丧的。我不明白为什么每个人都指向亚克或野牛。我只是想让我的程序接受一个任意的EBNF,一个任意的输入字符串;然后吐出AST 每种语言都有一个

解析器是一种获取输入字符串并输出AST的东西

解析器生成器是一种获取语法并输出解析器的东西

静态解析器生成器是一种获取语法并为解析器输出代码的工具

动态解析器生成器是在运行时获取语法并在运行时输出解析器的东西


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

进入解析器的世界是令人沮丧的。我不明白为什么每个人都指向亚克或野牛。我只是想让我的程序接受一个任意的EBNF,一个任意的输入字符串;然后吐出AST

每种语言都有一个定义良好的EBNF,在某些地方可以使用标准的“语法文件”格式。我可以编写一个编辑器来支持任何语言

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

“好吧……我有EBNF,我到底怎么解析我的文本?什么?!生成一个完整的解析器?!”


我一直在想这个。以下是我的想法:

  • 电脑速度很慢。编译器是必要的。当时,编写生成解析器的东西似乎比手工编写更明智
  • 解析器很难推理,以至于编写一个动态生成的解析器实际上比静态生成的解析器更难
  • 一些人认为静态解析器生成器是他们的发展方向,他们编写了一个成功的实现,由于流行使用,它现在已成为规范
我可能错了,所以这个问题:

为什么静态解析器生成器比动态解析器生成器更流行?

[挑剔:解析器解析;他们发现子结构并告诉您的输入是您指定的有效短语。他们(大部分)不构建AST。您可以经常增强解析器描述[参见Bison或其他许多人]通过识别子短语时发生的解析器回调执行此操作的代码]

真正的原因是,对于任何特定的工具,语法变化都不是很快。您不需要动态解析器生成器。是的,早期的机器比较小,在空间和时间上都买不起

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

就性能而言,您可能可以使用动态解析器生成器生成与静态解析器运行速度一样快的解析器,因此这并不是真正的问题

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

现在,如果有人构建了一个非常好的动态解析器生成器,并将其放入您正在使用的语言库中,那么您就可以开始了。(请查看其中一个)

但是,现在我们回到,您需要动态解析器生成吗?如果不是的话,静态的就可以了,而且通常都非常好

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

你找不到太多的接受者

[我个人为几十种语言构建了解析器。静态解析器生成器方案始终成功]

[现在,我对解析器生成器感到恼火的是,它们通常不构建AST,这总是比定义语法更难实现。
如果你制定了正确的规则,你可以让他们这样做;我使用的解析器生成器会自动做到这一点(请参见bio),这是大语法的一大胜利]。

在我的场景中,分出子任务是不可能的(在iOS上解析代码);但是谢谢你这么详细的回答!这里说iOS是OSX的衍生产品。确定不能运行子任务吗?苹果限制使用
fork()
。确定不能运行子任务吗?我不能相信fork是如此受限,以至于它不能派生一个纯粹的计算子任务。如果是的话,我真不敢相信IOS有多死气沉沉。因此,您的限制不是解析技术,而是您坚持使用的操作系统。你可以通过将YACC的源代码或任何东西导入到你的应用程序中来解决这个问题,这样你就可以将它作为子例程而不是子进程来调用,但这似乎是一个相当高的代价。哦,相信我,我和你一样感到沮丧。这个脑残的操作系统毕竟是这个问题背后的原因。