0

解析するこの文字列があるとします: 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 > の因数分解以外)

4

1 に答える 1

0

以下を試してください

public void parse_X() :
{}
{
  ((  
     LOOKAHEAD(parse_AA())
     parse_AA()
   |
     parse_AB()
   ))*
 }

それがうまくいかない場合、問題は、X の後に . で始まる何かがあること<A>です。


編集。

それがうまくいかなかったので、次のことを試してください。

public void parse_X() :
{}
{
  ( LOOKAHEAD( <A> )
   (  
     LOOKAHEAD(parse_AA())
     parse_AA()
   |
     parse_AB()
   )
  )*
 }

これが行うことは、警告を抑制することだけであることに注意してください。文法のあいまいさにどのように対処するのが最善かを決める必要があります。

于 2013-10-11T02:52:20.923 に答える