Конфликт Shift-Reduce в YACC для правила, начинающегося с Action

%token A B
%%
start:  {printf("Starting…\n");} A A
 | A B;

В моей книге говорится, что существует конфликт сдвига-уменьшения, когда токеном является A, потому что yacc преобразует его в код.

%token A B
%%
start: empty A A
 | A B;
empty: {printf("Starting…\n");} ; 

Я этого не понял. Здесь второе правило смены старта, сводится пустое правило. Первое правило начала тоже меняется. Итак, первый вход ожидает A, а второй - B. Как это конфликт? Насколько я знаю, одно правило должно сокращаться, другое - сдвигаться, чем два правила должны ожидать один и тот же токен для входа для такого конфликта. Однако одно правило здесь и сдвигается, и сокращается (первое правило), в то время как второе правило только сдвигается, также они ожидают разных токенов после этих операций.

1 ответ

Конфликт заключается в том, что он не знает, сокращать или нет пустое правило (запускать действие) перед сдвигом A. Оба правила ожидают, что A будет первым токеном, поэтому вы получите конфликт сдвига / уменьшения. Что должно быть сделано, зависит от второго токена, поэтому грамматика не является двусмысленной, и конфликт может быть разрешен путем использования большего количества опережающих попыток (с использованием GLR или анализатора с возвратом).

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