示例解析器,以了解如何编写它们

时间:2012-02-25 21:31:19

标签: parsing language-agnostic

我正在寻找可以进行研究的解析器和/或解析器生成器的源代码,以便进一步发展,我在学校课程中获得的技能。你知道任何类型的推荐解析器吗?

5 个答案:

答案 0 :(得分:19)

您应该知道如何手动构建递归下降解析器。 这是一个SO链接,提供有关如何执行此操作的快速课程: https://stackoverflow.com/a/2336769/120163

如果你想了解递归下降解析器可以如何 自动构建,你可以阅读一篇论文(和 在这个链接上看MetaII上的教程: https://stackoverflow.com/a/1142034/120163

答案 1 :(得分:9)

  • Bison是一个经典的例子(C / C ++)。
  • Pyparsing是一个很棒的模块,它非常易于使用(Python)。
  • Lemon非常易于使用(C ++)。

查看示例,祝你好运。

编辑:

我想我应该发表评论。 parser是一个处理输入并“理解”它的程序。 parser generator是用于编写解析器的工具。我想你的意思是你想要了解更多关于生成解析器的知识,在这种情况下,你应该参考解析器生成器的文档(以上所有内容)。

答案 2 :(得分:7)

解析器本身通常不那么有趣,它是解析器的生成器,更像是一个学习主题。

  • ANTLR生成LL解析器,一旦生成就很容易读取。 (Java)的
  • Bison生成无法读取的LALR(1)解析器。 (C)

如果LALR(1)感兴趣,我有一个library up on github试图在LALR解析上做一个新的数字。随意看看。它是在C#中,我已尽力使代码易于理解。这对我来说是一个学习项目,但它比大工具小,而且更容易渗透。绝对可以自由发挥作用,还有很多功能可以添加。

否则,请查看这些工具的生成的代码,了解它们如何构建实际工作的解析器。

答案 3 :(得分:4)

我建议你这本书:http://www.cs.nott.ac.uk/~gmh/book.html。启动Haskell是非常好的,它有一整章解析器。

如果您能理解,使用Haskell创建解析器非常简单。 另外考虑到Haskell非常快速且适用于多核编程,因此它可能是未来。

加。

以下是Haskell中的解析器:Happy - http://www.haskell.org/happy/

答案 4 :(得分:2)

我刚刚经历了同样的战斗,最后觉得我能很好地处理你的选择。

许多解析器是为无上下文语法构建的。你可以阅读formal definition of context-free但我的直觉是它基本上意味着语法标记/规则不能根据某些上下文改变。我可能错了,但我认为这也意味着你没有预见。

例如,markdown不是无上下文的,我认为基于缩进的任何语言都不是无上下文的,无需进行一些预处理来包装具有开始和结束标记的块。 C是无上下文语法的完美例子。

如果您正在处理无上下文语法,BNF是指定编译器的正式方法。 This was an immensely helpful article解释了BNF语法如何工作,它们的表现如何,以及BNF语法的常见扩展。

此类别中的一些选项包括ANTLR,Bison,Yacc,Jison和Peg.js。

然而,在与ANTLR争夺一段时间之后,我发现了我认为最好的解决方案:“解析器组合器”。它基本上是类固醇的正则表达式,在函数式编程世界非常流行。

我还没有任何好的学习资源,但谷歌周围你会发现它们几乎任何语言。我来自JavaScript世界,偷看this very small library的源代码真的帮助我理解了它们的全部内容。