C#のパーサー


101

C#コードの解析に使用できるパーサーはどれですか?

C#で使用できるC#パーサーを探しており、分析したコードの各アーティファクトに関する行とファイルの情報にアクセスできます。

回答:


118

ソースコードで動作します:

組み立て作業:

アセンブリの「解析」の問題は、行とファイルに関する情報が少ないことです(情報は.pdbファイルに基づいており、Pdbにはメソッドの行情報のみが含まれています)。

私は個人的にMono.CecilNRefactoryをお勧めします


1
CS-Script(csscript.net)-C#スクリプトエンジンはこのリストに適合します。「Microsoft“ Roslyn” CTPの紹介」のサンプルは、CSスクリプトでできることとよく似ています。
Dzmitry Lahoda、2011

1
コストについて触れていますが、Roslynには少なくともVisual StudioのProバージョンが必要です。
kristianp 2012年

7

Mono(オープンソース)にはC#コンパイラー(そしてもちろんパーサー)が含まれています


他のパーサーよりもMonoを使用する利点は何ですか?ビジターを使用してC#プログラムのASTの情報を取得できますか?もしそうなら、そのページを表示しているページに私を案内できますか?
yeeen

6

C#v3.5を.netアセンブリにコンパイルする場合:

var cp = new Microsoft.CSharp.CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", "v3.5" } });

http://msdn.microsoft.com/en-us/library/microsoft.csharp.csharpcodeprovider.aspx


1
特にCodeDomProvider.Parse()メソッドを見てください。
Don Kirkby

3
いいえ、パブリックビルドでNotImplemented例外をスローするCodeDomProvider.Parse()メソッドを確認しないでください。(Visual Studioは独自の内部パーサーを使用します)。
Robin Davies


4

SharpDevelop AST APIを使用して、OWASP O2プラットフォームプロジェクトであなたが求めているもの(C#コードのAST解析)を実装しました。

使いやすくするために、(ステートメント、タイプ、メソッド、プロパティ、フィールド、コメントを使用して)いくつかの主要なソースコード要素を公開し、元のC#コードをC#およびVBNETに書き直すことができるクイックAPIを作成しました。

このO2 XRuleスクリプトファイルでこのAPIの動作を確認できます:ascx_View_SourceCode_AST.cs.o2

たとえば、これはC#のソースコードテキストを処理し、多数のTreeViewsとTextBoxesを設定する方法です。

    public void updateView(string sourceCode)
    {   
        var ast = new Ast_CSharp(sourceCode);
        ast_TreeView.show_Ast(ast);
        types_TreeView.show_List(ast.astDetails.Types, "Text");
        usingDeclarations_TreeView.show_List(ast.astDetails.UsingDeclarations,"Text");
        methods_TreeView.show_List(ast.astDetails.Methods,"Text");
        fields_TreeView.show_List(ast.astDetails.Fields,"Text");
        properties_TreeView.show_List(ast.astDetails.Properties,"Text");
        comments_TreeView.show_List(ast.astDetails.Comments,"Text");

        rewritenCSharpCode_SourceCodeEditor.setDocumentContents(ast.astDetails.CSharpCode, ".cs");
        rewritenVBNet_SourceCodeEditor.setDocumentContents(ast.astDetails.VBNetCode, ".vb");                                
    }

ascx_View_SourceCode_AST.cs.o2の例では、ASTから収集した情報を使用して、ソースコードでタイプ、メソッド、コメントなどを選択する方法も示しています。

参照用に記述したAPIコードは次のとおりです(これはSharpDevelopのC#ASTパーサーを使用する最初のパスであり、それがどのように機能するかについて頭を悩ませています)。


はい、これは少なくとも私が見たものに基づいた最も簡単な解決策のようです。私はまともなパーサーを探していて、このブログsvengrand.blogspot.com/2010/10/を偶然見つけました。これには、SharpDevelopのC#パーサーの使用方法も詳しく説明されています。
Alex

3

最近、すべてのC#4.0機能と新しい非同期機能を処理するC#パーサーをリリースしました: C#パーサーとCodeDOM

このライブラリは、コメントとフォーマット情報を保持し、変更して保存できるセマンティックオブジェクトモデルを生成します。また、LINQクエリを使用してソースコードを分析することもできます。



2

オープンソースIDEであるSharpDevelopには、ビジターベースのコードパーサーが付属しています。IDEとは独立して使用できます。


2

C#コードを直接解析するのではなく、ビルドされたバイナリでリフレクションを使用することを検討してください。リフレクションAPIは本当に使いやすく、おそらく必要なすべての情報を入手できますか?


3
リフレクションは静的分析を行うための悪い方法です。リフレクションロジックが抽出できる情報(「クラス内のメソッドの名前」など)のみを提供します。詳細情報(「この割り当ての右側は何ですか?」)を提供しないため、そのような静的な制限を厳しく制限しますできる分析
Ira Baxter

@Ira Baxterいくつかの制限がありますが、リフレクションを介してILコードを取得することもできます。つまり、どのメソッドが呼び出され、どの変数にどのメソッドが割り当てられているかなどを理解できます。それだけでは不十分な場合は多くありません。すべてのReflectorプラグインができることを見てください。
Hallgrim 2009

リフレクションを介して実際のILコードを取得するにはどうすればよいですか?私の知る限り反射がこれを提供していないとあなたがCCIを参照してください使用する必要が承知しているよう:stackoverflow.com/questions/2824086/...
アッシュ

2

見ていゴールドパーサー。非常に直感的なIUを使用して、インタラクティブに文法をテストし、C#コードを生成できます。それで利用可能な例がたくさんあり、それは完全に無料です。


2
OPは、C#をパースできる何かを求めました。
Ira Baxter、

2

たぶん、あなたはirony.codeplex.comでIronyを試すことができます。

これは非常に高速で、C#文法はすでに存在しています。

文法自体は、BNFのような方法でc#に直接記述されます(一部の演算子のオーバーロードにより実現)

それが一番良いのは、「文法」がASTを直接生成することです。


Irony.Samples / CSharp / CSharpGrammar.csのコメントには、「注:この文法は単なるデモであり、壊れたデモです」と書かれています。したがって、少なくとも完全な実装ではありません。
vladich 2014


1

勢いを増し、仕事に非常に適したものはネメルレです

NDCの次の動画で、それがどのようにそれを解決できるかを確認できます。


Nemerleはプログラミング言語です。素晴らしいプログラミング言語だと思いますが、問題はC#内でC#コードを解析する方法でした!
Qwertie 2014年

あなたはnemerleでルールを作成し、それをC#から使用します。パーサーがC#である必要があるとは言われていませんが、何であれ反対投票します。
ステファン

1

C#ではありませんが、完全なASTを構築する完全なC#2/3/4パーサーは、DMS Software Reengineering Toolkitで利用できます。

DMSは、解析、ツリー構築、シンボルテーブルとフロー分析の構築、ソースからソースへの変換、および(変更された)ASTからのソースコードの再生成のための広大なインフラストラクチャを提供します。(C#以外の多くの言語も処理します。)

編集(9月)2013:この回答は最近更新されていません。DMSは長い間C#5.0を処理してきました


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.