yacc / bison令牌错误。 '>>>'和'>>'两者都分配了62号

时间:2009-10-04 01:02:53

标签: bison

我在我的代码中做了类似的事情

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

我得到的警告是

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

如何让它使用不同的令牌?

2 个答案:

答案 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程序。