ошибка токенов yacc / bison. «>>>» и «>>» оба присвоили номер 62 - PullRequest
1 голос
/ 04 октября 2009

Я делаю что-то подобное в моем коде

CmpExpr:
      rval '<<' rval           { $$ = $1 << $3; }
    | rval '>>' rval           { $$ = $1 >> $3; }
    | rval '>>>' rval          { $$ = (unsigned)($1) >> ($3); }
    ;

предупреждение, которое я получаю

tokens '>>>' and '>>' both assigned number 62

Как мне заставить его использовать разные токены?

Ответы [ 2 ]

2 голосов
/ 04 октября 2009
%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, так как он компилируется, но я понятия не имею, работает ли он по-другому

1 голос
/ 06 октября 2009

Вы можете иметь только один символ между кавычками в бизоне - любой многосимвольный токен должен быть распознан лексером как таковой и возвращен как один токен, как описано acidzombie

Когда вы помещаете несколько символов в кавычки в бизоне (как вы это сделали), по сути, он просто игнорирует все, кроме первого, что означает, что '>>' и '>>>' на самом деле одинаковые токены '>'), выдав ошибку, которую вы видите. Это не очень полезное поведение, но оно было унаследовано от исходной программы yacc.

...