Ошибка токенов yacc/bison. ">>>" и ">>" оба присвоили номер 62
Я делаю что-то подобное в моем коде
CmpExpr:
rval '<<' rval { $$ = $1 << $3; }
| rval '>>' rval { $$ = $1 >> $3; }
| rval '>>>' rval { $$ = (unsigned)($1) >> ($3); }
;
я получаю предупреждение
tokens '>>>' and '>>' both assigned number 62
Как мне сделать так, чтобы он использовал разные токены?
2 ответа
%TOKEN LSHIFT RSHIFT RRSHIFT
в лекс напиши
"<<" { return LSHIFT; }
">>" { return RSHIFT; }
">>>" { return RRSHIFT; }
тогда вы можете написать
CmpExpr:
rval LSHIFT rval { $$ = $1 << $3; }
| rval RSHIFT rval { $$ = $1 >> $3; }
| rval RRSHIFT rval { $$ = (unsigned)($1) >> ($3); }
Я думаю, что вы можете написать "<<" вместо LSHIFT, так как он компилируется, но я понятия не имею, работает ли он по-другому
Вы можете иметь только один символ между кавычками в бизоне - любой многосимвольный токен должен быть распознан лексером как таковой и возвращен как один токен, как описано acidzombie
Когда вы помещаете несколько символов в кавычки в бизоне (как вы это сделали), он, по сути, просто игнорирует все, кроме первого, что означает, что '>>' и '>>>' на самом деле являются одинаковыми токенами (такими же, как '>'), давая ошибку, которую вы видите. Это не очень полезное поведение, но оно было унаследовано от исходной программы yacc.