3

JavaCCで次のプロダクションルールを作成しようとしていますが、選択の競合エラーが発生します。先読みを使用して修正する方法は知っていますが、割り当てに使用することは許可されていないという印象を受けています。

void statement() #void:{}
{
  <ID> (<ASSIGN>(expression() | <STRING> ))| <LEFTBRACKET>argument_list()<RIGHTBRACKET>
| <NOT>expression()
| <QUESTIONMARK><ID>
| <LEFTBRACE>(statement()<SEMICOLON>)*<RIGHTBRACE>
| <IF>condition()<THEN>statement()                  <-- Conflict, parser will always pick this one
| <IF>condition()<THEN>statement()<ELSE>statement() <-- 
| <WHILE>condition()<DO>statement()
| {}
}

どんな考えでも大歓迎です!

4

1 に答える 1

3

これは、 JavaCC先読みチュートリアルの古典的な「ぶら下がりelse」の問題です。if2つのプロダクションをif-then-else、オプションのelse;を含む1つのプロダクションに置き換える必要があります。また、次のようLOOKAHEAD(1)に、の前に追加する必要があります。else

| <IF>condition()<THEN>statement()
| <IF>condition()<THEN>statement()<ELSE>statement() 

になります

| <IF>condition()<THEN>statement() [LOOKAHEAD(1) <ELSE>statement()] 
于 2012-12-16T13:57:19.587 に答える