javacコンパイラ用のOpenJDKは糖衣構文を拡張します

次のように私の拡張子が説明されています。

VaRは、Javaの従来の構文の自動タイプの変数を宣言するために添加して、初期化データに基づいて導出することができます。

 

ここでは2つの例を示します。

例1:

 Javaコードは次のよう(新しい構文VARことに注意してください)。

輸入 java.utilの。* ; 

パブリック クラスTestHello { 
    
    プライベート VAR I = 新しいのArrayList <リスト<>>? (); 

}

 

私は修正コンパイラた後、逆コンパイルツールは、その後、逆コンパイル後のコードのフォームが表示されます。

輸入はjava.util.ArrayList;
輸入はjava.util.List; 

パブリック クラスTestHello 
{ 
  プライベートのArrayList <リスト<>>私は=?新しいのArrayList(); 
}

 

例2:

Javaコードは次のよう(新しい構文VARことに注意してください)。

パブリック クラスTestInit {
     公共のvar V = 1.0 ; 
}

 

私は修正コンパイラた後、逆コンパイルツールは、その後、逆コンパイル後のコードのフォームが表示されます。

パブリック クラスTestInit 
{ 
  公共 ダブル V = 1.0D 
}

 

 

アイデア自体は非常に簡単です:

1.初期化ステートメントの適切なタイプの表現として使用される変数の型。

2.値が初期化、または空されていない場合、それは、直接使用するオブジェクト、推測することはできません。

 

しかし:

私の日のためだけの研究は、単に一般的に「字句解析」とjavacソースコードの「構文解析」のコードを見て、私はこの構文のコードに加えて拡張構文解析の過程である作られているので、このアプローチはあります制限、すなわち、ある:のみ定数初期発現の存在、又は新たなオペレータの宣言された型の背後には、自動的にの種類を識別することができる場合、はなく(または属性が参照される)の関数呼び出しに対して変数条件を初期化します識別は、あなたが徹底的に行いたい場合は、あなたは構文解析過程で型を識別することはできませんので、(これは、この変数の初期化ステートメントにプロセス分析を解析するとき、通常はそれに依存する他のリソースを解析していないためです)あなたが行うことができるように、しかし、構文木を解析全体、その後、2回目のスキャン後に完了します。

私たちは、この拡張機能を改善し続けていき、その後、彼らの言語コンパイラとは、完全な形認識システムを考慮すれば、後で気付いていません。

 

私のコードはここからダウンロードすることができます。https://github.com/naturemickey/valjavac

検索私は(それのわずか数十行を)書いたコードを見つけるために、コード内で「ZHOUYOUして追加」をダウンロードした後、残りのコードは、OpenJDKのです。

注:私は変更するjavacのコードのjdk8u40を使用していますので、あなたは、読者が自分の言葉を練習したい場合は、jdk8をインストールする必要があります(Javaコンパイラは、完全にJavaで書かれたブートストラップされます)。

 

できるだけ多くの人が(実際には、私はちょうど、次の日に見知らぬ人をそれに触れ)のjavacのコードに精通していないので、一つの文章を繰り返したいです:

OpenJDKのメインクラスを実行しているjavacは、直接このクラスを実行し、com.sun.tools.javac.Mainであり、ファイルの名前は、メイン関数の引数としてコンパイルされます。

 

ます。https://www.cnblogs.com/naturemickey/p/4444145.htmlで再現

おすすめ

転載: blog.csdn.net/weixin_34366546/article/details/93461760