8

私は、大規模なソフトウェア プロジェクトに関するいくつかの単純なメトリックを計算する、私の古いプロジェクトのほこりを払っています。メトリックの 1 つは、ファイル/クラス/メソッドの長さです。現在、私のコードは、クラス/メソッドの境界が非常に粗いアルゴリズムに基づいている場所を「推測」しています (ファイルをトラバースし、「現在の深さ」を維持し、引用符で囲まれていない括弧に遭遇するたびにそれを調整します。クラスまたはメソッドが開始されたレベルに戻ると、 、終了したと見なします)。ただし、この手順には多くの問題があり、深度がいつ変化したかを検出する「単純な」方法が常に有効であるとは限りません。

これで正確な結果が得られるようにするには、関数定義、クラス定義、深さの変化を検出する正規の方法を (各言語で) 使用する必要があります。これは、プロジェクトを適用したいすべての言語に対して、少なくともこれらの要素を含む解析ツリーを生成する単純なパーサーを作成することになります。

明らかに、パーサーはこれらすべての言語に対して以前に作成されているため、その作業を繰り返す必要はないように思われます (パーサーを作成するのは楽しいものですが)。 多数のソース言語用にすぐに使用できるパーサー ライブラリを収集するオープンソース プロジェクトはありますか? それとも、ANTLR を使用してゼロから独自のものを作成する必要がありますか? (注: プロジェクトを別の言語に移植して、優れた既存のリソースを利用できることを嬉しく思います。そのため、そのリソースを知っていれば、それがどの言語で書かれているかは問題ではありません。)

4

2 に答える 2

6

特にマクロやプリプロセッサ条件などの言語の複雑さに直面して、言語に正確な解析が必要な場合は、完全な言語パーサーが必要です。これらを構築するには実際にはかなりの作業が必要であり、ほとんどの言語はさまざまな種類のパーサー ジェネレーターにうまく対応していません。また、言語パーサーのほとんどの作成者は、他の言語に関心を持っていません。彼らは、開始時に明らかに大きな障害とならないパーサージェネレーターを選択し、意図した特定の目的のためにパーサーを実装し、先に進む傾向があります。

結果: 単一の形式主義または共有基盤を使用して定義されている言語定義のライブラリはほとんどありません。ANTLR の群集は、IMHO のより大きなセットの 1 つを維持していますが、私が知る限り、それらのパーサーのほとんどは完全に生産可能ではありません。Bison は常に存在するので、言語定義のライブラリがどこかに集められているのではないかと思われるかもしれませんが、私は見たことがありません。

私は過去 15 年間、プログラムの分析と変換のための基盤機構を定義し、DMS Software Reengineering Toolkitと呼ばれる別のライブラリを構築してきました。C、C++、C#、Java、COBOL (IBM Enterprise バージョン)、JCL、PHP、Python などの製品品質のパーサーがあります。あなたの意見はもちろん私のものとは異なる場合がありますが、これらは大量の変更タスクを実行するために DMS で毎日使用されます。大量のコードで。

言語定義のセットが成熟し、単一の基盤に基づいて構築されている他の会社を私は知りません... IBMのコンパイラーはそのようなセットである可能性がありますが、IBMは機械や言語定義を提供していません.

単純なメトリクスを計算するだけなら、(説明したように) レクサーとアドホック ネスト カウントだけで生活できるかもしれません。それでも、ほとんどの場合、正しく機能させるのは見た目よりも困難です (Python、Perl、および PHP のクレイジーな文字列構文を確認してください)。結局のところ、正確な字句解析器を定義するだけでも、C でさえ驚くほどの作業量になります。Microsoft や GNU C で見られるすべての奇妙な語彙素をカバーするために、数千行の洗練された正規表現があります。

DMS には多くの言語に対して一貫して定義された成熟したパーサーがあるため、DMS は同じ言語に対して一貫して定義された成熟したレクサーを持っていることになります。私たちは実際にソース コード検索エンジン (SCSE)を構築します。このエンジンは、検出した言語を字句解析し、それらの語彙素にインデックスを付けて高速検索することで機能する、複数の言語の大量のコード全体を高速に検索します。SCSEは、使用するこれらの言語の正確なレクサーを持っていることを除いて、あなたが説明した方法とほぼ同じ方法でコードベースをインデックス化するため、議論している種類のメトリックも計算します.

于 2010-04-02T03:56:39.727 に答える
2

C++ を解析している場合は、 gcc-xmlに興味があるかもしれません。Java CUPには、Java 言語の文法があります。

于 2010-04-02T03:17:51.777 に答える