Уменьшить-уменьшить конфликт в грамматике
Я получаю конфликт уменьшения / уменьшения для следующей грамматики в зубрах, потому что n также является эпсилон-продукцией.
m : {$$=line_no;}
;
n : {
$$.nl=makelist(line_no);
codelines[line_no].opcode=GOTO;
codelines[line_no].result=0;
line_no++;
}
;
selection_statement
: IF '(' expression ')' m statement %prec THAN
| IF '(' expression ')' m statement n ELSE m statement
| SWITCH '(' expression ')' statement
;
Как я могу изменить это, чтобы удалить этот конфликт?
2 ответа
Как вы говорите, проблема заключается в сокращении эпсилон n
, что должно быть связано со смещением ELSE
, Проблема возникнет в точно таких же обстоятельствах, что и "неоднозначные" else
, так как не будет понятно, к какому if
заявление n
принадлежит.
Очевидное и простое решение - переместить n
после ELSE
так как не имеет значения, происходит ли действие сокращения до или после смены, а после смены оно ясно даже для LALR
синтаксический анализатор.
Кажется, ваша грамматика не использует значение m. Так что вы можете также удалить все ссылки на m и его правила.