语法/自己编写的解析器?

时间:2010-04-24 14:58:19

标签: parsing grammar generator

我正在做一些涉及为某些东西使用不同语法的小项目,但有时这些语法很容易使用解析器生成器可能有点过分。

现在,我何时应该使用手工制作的解析器,何时应该使用解析器生成器?

谢谢,

William van Doorn

3 个答案:

答案 0 :(得分:5)

除了“使用对于特定情况最简单的任何东西”之外,没有任何硬性答案。

我的经验是解析器在其生命周期中往往变得更加复杂,因此预先使用解析器生成器通常会得到回报。即使语言不复杂,使用生成器也会强制您创建语法的正式规范,这本身就很有价值。

缺点是其他程序员可能不知道如何使用生成器,因此很难让其他人帮忙,这会让你的项目依赖于那个生成器。

答案 1 :(得分:4)

如果,并且只有在你非常热衷于即使在速度非常适中的机器上也能非常快速地编写解析器时,这是值得的。例如,在this article关于Turbo Pascal的历史之前,你可以看到原型如何以及为什么原型给小型(当时的丹麦)公司“Borland”留下了印象,以雇用原型作者(Anders Hejlsberg) ,完全开发编译器,并将其作为主要产品推出,我引用......:

  

没有很大的期望我打了   编译密钥 - 然后我就是   完全褪色!我的测试程序,   花了几分钟来编译和链接   使用Digital Research的Pascal MT +,   在我之前编译并运行   眨眼睛!那真是太棒了   哇时刻!

Turbo Pascal惊人的编译速度 - 首先来自用汇编语言编写的精心手工编码和高度调整的递归下降解析器 - 允许它使用与大多数编译器完全不同的策略:没有单独的编译传递生成对象文件和库,然后是链接器将它们放在一起,而Turbo Pascal 1.0是一个单通道编译器,它直接将源代码转换为单个可执行二进制文件。

我记得在那个时代的小型个人电脑上有同样惊人的体验(当Z80,64K或RAM,两张软盘是很多 ;-) - Turbo Pascal,其中令人惊叹的解析器和IDE以及其他所有内容,与源代码和编译形式的大量程序一起舒适地存储在内存中 - 不需要软盘,这意味着程序周转时间差异很大。

如果Hejlsberg坚持当时的传统智慧 - 总是使用解析器生成器 - Turbo Pascal可能永远不会成为商业产品,并且绝对没有在它所享受的Pascal世界中占据主导地位年。

当然,在当今的典型PC上,大多数编译器都不需要这种极端的解析速度。可能的例外包括必须作为“类似解释器”环境的一部分无缝运行的编译器(对于诸如Perl和Python之类的语言的简单编译器通常是手工编码的,因此在很大程度上 - 这是一个实现选择,使它们在90年代成为可行的,尽管现在还不清楚它是否仍然需要),或者是运行在非常有限的硬件资源上的编译器,例如智能手机或低端上网本。

在您将编写编译器的绝大多数情况下,这些性能考虑因素都不适用,并且您会对解析器生成器感到满意。

答案 2 :(得分:1)

您的问题标题表明使用语法是可选的。事实并非如此 - 即使我要实现一种小语言,我也会在一张纸上勾勒出一种语法。

至于何时使用解析器生成器,这实际上是个人偏好。例如,许多人相信手写递归下降解析器,而不是使用表驱动方法。重要的是要熟悉发电机的功能。

并且不要以为使用解析器生成器在某种程度上更专业,甚至更容易。 Bjarne Stroustrup编写第一个打算使用递归下降的C ++编译器时,贝尔实验室的一些敏锐的同事对此进行了讨论,这让他最终感到懊恼。有关更多详细信息,请参阅“C ++设计和演变”的第3.3.2节。