質問

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

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

役に立ちましたか?

解決

Roslyn プロジェクトはVisual Studio 2010にあり、< a href = "http://msdn.microsoft.com/en-us/hh543916" rel = "noreferrer">構文ツリーなど。

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

他のヒント

  

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

はい、特別な状況ではささいに(=新しい式フレームワーク):

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

これは、ラムダの式ツリー、つまり 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フレームワークを使用します。

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

この投稿

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 を使用します。これは無料でオープンソースであり、人気があります。

ANTLR Parser Generator には、LINQ構文を除くすべてをカバーするC#3.0の文法があります。

既存のMono C#コンパイラをハッキングすることを誰も提案しなかったことは奇妙です。

DMSのC#フロントエンドは、LINQおよびASTを生成します。実際、DMSは、フロントエンドで提供される言語にASTを使用してソースコードを分析/変換するためのエコシステムです。

EDIT 3/10/2010:...完全なC#4.0を処理するようになりました

編集:6/27/2014:かなり以前からC#5.0を処理しています。

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

ANTLRはあまり役に立ちません。 LINQはあなたが望むものではありません。

Mono.Cecilをお試しください! http://www.mono-project.com/Cecil

NDepend!を含む多くのプロジェクトで使用されています! http://www.ndepend.com/

R#プロジェクトをご覧ください(ドキュメントはロシア語ですが、いくつかのコード例があります)。 C#コードでのAST操作を許可します。

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

プロジェクトのSVNはこちら:(URL更新、ありがとう、derigel

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top