【发布时间】:2018-09-22 04:44:15
【问题描述】:
解析器是一种接受输入字符串并输出 AST 的东西。
解析器生成器是一种接受语法并生成解析器的东西。
静态解析器生成器是一种接受语法并为解析器生成代码的东西。
动态解析器生成器是在运行时获取语法并在运行时生成解析器的东西.
这让我大吃一惊,因为元编程通常比运行时替代方案更难。我理解为什么它更有效,我理解它为什么错误更少;我不明白它是如何成为常态的。
进入解析器的世界令人沮丧。我不明白为什么每个人都一直指向 Yacc 或 Bison。我只是想让我的程序接受一个任意的 EBNF,一个任意的输入字符串;并吐出AST。
“每种语言在某处都有明确定义的可用EBNF,采用某种标准的“语法文件”格式。我可以编写一个编辑器来支持任何语言!” p>
“好吧,没有发生。解析器组合器到底是什么?它们看起来很酷,但是没有简单的方法将 EBNF 转换为一个。”
“好的...所以我有 EBNF 不知何故,我到底要如何解析我的文本?什么?!生成一个完整的解析器?!”
我一直在考虑这个问题。这是我想出的:
- 计算机运行缓慢。编译器是必要的。当时,编写生成解析器的东西似乎比手工编写更明智。
- 解析器很难推理,以至于编写动态生成的解析器实际上比静态生成的更难。
- 有些人认为静态解析器生成器是他们的路要走,编写了一个成功的实现,由于流行的使用,该实现现在已成为常态。
我可能错了,所以这个问题:
为什么静态解析器生成器比动态解析器生成器更普遍?
【问题讨论】:
标签: parsing dynamic static runtime parser-generator