6

作为学习 Haskell(并折磨自己)的练习,我正在考虑编写一个可配置的 Haskell 代码美化器。

它将支持用 JSON 或 YAML(或更好的东西?)编写的配置文件,该文件指定诸如排序导入、排序/分组dataclass语句、部分之间的行数等选项。

我正在寻找用于生成抽象语法树 (AST)并保留注释的 Haskell 98 解析器。解析 GHC 及其语言扩展将是一个额外的好处。

在没有这样的事情的情况下,我想我可以编写一个递归下降解析器,或者使用 Parsec 或解析器生成器。也许滚动我自己会增加学习(和折磨:-))。

是否有一个完整的 Haskell->AST 解析器在开源许可下可用?如果我在这个项目上取得任何进展,我会把它放在 github 上。

4

2 回答 2

16

包中有一个解析器haskell-src-exts。解析器不仅解析大部分 GHC 扩展;它还识别常见的扩展,例如语法 XML 文字等。parseModuleWithComments如果您还想访问评论信息,则应该使用该功能。

但是请注意,注释并不存储在实际的语法树中。它们存储为带有位置信息的单独评论列表。如果您确实需要将注释包含在树中,那么通过使用线性合并算法将树与列表合并(两个序列都可以被认为是“排序的”),将它们包含在树中应该是相当简单的。评论甚至可以与关联的 AST 节点一起存储,因为“带注释”的 AST 可以在每个节点中包含任意元数据(默认情况下,只有SrcSpanInfo)。在实际包中没有这样做的原因haskell-src-exts大概是因为 AST 解析器是在注释解析器之前编写的。

于 2012-09-18T12:53:02.610 回答
2

我编写了一个超级简单的工具,可以自动格式化 Haskell 代码。它通过使用来自haskell-src-exts. 你可以在https://github.com/djv/small/blob/master/tidy.hs找到它。这可能是更灵活和更强大的东西的开始。

于 2012-09-28T04:35:31.100 回答