Все эти ошибки являются результатом неправильного подсчета символов справа.Например, в
: ID LBRACK exp RBRACK OF exp {$$ = A_arrayExp(EM_tokPos,$2,$4);}
$2
равно LBRACK
(второй символ), а $4
равно RBRACK
.Возможно, вы хотели значения двух exp
символов ($3
и $6
), но немного странно игнорировать значение ID
в $1
.
Возможно, выполагая, что учитываются только символы со значениями.Это не тот случай;$n
относится к значению символа n
в правой части и поэтому является ошибкой, если этот символ не имеет значения.
Обратите внимание, что yacc / bison на самом деле не можетсказать, имеет ли конкретный терминал значение или нет;все, что он знает, - сказал ли ты ему, каков тип этого значения.