Parsing 编写解析器(用于标记语言):理论与实践;实践

Parsing 编写解析器(用于标记语言):理论与实践;实践,parsing,clojure,Parsing,Clojure,我想为Markdown这样的标记语言编写一个惯用解析器。我的版本会稍有不同,但我觉得在Clojure中至少有一点像这样的需求,我想继续 我不想使用乱七八糟的正则表达式(尽管我意识到可能需要一些正则表达式),而且我想用惯用的Clojure语言制作一些既强大又实用的正则表达式 我已经开始了一些不同的尝试(主要是在纸面上),但我对它们非常满意,因为我觉得我只是在即兴创作。那很好,但在过去的一两个月里,我已经用Clojure的语言做了大量的探索,我想,至少在一定程度上,追随巨人的道路 我想要一些指点,或

我想为Markdown这样的标记语言编写一个惯用解析器。我的版本会稍有不同,但我觉得在Clojure中至少有一点像这样的需求,我想继续

我不想使用乱七八糟的正则表达式(尽管我意识到可能需要一些正则表达式),而且我想用惯用的Clojure语言制作一些既强大又实用的正则表达式

我已经开始了一些不同的尝试(主要是在纸面上),但我对它们非常满意,因为我觉得我只是在即兴创作。那很好,但在过去的一两个月里,我已经用Clojure的语言做了大量的探索,我想,至少在一定程度上,追随巨人的道路

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

编辑布赖恩·卡珀在上有一篇有趣的帖子

还有和,它们是Clojure解析器生成器。fnparse甚至看起来有一些不错的文档


仍在寻找资源等!我只是想用我自己的一些发现来更新这些

我能想到的最好的办法是泰伦斯·帕尔(Terrence Parr)——领导这项研究的人——已经编写了一种标记语言。无论如何,这里有一些源代码要看。

还有一个项目,它允许为解析数据指定PEG语法。

有两个函数标记转换器

  • ,在Haskell中使用
  • 在OCaml中实现

    • 这里还没有提到的另一个是Haskell的parsec库的一个端口

      我最近也在进行一项非常类似的任务,即在Clojure中构建解析器。我在fnparse路径上走了相当长的一段路,特别是使用了(尚未发布的)fnparse 3,您可以在github上的分支中找到它。它分为两种形式:hound(专门用于LL(1)单前瞻解析器)和cat,后者是packrat解析器。两者都是基于monad(比如clarsec)构建的函数解析器。fnparse做了一些令人印象深刻的工作——记录解析器、构建错误消息等的能力非常出色。开发分支上的文档是不存在的,尽管除了函数docstring之外,它实际上相当不错。最后,我在努力使LL(k)工作时遇到了一些障碍。我认为这是可能的,只是没有一个像样的例子,如何使回溯工作很好。我也非常熟悉将词法分析和语法分析分开的解析器,所以我很难这样想。我仍然非常感兴趣,这是一个很好的解决方案,在未来


      同时,我又回到了,它非常健壮,有很好的旅行经历,有很好的文档记录(在两本书中),等等。它没有Clojure后端,但我希望将来会有,这将使它对解析器的工作非常好。我使用它通过StringTemplate进行词法分析、解析、树转换和模板制作。它并不是完全没有碰撞,但到目前为止,我已经能够找到所有问题的可行解决方案。Antlr独特的LL(*)解析算法可以让您编写真正可读的语法,但仍然可以使它们相当高效(如果不可读,则可以逐步调整)。

      规范编译器资源问题可能解决了您的一些问题……啊,感谢您的提醒,这是一个很好的线索,但它可能涵盖的内容比我对这个项目感兴趣的内容要多一些。虽然我一直在寻找一个阅读/实践龙书公司的借口。正则表达式从来都不需要。你会提出什么建议呢?有趣的是,我得去看看。唉,虽然是用Java编写的,但其中的一些想法肯定是适用的,即使这种风格不适用。(注意到了大量的“filler”类,但是,嘿,这就是你如何做到的——只是在函数式语言中很难概念化。)好吧,这是clojure说的对吗?Java互操作非常出色,为什么不为ANTLR编写clojure API呢?看起来这是一个很多人都会受益的项目……没错,人们可能会受益,但在过去的一个月里,我在包装Javalibs方面做了很多。是时候再来点Clojure了™. 不过,这绝对是我要记住的!啊,那太好了。好发现!我正在研究这个问题。我已经开始检查来源,(在看过文档之后),这似乎是答案。据我所知,从二月份开始,它就没有更新过。我给写这封信的人发了电子邮件,问他是否有兴趣把它贴在GitHub上。谢谢你的提示!他给我回了电子邮件,说很快就会有一个重大的更新/重写!FYIThanks!这些都是很好的资源。我的Haskell有点弱,但我可能能够理解它,但我的OCamle不存在。谢谢非常有趣–我也将对此进行研究。我将再次研究Antlr,但我认为我希望帮助改进现有的Clojure解析器。