手写解析器的最佳方式是什么?

24
我们使用ANTLR创建了一个类SQL语法的解析器,虽然在大多数情况下结果是令人满意的,但有一些边缘情况需要修复;由于我们没有编写解析器,因此我们对其不够了解,无法做出明智的更改。
因此,我们想编写自己的解析器。手写解析器的最佳方法是什么?应该使用什么类型的解析器 - 递归下降已经被推荐;这样做正确吗?我们将用C#编写它,因此任何关于在该语言中编写解析器的教程都将不胜感激。
更新:我也对涉及F#的答案感兴趣 - 我一直在寻找在项目中使用它的理由。

Simon,我正在查看你的帖子,你提到你“决定手动完成”。你是想在这里进行一个练习来学习解析,还是想要一个语义正确、可维护、快速的解析器?如果是后者,我认为你的决定过早了。你会被解析逻辑所束缚,很快就会忘记你要纠正的“少数边缘情况”。 - Sam Harwell
后者。我们走了解析器生成器的路线,最终得到了一些我们不理解的东西,因此无法修复。我宁愿选择需要几个月工作时间但可以修复的东西,而不是快速完成但无法修复的东西。 - Simon
1
我有点困惑。你对解析器生成器的工作原理不够熟悉吗?如果你做得正确,就不应该再去玩弄生成的代码了。 - Eric
@Eric:也许吧。我相信我已经足够理解它,以确保输出是正确的,但是也许还需要一些技巧来使其更快。我所知道的就是我们现在的程序又难以理解又慢。 - Simon
1
我也使用了ANTLR,但现在考虑手写解析器,因为要解决这些“边缘情况”需要大量时间。 - schoetbi
16个回答

1

如果我是你,我会使用GUI ANTLRWorks再次尝试ANTLRv3,它可以为您提供非常方便的语法测试方式。我们在项目中使用ANTLR,虽然一开始可能学习曲线略陡,但一旦掌握了它,就相当方便。此外,在他们的电子邮件通讯中,有很多乐于帮助的人。

顺便说一句,他们还有一个SQL语法,您可以看一下。

希望对您有所帮助。


谢谢,但我想手写它。 - Simon

0

如果您不介意使用另一种编译器工具,比如ANTLR,我建议您看看Coco/R

我过去用过它,效果还不错...


不,我们已经决定手写一个了。谢谢。 - Simon

0

你不想使用表驱动解析器的原因是你将无法创建出合理的错误消息。对于一种生成的语言来说这是可以接受的,但当涉及到人类参与的时候就不行了。类似C语言编译器产生的错误消息提供了充分的证据,即使有多么糟糕的情况,人们也能适应。


0

我也会选择使用现有的解析器和词法分析器。

我能想到手动完成的唯一原因是:

  • 如果你只需要相对简单的东西(比如验证/解析一些输入)
  • 为了学习/理解原理。

0

JFlex是Java的flex实现,现在有一个C#版本的该项目http://sourceforge.net/projects/csflex/。还有一个正在进行中的C#版本的CUP,可以在这里找到:http://sourceforge.net/projects/datagraph/

我也建议避免手工制作自己的解决方案。我曾经为一个非常简单的语言(大学项目的一部分)尝试过这样做,但它非常耗时和困难。一旦编写完成,它也极难维护和更改。

使用现有的解析器生成器是正确的方法,因为大部分的艰苦工作已经完成,并且经过多年的良好测试。


如果你的代码“看起来像”EBNF,那么你的代码维护起来只比EBNF稍微困难一些。在编写解析器或更改解析器时,应始终从语法开始。 - Jason D

0

看看针对.NET的gplex和gppg,它们是词法分析器和语法分析器生成器。它们工作得很好,并且基于与lex和yacc几乎兼容的相同输入,使用起来相对容易。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接