将C#代码翻译成AST?

Eri*_*bes 15 c# compiler-construction abstract-syntax-tree

目前是否可以将C#代码转换为抽象语法树?

编辑:一些澄清; 我不一定希望编译器能为我生成AST - 解析器会很好,尽管我想使用"官方"的东西.遗憾的是Lambda表达式不够,因为它们不允许我使用语句体,这正是我正在寻找的.

Pau*_*bel 18

罗斯林项目是在Visual Studio 2010,让您的编程访问的语法树,等等.

SyntaxTree tree = SyntaxTree.ParseCompilationUnit(
    @" C# code here ");
var root = (CompilationUnitSyntax)tree.Root;
Run Code Online (Sandbox Code Playgroud)


Kon*_*lph 12

目前是否可以将C#代码转换为抽象语法树?

是的,在特殊情况下(=使用新的Expressions框架):

// Requires 'using System.Linq.Expressions;'
Expression<Func<int, int>> f = x => x * 2;
Run Code Online (Sandbox Code Playgroud)

这为lambda创建了一个表达式树,即一个获取int并返回double 的函数.您可以使用表达式框架(=该命名空间中的类)修改表达式树,然后在运行时编译它:

var newBody = Expression.Add(f.Body, Expression.Constant(1));
f = Expression.Lambda<Func<int, int>>(newBody, f.Parameters);
var compiled = f.Compile();
Console.WriteLine(compiled(5)); // Result: 11
Run Code Online (Sandbox Code Playgroud)

请注意,所有表达式都是不可变的,因此必须通过组合重新构建它们.在这种情况下,我已经添加了1.

请注意,这些表达式树仅适用于真实表达式,即在C#函数中找到的内容.您无法通过这种方式获得更高结构(如类)的语法树.使用CodeDom框架.


Rob*_*ker 6

查看.NET CodeDom支持.有关C#CodeDOM解析器的代码项目的旧文章,但它不支持新的语言功能.

在#develop中也应该支持根据这个帖子从C#源代码生成CodeDom树.