目前是否可以将C#代码翻译成抽象语法树?
编辑:一些澄清;我不一定希望编译器能为我生成AST - 解析器会很好,尽管我想使用“官方”的东西。遗憾的是Lambda表达式不够,因为它们不允许我使用语句体,这正是我正在寻找的。 p>
答案 0 :(得分:17)
Roslyn项目位于Visual Studio 2010中,可让您以编程方式访问Syntax Tree等。
SyntaxTree tree = SyntaxTree.ParseCompilationUnit(
@" C# code here ");
var root = (CompilationUnitSyntax)tree.Root;
答案 1 :(得分:12)
目前是否可以将C#代码翻译成抽象语法树?
是的,在特殊情况下(=使用新的Expressions framework):
// Requires 'using System.Linq.Expressions;'
Expression<Func<int, int>> f = x => x * 2;
这为lambda创建了一个表达式树,即一个函数接受int
并返回double。您可以使用Expressions框架(=该命名空间中的类)修改表达式树,然后在运行时编译它:
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
请注意,所有表达式都是不可变的,因此必须通过合成重新构建它们。在这种情况下,我已经添加了1。
请注意,这些表达式树仅适用于真实表达式,即在C#函数中找到的内容。您无法通过这种方式获得更高结构(如类)的语法树。使用CodeDom框架。
答案 2 :(得分:6)
查看.NET CodeDom支持。有一篇关于C# CodeDOM parser的代码项目的旧文章,但它不支持新的语言功能。
在#develop中也应该支持根据此posting从C#源代码生成CodeDom树。
答案 3 :(得分:4)
比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/
答案 4 :(得分:3)
就个人而言,我会使用NRefactory,这是免费的,开源的并且越来越受欢迎。
答案 5 :(得分:2)
根据Anders Hejlsberg's 'Future of C#' PDC video,看起来这种功能将包含在C#4之后的任何内容中。
答案 6 :(得分:2)
ANTLR Parser Generator有一个C#3.0语法,涵盖了除LINQ语法之外的所有内容。
答案 7 :(得分:1)
我们的C# front end for DMS解析完整的C#3.0,包括LINQ并生成AST。事实上,DMS是一个生态系统,用于使用AST为前端提供的语言分析/转换源代码。
EDIT 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。
答案 8 :(得分:1)
ANTLR不是很有用。 LINQ不是你想要的。
尝试Mono.Cecil! http://www.mono-project.com/Cecil
它用于许多项目,包括NDepend! http://www.ndepend.com/
答案 9 :(得分:1)
我刚刚在StackOverflow的另一个主题上回答了我为create and manipulate AST from C# Source Code实现API的解决方案
答案 10 :(得分:1)
奇怪的是,没有人建议攻击现有的Mono C#编译器。
答案 11 :(得分:0)
请参阅R#项目(抱歉文档是俄语的,但有一些代码示例)。它允许对C#代码进行AST操作。
http://www.rsdn.ru/projects/rsharp/article/rsharp_mag.xml
Project的SVN为here :(网址已更新,谢谢,derigel)
另请参阅Nemerle语言。它是一种.Net语言,对元编程有很强的支持。