2017-05-15 11 views
-1

私はこのMySQL grammarのAntlr3生成Javaレクサー/パーサーを持っています。Java:Oracleのjavacでコードが大きすぎてEclipse用にあまりありません

Eclipse Neonは上記のlexer/parserをうまくコンパイルできます。結果として得られるプログラムも正常に動作します。したJavaコードがコンパイルされている場合は

  1. [javac] .../MySQLParser.java:27: error: code too large 
    [javac]  public static final String[] tokenNames = new String[] { 
    [javac]        ^
    [javac] 1 error 
    

    質問:

    しかし、オラクルのJava 8コンパイラは、同じJavaコードのための 'コードは大きすぎる' というエラーを与えます本当に大きすぎる(> 64K)、両方のコンパイラで同じエラーが発生してはいけませんか?

    大きすぎるバイトコードの場合、OracleコンパイラにEclipseのようなスペース効率のよいコードを生成させる方法はありますか?

    コードのメンテナンス上の理由から、私はAntlrサイトから入手したオリジナルのMySQL文法を編集することも、生成されたJavaパーサー/レクサーコードを編集してOracle用に十分小さくすることも望まないでしょう。したがって、コンパイラレベルの回避策をいくつか "メタ"したいと考えています。

  2. 上記のエラーメッセージは、問題がちょうどtokenNamesが大きすぎるということを意味しますか?それとも、それが全体のクラスで、それが大きすぎるのですか?一人で

+0

ネオン??ああ、私はまだHeliosにいる –

+1

Eclipseコンパイラは 'javac'とは全く異なるコードベースであることに注意してください。生成された出力が正しい限り、これは通常問題ではありません。 Eclipseコンパイラはjavacのスタンドアロンの置き換えとして使用できます。したがって、このファイルをコンパイルするために明示的に使用することを検討することができます。 –

+1

これがコードサイズの問題に役立つかどうかわかりませんが、良い文法を使用することを強くお勧めします。文法リポジトリからのものは不完全であり、多くの言語部分を欠いています。代わりに、[MySQL Workbench](https://github.com/mysql/mysql-workbench/tree/master/library/parsers/grammars)の100%完全文法を使用してください。 –

答えて

1

tokenNames大きすぎるのコードを生成することはほとんどありません。何が起こるかは、クラス内のすべての変数の初期化(非常に大きい傾向があるDFA初期化を含む)が、通常のメソッドのように(ある意味で)動作し、このコードサイズの制限を持つ単一の静的初期化子にコンパイルされます。私たちはこの問題に遭遇したとき、我々は実際に(ただし、さらに大きな文法で)やった

ではなく

public static final String[] tokenNames = new String[] { ... }; 

のようなもので、それは

のようなコードを生成するようにJavaのパーサを生成し、テンプレートを変更しました
public static String[] tokenNames; 
static { 
    tokenNames = new String[] { ... }; 
} 

(我々は問題を抱えていた場所なので、私たちは実際に、DFAの初期化ではなく、tokenNamesのためにこれをやった)

この変更を伴いますANTLRツールを使用してください。Eclipseがまだコンパイルできる場合は、おそらく最も単純なソリューションではありません。これは、テキストのみの変更で、zip/unzipツールとテキストエディタを必要とするだけでなく、ANTLRがどのように内部で動作するかを学ぶことができます。

関連する問題