1

我在我的代码中做了这样的事情

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

我得到的警告是

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

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

4

2 回答 2

3

bison 中的引号之间只能有一个字符——任何多字符标记都必须被词法分析器识别并作为单个标记返回,如 acidzombie 所述

当您在野牛中将多个字符放在引号中时(就像您所做的那样),它实际上只是忽略了除第一个之外的所有字符,这意味着 '>>' 和 '>>>' 实际上是相同的标记(与 '>' 相同),给出你看到的错误。这不是非常有用的行为,而是继承自原始的 yacc 程序。

于 2009-10-06T19:01:06.263 回答
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); }

我认为您可以编写“<<”而不是 LSHIFT,因为它可以编译,但我不知道它的运行方式是否不同

于 2009-10-04T03:35:54.157 回答