Shift-Reduce Conflict в YACC для правила, начинающегося с Action - PullRequest
0 голосов
/ 22 октября 2019
%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");} ; 

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

1 Ответ

1 голос
/ 22 октября 2019

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

...