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

Cam*_*art 8 f# abstract-syntax-tree

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

Tom*_*cek 8

Fantomas肯定是正确看待这里的东西.如果要生成F#源代码,基本上需要两件事:

  1. 构建代表您要构建的源代码的AST.为此,您需要使用F#编译器服务中的无类型AST.该类型化语法树页文档您如何处理它,但它应该是了解它一个很好的起点.表达式的AST由SynExpr类型定义.

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

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

  • 它接受源代码,使用编译器构建AST,然后漂亮地打印AST.所以它的一部分做了OP需要的东西.它还有什么用呢?[正则表达式?](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) (2认同)

pad*_*pad 6

我完全同意托马斯的回答.你需要Fantomas管道的后半部分.这是一些相关信息.

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

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