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