1

プログラムについて質問があります。私のプログラムは、Java コードから UML ダイアグラムを作成できるようにする必要がありますが、Java キーワード、オブジェクトなどを取得 (ロード) する設計方法がわかりません。それは私の論文です。

私の考えは、UML ダイアグラムに表示される Java キーワードを使用して列挙型クラスを作成し、この列挙型でロードされたすべてのコードをチェックすることでした。しかし、解決できない問題がいくつかあります。特にスペースです。次の問題は次のとおりです。

たとえば、私はコードを持っています:

[space][space]public[space]class[space][space][space]SomeClass[space]{
[empty line]
private int something;
public BufferedReader br;
private ArrayList<File> al;
}

このコードのコメント:

  • [スペース] は、コード内の従来のギャップを表します。
  • 構文的に正しいので、意図的にギャップを強調しました。
  • すべての Java クラスを BufferedReader、ArrayList など、またはその他のオブジェクトとしてロードする方法がわかりません。

返信ありがとうございます。この問題を解決するためのより良い方法があると思います。

4

4 に答える 4

1

Java コードを解析するライブラリの使用を検討する必要があります。確かに、私はあなたにそれを言うことができませんでした。

これが私が従うアプローチです。まず、Eclipse抽象構文ツリーに関するこの記事を読んでください。Eclipse AST を使用するということは、ツールを Eclipse プラグインとして設計していることを意味します。これを行いたくない場合でも、記事はソース ツリーを解析する方法のヒントを提供します。

于 2012-04-19T11:18:30.007 に答える
1

前の2つの回答とあなたのコメント、特にreに追加します。「純粋な Java コード」。

私があなたの質問を正しく理解していると仮定すると、あなたが最初にしなければならないことは、Java ソース コード (つまり、テキスト ファイル) をいくつかのデータ構造に変換することです。そこから、データ構造の UML ダイアグラムを生成できます。

と仮定すると、それはかなり一般的なパターンです。テキストをデータ構造に変換するには、一般に 2 つの方法があります。

  • テキストの解析 (@ user714965 の提案による)
  • リフレクションの使用 (@Joop Eggen の提案による)

パーサーを手書きすることは簡単なことではありません。列挙型クラスの作成などに関するあなたのコメントは、それがあなたの考えていることを示唆しています。ただし、手動でコーディングされたパーサーは、ごく少数のケースで推奨されるソリューションにすぎません。解析アルゴリズムと手法に特化した理論と実践が数多くあります。あなたがあなたのプロジェクトのためにそれに乗り込みたいかどうかは本当にわかりません。

ほとんどの人はパーサージェネレーター (例えばantlr ) を使って文法定義からパーサーを生成します。Java の人気を考えると、少なくとも 1 つの既存の antlr 用の Java 文法があります。「純粋なJavaコード」の制約が何を意味するのかよくわかりません。Antlr は純粋な Java コード パーサーを生成するので、問題ありません。すべてのコードをゼロから作成する必要がある場合は、パーサー ジェネレーターを使用することはできません。しかし、それは非常に奇妙な制約のようです...

ともかく。他のオプションは、リフレクションを使用することです。これは事実上、JVM でパーサーを使用し、コード自体を照会およびナビゲートするための API アクセスを提供します。java.lang.reflect も (明らかに) 純粋な Java であるため、それを呼び出すコードも同様です。

Eclipse/Netbeans API は別の可能なルートを提供します。事実上、それらは Java コードを表すデータ構造のセットを提供する別の「パーサー」にすぎません。

独自のパーサーを手動で作成するのではなく、これら 3 つのアプローチのいずれかを強くお勧めします。

それが役立つかどうかはわかりません。おそらく、「純粋な Java コード」の制約についてもう少し説明できます。

于 2012-04-19T15:26:51.017 に答える
1

コンパイルされたコードを使用できれば、それは素晴らしいことです。Java では、初期化せずにクラスをロードし、その構造をjava.lang.reflectで調べることができます。もちろん、たとえばパラメーター名は欠落します。

詳細については、ASM などの代替クラス解析ライブラリがあります。

于 2012-04-19T11:29:52.857 に答える
0

JavaCC のようなパーサー ジェネレーターを選択するだけです (タスク 1)。完成した Java 文法を使用します (または独自の文法を作成します)。Lexer を生成し (2)、独自の Parser を文法に記述します (3)。パーサーからツリーを保存するか、最初に変更して XML/XMI 表現を取得します。5)については、既存のツールを実際に選択する必要があります。独自のツールを作成することは、完全な追加論文になる可能性があります...

于 2012-04-20T07:52:27.897 に答える