我在我的代码中做了类似的事情
CmpExpr:
rval '<<' rval { $$ = $1 << $3; }
| rval '>>' rval { $$ = $1 >> $3; }
| rval '>>>' rval { $$ = (unsigned)($1) >> ($3); }
;
我得到的警告是
tokens '>>>' and '>>' both assigned number 62
如何让它使用不同的令牌?
答案 0 :(得分:2)
%TOKEN LSHIFT RSHIFT RRSHIFT
在lex中写
"<<" { return LSHIFT; }
">>" { return RSHIFT; }
">>>" { return RRSHIFT; }
然后你可以写
CmpExpr:
rval LSHIFT rval { $$ = $1 << $3; }
| rval RSHIFT rval { $$ = $1 >> $3; }
| rval RRSHIFT rval { $$ = (unsigned)($1) >> ($3); }
我认为你可以写“&lt;&lt;”而不是LSHIFT,因为它编译,但我不知道它是否运行不同
答案 1 :(得分:1)
在bison中的引号之间只能有一个字符 - 任何多字符标记必须由词法分析器识别并作为单个标记返回,如acidzombie所述
当你在bison中引用多个字符时(正如你所做的那样),它基本上只会忽略除第一个之外的所有字符,这意味着'&gt;&gt;'和'&gt;&gt;&gt;'是真的相同的标记(与'&gt;'相同),给出你看到的错误。这不是非常有用的行为,但是继承自原始的yacc程序。