Конфликт 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 или анализатора с возвратом).