次のように私の拡張子が説明されています。
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で再現