2009-08-11 4 views
1

におけるクラス定義のための正規表現:次のような問題があるのJava

私たちは、キーワードはstrictfpを追加および削除する機能が必要なJavaで大規模なコードベース(パッケージの数十数百のファイル)があります各クラス定義。私はsedまたはawkを使ってこの置換を実行する予定です。しかし、私は、コメントの中の "クラス"という言葉が置き換えられないようにしたいと思います。誰もがこれのための解決策を考えることができますか?

+0

が、これはあなたがビルドプロセスの一環として行わたいワンオフ実行するタスク、または何かです:誰でも好奇心旺盛である場合 は、コードは次のように行きますか? また、後者の場合は、興味があるのはなぜですか? – izb

+0

これは一般的な消費のための科学的パッケージであり、丸め誤差が疑われる場合には、プログラムの "厳密な"バージョンを実行するオプションを持っていてほしいので、前後に切り替える機能が必要です。 –

答えて

1

strictfpとno strictfpの間を行き来するため、ビルドプロセスの一部として.classファイルを変更することをお勧めします。次に、この選択肢をビルドオプションにして、ソースファイルを絶えず変更することなくそれを切り替えることができます。

+0

これをさらに説明するのに気をつけますか?私はクラスファイルを修正するための些細な方法があることに気づいていませんでした。残念ながら(そして馬鹿げて)strictfpをコンパイル時またはすべてのクラスの実行時オプションとして指定する方法はありません。 –

+0

私はそれを試していませんが、BCELのようなクラスファイルを操作するためのライブラリがあればできるはずです。 – starblue

1

コードのフォーマットはどのように標準ですか?たとえば、{で終わる行、または次の行が{などで始まる行で 'class'を検索できますか?

+0

それを考えていますが、このコードは3年以上にわたっていくつかの異なる人々によって書かれています。書式設定は一般的に一貫していますが、書式の異なる部分があります。 –

+0

コードフォーマッタで実行するのは1つのオプションだと思いますが、コードの実際の機能を損なわないようにフォーマッタをどれほど信頼するかによって異なります。私は広範なプロジェクトと組み合わせて多くの経験を積んでいないので、私は個人的にその選択肢について意見を述べることはできません。 – Amber

1

このパーサーをjavaパーサーなしで100%入手することは確実ではありません。しかし、以下では十分に近いかもしれない:

sed -i.bak 's/\\(public\\|private\\|protected\\)\\(.*\\)class/\\1 strictfp \\2 class/g' $file 

私はエスケープは右だと思うが、私はWindowsマシンからこれを書いているし、それをテストしていません。

「public/private/protected」の後に「class」が付いているコメントがある場合は、上に飛びます。

+1

あなたはCygwinを持っていませんか?真剣に、それを入手してください:-) – paxdiablo

+0

私が見ることができる唯一の問題は、public/private/protectedキーワードが必要でないことです。 3つのクラスのいずれもなければ、クラスはpackage-privateにデフォルト設定されます。 – Amber

+0

これはパッケージアクセスレベル(つまりアクセスキーワードなし)のクラスをスキップし、 "publicclass"のようなものと一致します。 –

1

完全なキャッチオールとして、いいえ、そのためのRegExはありません。基本的には、クラスの理論的構成を考慮するには、Javaインタプリタ(または少なくともパーサ)を書く必要があります。つまり、word classが行の最初の非空白ビットである場合、または行の最初の空白以外のビットであるアクセス修飾子の前にある場合は、本当に安全でなければなりません。

1

私は2つの可能性を考えることができます:

  • はパーサではなく、正規表現を(RESがすべてためのものではありません)を使用してください。パーサーは、言語構文をはるかによく理解するでしょう。
  • 誤った「クラス」文字列を選択しないように、コードベースを一貫性のあるものにします。

どちらも非常に満足です。最初は実際に書くのがかなり難しく、2番目は正しいことが難しいです。

私のアドバイスは、REを見つけて、ソースコードのローカルコピーで緩め、すべての変更を調べることです。何か変更があった場合は、REを微調整してやり直してください。

次に、コーディング基準を導入して、すべての不適合定義を正しいものに変更します。

2

このような作業では、最初にディレクトリツリー内のすべての*.classファイルが正しいstrictfp設定を持っている(または持っていない)ことを確認する小さなプログラムを作成することをお勧めします。次に、ソースコードの変更の問題を解決するために何をしたとしても、コンパイラの後にチェッカーを実行して、正しいことをしたことを確認できます。

これは実際にはあなたの特定の問題に適用されるTDDです。

+0

+1 strictfpが抜けていると、一貫性のない結果が生じる可能性があります。これは本当に良いアイデアです。 – djna

+0

これは良い考えです。リフレクションAPIを使ってクラスを調べることを意味すると思いますか?それともあなたは何か他のことを考えていましたか? –

+0

私は実際にBCELを念頭に置いていました:http://jakarta.apache.org/bcel/リフレクションに気を使わずに直接 '.class'ファイルを読み込んで調べることができます(私はリフレクションAPIとは思えません'strictfp'設定も公開されます)。 –

0

私は、Javassistが使用するのがはるかに簡単で、自分の目的には完全に適しているので、BCELではなく、最後にJavassistに行くことに決めました。 http://csg.is.titech.ac.jp/~chiba/javassist


    import javassist.*; 
    ClassPool cp = new ClassPool(); 
    CtClass someClass = cp.get("SomeClass"); 
    someClass.setModifiers(Modifier.STRICT); 
関連する問題