将C#代码翻译成AST?

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

编辑:一些澄清; 我不一定希望编译器能为我生成AST – 解析器没问题,虽然我想使用“官方”的东西。 遗憾的是Lambda表达式不够,因为它们不允许我使用语句体,这正是我正在寻找的。

Roslyn项目位于Visual Studio 2010中,除了其他function外,还提供对语法树的编程访问。

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的函数。 您可以使用Expressions框架(=该命名空间中的类)修改表达式树,然后在运行时编译它:

 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解析器的代码项目的旧文章,但它不支持新的语言function。

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

比R#项目强大得多。 Nemerle.Peg:

https://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/peg-parser/

它有C#Parser解析所有C#代码并将其转换为AST!

https://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/csharp-parser/

您可以在此处下载安装程序: https : //code.google.com/p/nemerle/

就个人而言,我会使用NRefactory ,这是免费的,开源的并且越来越受欢迎。

根据Anders Hejlsberg的“未来C#”PDCvideo ,看起来这种function将包含在C#4之后的任何内容中。

ANTLR Parser Generator具有C#3.0的语法,涵盖除LINQ语法之外的所有内容。

ANTLR不是很有用。 LINQ不是你想要的。

试试Mono.Cecil! http://www.mono-project.com/Cecil

它被用于许多项目,包括NDepend! http://www.ndepend.com/

我刚刚在StackOverflow的另一个线程上回答了我在C#源代码中实现API来创建和操作AST的解决方案

奇怪的是,没有人建议攻击现有的Mono C#编译器。

我们用于DMS的C#前端解析完整的C#3.0,包括LINQ并生成AST。 事实上,DMS是一个生态系统,用于使用AST为前端提供的语言分析/转换源代码。

编辑3/10/2010:…现在处理完整的C#4.0

编辑:2014年6月27日:处理C#5.0很长一段时间。

编辑:2016年6月15日:处理C#6.0。 有关示例AST,请参阅https://stackoverflow.com/a/37847714/120163 。

请参阅R#项目(抱歉,文档是俄语的,但有一些代码示例)。 它允许对C#代码进行AST操作。

http://www.rsdn.ru/projects/rsharp/article/rsharp_mag.xml

Project的SVN在这里 🙁 URL更新,谢谢, derigel )

另请参阅Nemerle语言。 它是一种.Net语言,对元编程有很强的支持。