Уменьшить-уменьшить конфликт в грамматике

Я получаю конфликт уменьшения / уменьшения для следующей грамматики в зубрах, потому что 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 и его правила.

Другие вопросы по тегам