编写解析器(用于标记语言):Theory&实践

时间:2010-08-06 21:08:28

标签: parsing clojure

我想为像Markdown这样的标记语言编写一个惯用的解析器。我的版本会略有不同,但我认为在Clojure中至少需要一些这样的东西,而且我想加入它。

我不想使用乱七八糟的RegExes(虽然我意识到可能需要一些),而且我想制作强大的东西和惯用的Clojure

我已经开始了一些不同的尝试(主要是纸上谈兵),但我对他们非常满意,因为我觉得我只是即兴创作。那没关系,但在过去的一两个月里,我已经用Clojure的语言进行了大量的探索,并希望至少部分地遵循巨人的路径。

我想要一些指示,建议或资源(来自O'Reilly的书很棒 - 爱我一些电子书 - 但亚马逊或无论哪个也很棒)。无论你能提供什么。

编辑 Brian Carper在using ANTLR from Clojure上发表了一篇有趣的帖子。

还有clojure-pgfnparse,它们是Clojure解析器生成器。 fnparse甚至看起来它有一些像样的文档。

仍在寻找资源等!我以为我会用自己的一些调查结果来更新这些内容。

4 个答案:

答案 0 :(得分:6)

我能想到的最好的是Terrence Parr--领导ANTLR parser generator的人 - 编写了一个标记为here的标记语言。无论如何,那里有源代码可供查看。

答案 1 :(得分:5)

还有clj-peg项目,允许指定用于解析数据的PEG语法

答案 2 :(得分:4)

这里还没有提到的是clarsec,一个Haskell的parsec库的端口。

我最近在Clojure中进行了非常类似的构建解析器的任务。我在fnparse路径上走了很远,特别是使用了(未发布的)fnparse 3,你可以在github上的develop分支中找到它。它分为两种形式:猎犬(专门用于LL(1)单个前瞻解析器)和cat,它是一个packrat解析器。两者都是基于monad构建的功能解析器(如clarsec)。 fnparse有一些令人印象深刻的工作 - 记录解析器,构建错误消息等的能力很好。除了功能文档字符串之外,开发分支上的文档不存在,实际上非常好。最后,我试图让LL(k)工作,打了一些路障。我认为有可能让它发挥作用,如果没有一套关于如何使回溯工作得很好的实例,那就很难了。我也非常熟悉分析lexing和解析的解析器,我很难这么想。我对此仍然非常感兴趣,作为未来的一个好解决方案。

与此同时,我已经回归Antlr,这是非常强大,经常旅行,有充分记录(在2本书中),等等。它没有Clojure后端但是我希望将来能够使解析器工作变得非常好。我通过StringTemplate将它用于lexing,解析,树转换和模板化。它还没有完全没有碰撞,但到目前为止我已经找到了解决所有问题的可行解决方案。 Antlr独特的LL(*)解析算法可以让你编写真正可读的语法,但仍然可以使它们相当高效(如果不是这样的话,可以逐步调整它们)。

答案 3 :(得分:2)

两个功能标记翻译器是