У вас есть
args : /* epsilon */ | {};
Это два произведения для args
, оба они пустые и одно с явным действием no-op. Это заканчивается точкой с запятой, что означает конец правил для args
. Таким образом, бизон не ожидает другой правой стороны. Это ожидает правила для какого-то другого нетерминала.
То, что вы имели в виду, я полагаю, было
args : /* epsilon */
| arglist
;
Обратите внимание, что нет необходимости явно добавлять пустое действие. Оставить действие целиком (как указано выше) точно так же, и, возможно, менее шумно.
Лучший стиль для бизона - использовать маркер %empty
вместо комментария, потому что бизон гарантирует, что правило с %empty
действительно пустое:
args : %empty
| arglist
;