如何使用AST生成F#代码?

时间:2014-07-14 16:33:01

标签: f# abstract-syntax-tree

我想使用抽象语法树为.fs文件生成F#代码。我能够使用Roslyn API生成.cs文件。以下是单元测试基于riak.cs生成的示例riak.proto文件。我想在F#中做同样的事情。我还不想创建一个类型提供者。有没有人使用FSharp.Compiler.Service进行任何示例,可能使用Fantomas

2 个答案:

答案 0 :(得分:8)

Fantomas肯定是正确的选择。如果要生成F#源代码,基本上需要两件事:

  1. 构建代表您要构建的源代码的AST。为此,您需要使用F#编译器服务中的无类型AST。 untyped syntax tree页面记录了如何处理它,但它应该是了解它的一个很好的起点。表达式的AST由SynExpr type定义。

  2. 构建AST后,需要对其进行格式化。 F#编译器不包含漂亮的打印机,但这正是Fantomas在CodePrinter file中所做的,所以你应该能够复制这个&将AST传递给那里实现的格式。我认为Visual F# PowerTools可能实际上有更新版本的Fantomas,所以请先检查一下。

  3. 这个答案全部使用无类型 AST,这可能非常适合使用该语言的语法。还有类型的 AST(在类型推断完成后创建),但这很难使用,并且不适合这里。

答案 1 :(得分:5)

我完全赞同Tomas'回答。你需要Fantomas管道的后半部分。以下是一些相关信息。

  • FSharp.Compiler.Service' s AST module由相关的AST和其他用于创建AST节点的实用程序函数组成,这可能对您有所帮助。

  • 在Fantomas项目中,有formatAST函数,它将AST作为输入并输出源代码字符串。