【问题标题】:Writing a Parser (for a markup language): Theory & Practice编写解析器(用于标记语言):理论与实践
【发布时间】:2010-08-06 21:08:27
【问题描述】:

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

我不想使用一堆乱七八糟的正则表达式(尽管我意识到可能需要一些),并且我想做一些既强大又符合 Clojure 习惯的东西

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

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

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

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

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

【问题讨论】:

  • 规范编译器资源问题是Learning to write a compiler,它大概解决了您的一些问题...
  • 啊,谢谢你的提醒——这是一个很好的主题,但它可能涵盖的内容可能比我对这个项目的目的感兴趣的多。虽然我一直在寻找阅读/练习《龙书》的借口。
  • 永远不需要正则表达式。
  • 你会建议什么?

标签: parsing clojure


【解决方案1】:

我能想到的最好的事情是 Terrence Parr - 领导 ANTLR parser generator 的人 - 编写了一种标记语言记录在 here。反正那里有源代码可以看。

【讨论】:

  • 有趣——我得去看看。唉,用 Java 写的,但有些想法肯定是适用的,即使风格不是。 (注意到大量的“填充”类,但是,嘿,这就是你的做法——只是更难用函数式语言来概念化。)
  • 嗯,它的clojure 对吗? Java-interop 非常好,为什么不为 ANTLR 写一个 clojure API?似乎是一个让许多人受益的项目......
  • 这是真的,人们可能会这样做,但在过去的一个月里,我已经完成了很多包装 Java 库的工作。是时候多了解一下 Just Clojure™。不过,这绝对是我要记住的事情!
【解决方案2】:

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

【讨论】:

  • 啊,这很整洁。很好的发现!我正在调查。
  • 我已经开始检查源代码(在查看了文档之后),这似乎就是答案。据我所知,自二月份以来,它还没有更新过。我给写这篇文章的人发了邮件,问他是否有兴趣把它贴在 GitHub 上。感谢您的提示!
  • 他给我回了邮件,说很快就会有重大更新/重写!仅供参考
【解决方案3】:

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

我最近一直在进行一项非常相似的任务,即在 Clojure 中构建解析器。我在 fnparse 路径上走得很远,特别是使用(尚未发布的)fnparse 3,您可以在 github 上的 develop 分支中找到它。它分为两种形式:hound(专门用于 LL(1) 单前瞻解析器)和 cat,它是一个 Packrat 解析器。两者都是基于 monad 的函数式解析器(如 clarsec)。 fnparse 有一些令人印象深刻的工作——记录解析器、构建错误消息等的能力非常好。开发分支上的文档是不存在的,尽管函数文档字符串实际上非常好。最后,我在尝试使 LL(k) 工作时遇到了一些障碍。我认为让它工作是可能的,如果没有一套像样的例子来说明如何让回溯工作得很好,那就很难了。我也非常熟悉将词法分析和解析分开的解析器,以至于我很难这样想。作为未来的一个好的解决方案,我仍然对此非常感兴趣。

与此同时,我又回到了Antlr,它非常健壮、广为流传、有据可查(在 2 本书中)等。它没有 Clojure 后端,但我希望它将在未来,这将使它非常适合解析器工作。我将它用于通过 StringTemplate 进行词法分析、解析、树转换和模板化。它并不是完全没有颠簸,但到目前为止,我已经能够找到解决所有问题的可行解决方案。 Antlr 独特的 LL(*) 解析算法可让您编写真正可读的语法,但仍使它们相当高效(如果不是,则逐渐调整它们)。

【讨论】:

  • 非常有趣——我也会研究一下。我将再次研究 Antlr,但我想我想帮助使现有的 Clojure 解析器变得更好。
【解决方案4】:

两个功能标记翻译器是;

【讨论】:

  • 谢谢!这些是一些很好的资源。我的 Haskell 有点弱,但我可能能够理解它,但我的 OCamle 不存在。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
  • 2017-06-27
  • 2022-01-18
  • 1970-01-01
相关资源
最近更新 更多