解析するこの文字列があるとします: ABAA と次の文法:
public void parse_X() :
{}
{
(
LOOKAHEAD(parse_AA())
parse_AA()
|
parse_AB()
)*
}
public void parse_AA() :
{}
{ <A> <A> }
public void parse_AB() :
{}
{ <A> <B> }
あいまいさや選択の競合がないことは明らかですが、4 行目で選択の競合があることを示す警告が 1 つ表示されます。私の推測では、JavaCC は LOOKAHEAD(parse_AA()) が失敗し、したがって、parse_AA() は従えません。
完全な警告メッセージ:
警告: 行 4 の (...)* コンストラクト内の選択肢の競合。コンストラクト内でネストされた展開と、コンストラクトに続く展開には共通のプレフィックスがあります。そのうちの 1 つは「A」です。ネストされた展開には 2 以上の先読みを使用することを検討してください。エラー 0 個、警告 1 個のパーサーが生成されました。
この警告を回避するにはどうすればよいですか? 代替文法はありますか?(一般的な < A > の因数分解以外)