Проблема в том, что вы определили term
:
term: NUMBER | term op term ;
При синтаксическом анализе этого для каждого числа возникает вопрос: должен ли я прочитать другой токен, чтобы узнать, есть ли у меня первый иливторая форма.
Решением может быть определение:
term: NUMBER reminder;
reminder: /* empty */ | op term;
Грамматика после адаптации выглядит следующим образом:
%token NUMBER
%token COMMA
%token OPERATOR
%left OPERATOR
%left COMMA
%%
term: NUMBER reminder;
reminder: /* empty */ | op term;
op: OPERATOR | COMMA;
%%
компилируется без предупреждений с помощью bison (GNU Bison) 2.4.1
.