JavaCCのLookaheadに気を付けろ!

JavaCCでは、LOOKAHEADという文法生成規則のあいまいさをカバーしてくれる便利なコマンドがあるが、これを使うときは多少気を付けなくてはならない。


なぜかといえば、LOOKAHEADを使った先でLOOKAHEADが使われていて、先読みが重なった場合に、予測できない動作をすることがある。
さすがに、LOOKAHEADなしは厳しいが、なるべく使わないようにした方が良い。


LOOKAHEAD(2)の場合は、現在の選択の次の選択でLOOKAHEADが使われていないことを確かめればOKなので簡単だ。
問題は、LOOKAHEAD(3)以降で、この時は2階層下の生成規則までチェックが必要だ。


演算子の優先順位の関係で深い階層の生成規則が出てしまうときは、多めのLOOKAHEADが必要になることがあるが、それ以外はなるべくLOOKAHEAD(2)までにしておいた方が安全だ。

どっちみち、コンパイラを作るときには、JavaCC任せにしないで、きちんと動きが把握できるものを作らないといけないということかもしれない。