目前是否可以将C#代码转换为抽象语法树?
编辑:一些澄清; 我不一定希望编译器能为我生成AST - 解析器会很好,尽管我想使用"官方"的东西.遗憾的是Lambda表达式不够,因为它们不允许我使用语句体,这正是我正在寻找的.
该罗斯林项目是在Visual Studio 2010,让您的编程访问的语法树,等等.
SyntaxTree tree = SyntaxTree.ParseCompilationUnit( @" C# code here "); var root = (CompilationUnitSyntax)tree.Root;
目前是否可以将C#代码转换为抽象语法树?
是的,在特殊情况下(=使用新的Expressions框架):
// Requires 'using System.Linq.Expressions;' Expression> f = x => x * 2;
这为lambda创建了一个表达式树,即一个获取int
并返回double 的函数.您可以使用表达式框架(=该命名空间中的类)修改表达式树,然后在运行时编译它:
var newBody = Expression.Add(f.Body, Expression.Constant(1)); f = Expression.Lambda>(newBody, f.Parameters); var compiled = f.Compile(); Console.WriteLine(compiled(5)); // Result: 11
请注意,所有表达式都是不可变的,因此必须通过组合重新构建它们.在这种情况下,我已经添加了1.
请注意,这些表达式树仅适用于真实表达式,即在C#函数中找到的内容.您无法通过这种方式获得更高结构(如类)的语法树.使用CodeDom框架.
查看.NET CodeDom支持.有关C#CodeDOM解析器的代码项目的旧文章,但它不支持新的语言功能.
在#develop中也应该支持根据这个帖子从C#源代码生成CodeDom树.