17

現在、C#コードを抽象構文木に変換することは可能ですか?

編集:いくつかの説明; コンパイラがASTを生成することを必ずしも期待しているわけではありません。「公式」なものを使用したいのですが、パーサーで十分です。ラムダ式は、私が探しているステートメント本体を使用できないため、残念ながら十分ではありません。

4

12 に答える 12

19

Roslynプロジェクトは Visual Studio 2010 にあり、とりわけSyntax Treeへのプログラムによるアクセスを提供します。

SyntaxTree tree = SyntaxTree.ParseCompilationUnit(
    @" C# code here ");
var root = (CompilationUnitSyntax)tree.Root;
于 2011-10-27T17:32:37.017 に答える
12

現在、C#コードを抽象構文木に変換することは可能ですか?

はい、特別な状況では自明です(=新しいExpressionsフレームワークを使用):

// Requires 'using System.Linq.Expressions;'
Expression<Func<int, int>> f = x => x * 2;

これにより、ラムダの式ツリーが作成されます。つまり、を取り、intdoubleを返す関数です。式フレームワーク(=その名前空間内のクラス)を使用して式ツリーを変更し、実行時にコンパイルすることができます。

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フレームワークを使用してください。

于 2008-10-17T19:20:53.440 に答える
6

.NET CodeDom のサポートを確認してください。C# CodeDOM パーサーのコード プロジェクトに関する古い記事がありますが、新しい言語機能はサポートされません。

この投稿によると、C# ソース コードから CodeDom ツリーを生成するための #develop のサポートも想定されています。

于 2008-10-17T19:13:28.807 に答える
4

R# プロジェクトよりもはるかに強力です。Nemerle.Peg:

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

そして、すべての C# コードを解析して AST に変換する C# パーサーがあります。

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

ここからインストーラーをダウンロードできます: https://code.google.com/p/nemerle/

于 2011-03-08T09:19:24.753 に答える
3

個人的には、無料のオープンソースで人気を博しているNRefactoryを使用します。

于 2012-05-06T21:31:11.013 に答える
2

Anders Hejlsberg の「Future of C#」PDC ビデオによると、この種の機能は、C# 4 以降の製品に組み込まれるようです。

于 2008-11-18T18:12:35.047 に答える
2

ANTLR パーサー ジェネレーターには、LINQ 構文を除くすべてをカバーする C# 3.0 用の文法があります。

于 2008-11-25T21:49:52.547 に答える
1

DMS用のC#フロントエンドは、LINQを含む完全なC#3.0を解析し、ASTを生成します。実際、DMSは、フロントエンドが提供する言語にASTを使用してソースコードを分析/変換するためのエコシステムです。

2010年3月10日編集:...完全なC#4.0を処理するようになりました

編集:2014年6月27日:かなり前からC#5.0を処理します。

編集:2016年6月15日:C#6.0を処理します。サンプルASTについては、https://stackoverflow.com/a/37847714/120163を参照してください。

于 2009-08-17T08:51:30.063 に答える
1

ここ StackOverflow の別のスレッドで、C# ソース コードから AST を作成および操作するための API を実装したソリューションに回答しました。

于 2010-02-06T21:37:19.500 に答える
0

R# プロジェクトを参照してください (ドキュメントはロシア語で申し訳ありませんが、いくつかのコード例があります)。C# コードでの AST 操作が可能になります。

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

プロジェクトの SVN はこちら: (URL の更新、ありがとう、デリゲル)

Nemerle言語も参照してください。これは、メタプログラミングを強力にサポートする .Net 言語です。

于 2008-10-17T19:13:54.970 に答える