目前是否可以将 C# 代码转换为抽象语法树?
编辑:一些澄清;我不一定期望编译器为我生成 AST - 解析器就可以了,尽管我想使用“官方”的东西。不幸的是,Lambda 表达式还不够,因为它们不允许我使用语句体,而这正是我正在寻找的。
目前是否可以将 C# 代码转换为抽象语法树?
是的,在特殊情况下很简单(=使用新的表达式框架):
// Requires 'using System.Linq.Expressions;'
Expression<Func<int, int>> f = x => x * 2;
这会为 lambda 创建一个表达式树,即采用
int
并返回双精度值的函数。您可以使用表达式框架(=该命名空间中的类)修改表达式树,然后在运行时编译它:
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 框架来实现这些。
查看 .NET CodeDom 支持。有一篇关于 C# CodeDOM 解析器的代码项目的旧文章,但它不支持新的语言功能。
#develop 中还应该支持根据此posting从 C# 源代码生成 CodeDom 树。
比R#项目强大得多。 内梅尔·佩格:
https://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/peg-parser/
它有 C# 解析器,可以解析所有 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# 的未来”PDC 视频,此类功能似乎将包含在 C# 4 之后的任何版本中。
ANTLR 解析器生成器具有 C# 3.0 语法,涵盖除 LINQ 语法之外的所有内容。
ANTLR 不是很有用。 LINQ 不是您想要的。
尝试 Mono.Cecil! http://www.mono-project.com/Cecil
它被用于许多项目,包括 NDepend! http://www.ndepend.com/
我刚刚在 StackOverflow 的另一个线程中回答了一个解决方案,其中我实现了一个 API 来从 C# 源代码创建和操作 AST
我们的 DMS C# 前端可以解析完整的 C# 3.0(包括 LINQ)并生成 AST。 DMS 实际上是一个生态系统,用于使用 AST 分析/转换前端提供的语言的源代码。
编辑 2010 年 3 月 10 日:...现在可以处理完整的 C# 4.0编辑:2014 年 6 月 27 日:处理 C# 5.0 已经有一段时间了。
编辑:2016 年 6 月 15 日:处理 C# 6.0。请参阅
https://stackoverflow.com/a/37847714/120163 获取示例 AST。
http://www.rsdn.ru/projects/rsharp/article/rsharp_mag.xml
项目的 SVN 是这里:(URL 已更新,谢谢,derigel)
另请参阅Nemerle 语言。它是一种对元编程有强大支持的 .Net 语言。