将 C# 代码转换为 AST?

问题描述 投票:0回答:12

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

编辑:一些澄清;我不一定期望编译器为我生成 AST - 解析器就可以了,尽管我想使用“官方”的东西。不幸的是,Lambda 表达式还不够,因为它们不允许我使用语句体,而这正是我正在寻找的。

c# compiler-construction abstract-syntax-tree
12个回答
20
投票

Roslyn 项目位于 Visual Studio 2010 中,除其他外,您还可以通过编程方式访问语法树

SyntaxTree tree = SyntaxTree.ParseCompilationUnit(
    @" C# code here ");
var root = (CompilationUnitSyntax)tree.Root;

12
投票

目前是否可以将 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 框架来实现这些。


6
投票

查看 .NET CodeDom 支持。有一篇关于 C# CodeDOM 解析器的代码项目的旧文章,但它不支持新的语言功能。

#develop 中还应该支持根据此posting从 C# 源代码生成 CodeDom 树。


4
投票

比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/


3
投票

就我个人而言,我会使用NRefactory,它是免费的、开源的并且很受欢迎。


2
投票

根据 Anders Hejlsberg 的“C# 的未来”PDC 视频,此类功能似乎将包含在 C# 4 之后的任何版本中。


2
投票

ANTLR 解析器生成器具有 C# 3.0 语法,涵盖除 LINQ 语法之外的所有内容。


2
投票

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

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

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


1
投票

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


1
投票

我们的 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。


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

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

项目的 SVN 是

这里:(URL 已更新,谢谢,derigel

另请参阅

Nemerle 语言。它是一种对元编程有强大支持的 .Net 语言。


0
投票
奇怪的是,没有人建议破解现有的 Mono C# 编译器。

© www.soinside.com 2019 - 2024. All rights reserved.