作为学习Haskell(并折磨自己)的练习,我正在考虑编写一个可配置的Haskell代码美化器。
它将支持用JSON或YAML(或更好的东西?)编写的配置文件,它指定选择,例如排序导入,排序/分组data
和class
语句,部分之间的行数等等
我正在寻找Haskell 98的解析器,它生成一个抽象语法树(AST)并保留注释。解析GHC及其语言扩展将是一个奖励。
在没有这样的事情的情况下,我想我可以编写一个递归下降的解析器或使用Parsec或解析器生成器的解析器。也许滚动我自己会增加学习(和酷刑: - ))。
在其中一个开源许可证下是否有完整的Haskell-> AST解析器?如果我在这个项目上取得任何进展,我会把它放在github上。
答案 0 :(得分:16)
haskell-src-exts
包中有一个解析器。解析器不仅解析了大多数GHC扩展;它还可以识别常见的扩展,例如语法XML文字等。如果您还想访问评论信息,则应使用parseModuleWithComments
功能。
但请注意,注释不存储在实际语法树中;它们存储为具有位置信息的单独注释列表。如果你真的需要在树中包含注释,通过使用线性合并算法将树与列表合并(两个序列都可以被认为是“已排序”),那么将注释包含在树中应该是相当简单的。注释甚至可以与关联的AST节点一起存储,因为“带注释的”AST可以在每个节点中包含任意元数据(默认情况下,只有SrcSpanInfo
)。在实际的haskell-src-exts
包中没有这样做的原因可能是因为AST解析器是在注释解析器之前编写的。
答案 1 :(得分:2)
我写了一个超级简单的工具,它自动编码Haskell代码。它通过使用haskell-src-exts
中的解析和漂亮打印功能来实现。您可以在https://github.com/djv/small/blob/master/tidy.hs找到它。这可能是一个更灵活,更强大的开始。