了解有关解析的更多信息

时间:2009-06-27 20:30:41

标签: parsing dsl

自1999年以来,我一直在编程工作和乐趣。我想学习新东西,最近我一直专注于解析,因为我的工作很大一部分是阅读,整合和分析数据。如果开销足够低,我认为我可以用非常简单的特定于域的语言表达大量重复性任务。我对这个问题有几个问题。

  1. 我目前的大多数解析代码都没有定义正式的语法。我通常用我选择的语言一起破解一些东西,因为这很简单,我知道如何做,我可以非常快地编写代码。对于与我合作的其他人来说,维护也很容易。与大多数程序员用于编写解析器的黑客相比,定义语法和生成真正的解析器(与ANTLRYACC一样)来解析事物有哪些优点和缺点?
  2. 在C ++,Perl和Ruby中编写基于语法的解析器的最佳解析器生成工具是什么?我已经看过ANTLR并且没有太多关于将ANTLRv3与C ++目标一起使用,但其他方面看起来很有趣。我应该阅读的其他与ANTLR类似的工具是什么?
  3. 有兴趣学习更多解析的规范书籍和文章是什么?不幸的是,编译器课程不是我教育的一部分,因此非常欢迎基础材料。我听说过有关Dragon Book的好消息,但还有什么呢?

8 个答案:

答案 0 :(得分:4)

这是我对你(非常好)问题的看法:

  1. 我认为解析器最有益于语法实际存在的非平凡情况。你必须知道解析器和语法如何考虑这种技术,而不是每个开发人员都这样做。
  2. lex / yacc是较旧的Unix工具,可能对您作为C ++开发人员有用。也许是Bison。
  3. ANTRL及其随书非常好。 "Writing Compilers and Interpreters"包含您可能喜欢的C ++示例。
  4. GoF Interpreter模式是另一种编写“小语言”的技巧。看一看。

答案 1 :(得分:4)

在1.,我会说主要的优点是可维护性 - 对语言进行一点改动只是意味着对语法进行相应的小改动,而不是微不足道地破解各种语法代码中可能与您想要改变的内容有关的点数...数量级更高的生产力和更小的错误风险。

在2.和3.上,我不能提出超出你已经发现的内容(我主要使用Python和pyparsing,并且可以根据许多以Python为中心的解析框架的经验进行评论,但对于C ++我无论如何,大多数都使用好的旧yaccbison,而我的旧书的副本 - 实际上不是最新版本 - 就是我为此而保留在我身边的......

答案 2 :(得分:2)

Let's Build A Compiler是关于如何编写简单编译器的分步教程。代码是用Delphi(Pascal)编写的,但它基本上足以轻松翻译成大多数其他语言。

答案 3 :(得分:2)

我会认真研究Haskell中基于monadic组合器的解析(通常也会处理词法分析)。我发现它让人大开眼界;令人惊讶的是,使用此方法可以轻松地从头开始构建解析器。事实上,它很容易编写自己的解析器,而不是尝试使用现有的库。

最着名的例子可能是Parsec,它有一个很好的user guide,可以解释如何使用它。这个库的端口列表是C++上列出的其他语言(包括RubyParsec page of the Haskell wiki),但我不熟悉它们,所以我不能说他们在Haskell中使用Parsec有多接近。

如果你想了解这些内部工作方式以及如何编写自己的工作,我建议从Graham Hutton的Programming in Haskell第8章(“功能解析器”)开始。一旦你理解了那一章(可能需要几个读数),你就会被设定。

答案 4 :(得分:1)

在Perl中,Parse :: RecDescent模块是第一个开始的地方。添加教程到模块名称,Google应该能够找到大量的教程来帮助您入门。

答案 5 :(得分:1)

使用BNF,EBNF或类似方法定义语法更容易,稍后您将有更好的时间来维护它。此外,您可以找到很多语法定义的例子。最后但并非最不重要的一点是,如果你要向场上的其他人谈论你的语法,那么如果你们都说同一种语言(BNF,EBNF等),那就更好了。

编写自己的解析代码就像重新发明轮子一样,容易出错。它也不太可维护。当然,它可以更灵活,对于小型项目,它也可能是一个不错的选择,但使用现有的解析器生成器,它需要语法并吐出代码,应该满足我们的大部分需求。

对于C ++,我也建议使用lex / yacc。对于Ruby来说,这看起来是一个不错的选择:Coco/R(uby)

答案 6 :(得分:1)

有趣的时机:今天早上我花了很多时间来讨论状态机和解析器,并试图弄清楚我如何能够更多地了解它们。

对于2,您可以查看Ragel(这对C ++和Ruby有用)。

答案 7 :(得分:1)

这是一个自包含(10页!),完全可移植的编译器编译器的教程 它可以用来很快地设计和实现“低开销”的DSL:

http://www.bayfronttechnologies.com/mc_tutorial.html

本网站将向您介绍Val Schorre 1964年关于MetaII的论文。 是的,1964年。这太棒了。这就是我学习编译器的方法 早在1970年。