Haskell解析器转AST

6
作为学习Haskell编程语言的练习(并折磨自己),我考虑编写一个可配置的Haskell代码美化器。
它将支持使用JSON或YAML(或其他更好的格式)编写的配置文件,该文件指定了例如导入排序、排序/分组data和class语句、各节之间的行数等选择项。
我正在寻找一种能生成抽象语法树(AST)且保留注释的Haskell 98解析器。如果可以解析GHC及其语言扩展,那会是个加分项。
如果没有现成的解析器,我猜我可以编写一个递归下降解析器或使用Parsec或解析器生成器来编写一个。也许自己动手会增加学习(和折磨 :-))。
是否有完整的Haskell->AST解析器可以在开源许可证下使用?如果我在这个项目上取得任何进展,我将把它放在GitHub上。

我最讨厌的事情之一就是难看的代码。我的大部分工作都是用Java做的,令我惊讶的是,人们居然可以提交没有对齐花括号、运算符周围空格不一致等问题的代码。他们不读自己的代码吗?这不会让他们烦恼吗?可能是由于我的强迫症。无论如何,我同意默认的Haskell代码确实好看很多。但我仍然想写一个美化器:-)。 - Ralph
是的,我只是开玩笑,因为我喜欢你提出的那些想法。为什么不使用Haskell本身作为配置文件的语言呢?我相信我读过有人逐渐发展他们的特定领域语言进行配置,直到他们意识到他们只想要Haskell,但这是我能找到的最接近的例子。或者你可以使用ConfigFile包。 - AndrewC
2个回答

16

haskell-src-exts包中提供了一个解析器,不仅可以解析大部分GHC扩展,还可识别常见的扩展,如语法XML文字等。如果您需要访问注释信息,应使用parseModuleWithComments函数。

但请注意,注释并未存储在实际的语法树中,而是作为一个带有位置信息的单独注释列表进行存储。如果您真的需要将注释包含在语法树中,则可以通过使用线性合并算法将树与列表合并来实现(两个序列可以被视为“排序”)。注释甚至可以与关联的AST节点一起存储,因为“注释”的AST可以在每个节点中包含任意元数据(默认情况下,仅包含SrcSpanInfo)。实际上,haskell-src-exts包之所以没有将注释包含在语法树中,可能是因为AST解析器是在注释解析器之前编写的。


2

我写了一个超级简单的工具来自动格式化Haskell代码。它使用了来自 haskell-src-exts 的解析和漂亮打印函数。你可以在 https://github.com/djv/small/blob/master/tidy.hs 找到它。这可能是更灵活、更强大的工具的开始。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接