我正在寻找可以进行研究的解析器和/或解析器生成器的源代码,以便进一步发展,我在学校课程中获得的技能。你知道任何类型的推荐解析器吗?
答案 0 :(得分:19)
您应该知道如何手动构建递归下降解析器。 这是一个SO链接,提供有关如何执行此操作的快速课程: https://stackoverflow.com/a/2336769/120163
如果你想了解递归下降解析器可以如何 自动构建,你可以阅读一篇论文(和 在这个链接上看MetaII上的教程: https://stackoverflow.com/a/1142034/120163
答案 1 :(得分:9)
查看示例,祝你好运。
编辑:
我想我应该发表评论。 parser
是一个处理输入并“理解”它的程序。 parser generator
是用于编写解析器的工具。我想你的意思是你想要了解更多关于生成解析器的知识,在这种情况下,你应该参考解析器生成器的文档(以上所有内容)。
答案 2 :(得分:7)
解析器本身通常不那么有趣,它是解析器的生成器,更像是一个学习主题。
如果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的源代码真的帮助我理解了它们的全部内容。