現在、C#コードを抽象構文木に変換することは可能ですか?
編集:いくつかの説明; コンパイラがASTを生成することを必ずしも期待しているわけではありません。「公式」なものを使用したいのですが、パーサーで十分です。ラムダ式は、私が探しているステートメント本体を使用できないため、残念ながら十分ではありません。
現在、C#コードを抽象構文木に変換することは可能ですか?
編集:いくつかの説明; コンパイラがASTを生成することを必ずしも期待しているわけではありません。「公式」なものを使用したいのですが、パーサーで十分です。ラムダ式は、私が探しているステートメント本体を使用できないため、残念ながら十分ではありません。
Roslynプロジェクトは Visual Studio 2010 にあり、とりわけSyntax Treeへのプログラムによるアクセスを提供します。
SyntaxTree tree = SyntaxTree.ParseCompilationUnit(
@" C# code here ");
var root = (CompilationUnitSyntax)tree.Root;
現在、C#コードを抽象構文木に変換することは可能ですか?
はい、特別な状況では自明です(=新しいExpressionsフレームワークを使用):
// Requires 'using System.Linq.Expressions;'
Expression<Func<int, int>> f = x => x * 2;
これにより、ラムダの式ツリーが作成されます。つまり、を取り、int
doubleを返す関数です。式フレームワーク(=その名前空間内のクラス)を使用して式ツリーを変更し、実行時にコンパイルすることができます。
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 パーサーのコード プロジェクトに関する古い記事がありますが、新しい言語機能はサポートされません。
この投稿によると、C# ソース コードから CodeDom ツリーを生成するための #develop のサポートも想定されています。
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/
個人的には、無料のオープンソースで人気を博しているNRefactoryを使用します。
Anders Hejlsberg の「Future of C#」PDC ビデオによると、この種の機能は、C# 4 以降の製品に組み込まれるようです。
ANTLR パーサー ジェネレーターには、LINQ 構文を除くすべてをカバーする C# 3.0 用の文法があります。
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を参照してください。
ここ StackOverflow の別のスレッドで、C# ソース コードから AST を作成および操作するための API を実装したソリューションに回答しました。
R# プロジェクトを参照してください (ドキュメントはロシア語で申し訳ありませんが、いくつかのコード例があります)。C# コードでの AST 操作が可能になります。
http://www.rsdn.ru/projects/rsharp/article/rsharp_mag.xml
プロジェクトの SVN はこちら: (URL の更新、ありがとう、デリゲル)
Nemerle言語も参照してください。これは、メタプログラミングを強力にサポートする .Net 言語です。