5

Java にマイナーなシンタックス シュガーを追加したいとします。正規表現パターン リテラル、またはおそらく base-2 リテラル、または複数行の文字列などを追加するなど、ちょっとしたことです。文法的に重要なことはありません (少なくとも今のところ)。

これを行うにはどうすればよいでしょうか?

バイトコード コンパイラを拡張する必要がありますか? (それは可能ですか?)

標準 Java コンパイラーにフィードする前に、単純なソース・コード変換を行う Eclipse プラグインを作成できますか?

4

4 に答える 4

6

Project Lombokを見て、彼らの試みを再利用しようとします。Java 5 アノテーションを使用して、コードがコンパイルされる前に抽象構文ツリーを操作できる Java エージェントをフックします。彼らは現在、javac、または Eclipse や NetBeans などの主要な IDE で使用できるカスタム トランスフォーマーを作成できるようにする API の作成に取り組んでいます。コードの生成をトリガーするアノテーションと同様に、構文の変更 (おそらく mixin または Java 7 以前のクロージャー構文) の追加も計画しています。

(細かいところは少し違うかもしれませんが、かなり近いと思います。)

Lombok はオープン ソースであるため、そのコードを研究し、その上に構築しようとすることは、おそらく良いスタートになるでしょう。

それができない場合は、javac コンパイラーの変更を試みることができます。私が聞いたところによると、これは、コンパイラーや Java の専門家ではない人にとっては、フラストレーションを感じて毛を引っ張る作業になる可能性があります。

于 2010-03-07T11:26:12.500 に答える
3

特にJSR 269 (プラグ可能な注釈処理)javacでハッキングできます。ソース コード内のステートメントをトラバースして変換するビジターにフックできます。

これは、たとえば、Java でローマ数字のサポートを追加するための変換のコアです (詳細については、もちろん完全な投稿をお読みください)。比較的簡単そうです。

public class Transform extends TreeTranslator {
    @Override
    public void visitIdent(JCIdent tree) {
        String name = tree.getName().toString();
        if (isRoman(name)) {
            result = make.Literal(numberize(name));
            result.pos = tree.pos;
        } else {
            super.visitIdent(tree);
        }
    }
}

追加のリソースは次のとおりです。

プロジェクトLombok(他の回答で引用)が同じ手法を使用しているかどうかはわかりませんが、そうだと思います。

于 2010-03-07T12:32:56.703 に答える
2

JRuby の技術リーダーである Charles Nutter は、リテラル正規表現で Javac を拡張しました。私が思い出す限り、彼は大文字と小文字を約 3 行変更しなければなりませんでした。

http://twitter.com/headius/status/1319031705を参照してください。

于 2010-03-08T15:38:44.643 に答える
2

JRuby の技術リーダーである Charles Nutter は、リテラル正規表現で Javac を拡張しました。私が思い出す限り、彼は大文字と小文字を約 3 行変更しなければなりませんでした。

http://twitter.com/headius/status/1319031705を参照してください。


そして、javac に新しい演算子を追加する方法に関する素晴らしいチュートリアルがあります。 http://www.ahristov.com/tutorial/java-compiler.html

そのような他のリンクについては、javac hackers のリンクのリストを参照してください。

于 2010-03-08T15:40:40.507 に答える