将C#代码翻译成AST?

时间:2008-10-17 19:00:17

标签: c# compiler-construction abstract-syntax-tree

目前是否可以将C#代码翻译成抽象语法树?

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

12 个答案:

答案 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语言,对元编程有很强的支持。