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 の引用符の間には 1 文字しか使用できません。acidzombie で説明されているように、複数文字のトークンはレクサーによってそのように認識され、単一のトークンとして返される必要があります。

バイソンで複数の文字を引用符で囲むと(行ったように)、基本的に最初の文字以外はすべて無視されます。つまり、「>>」と「>>>」は実際には同じトークンです(「>」と同じ) )、表示されるエラーを示します。これはあまり便利な動作ではありませんが、元の yacc プログラムから継承されたものです。

于 2009-10-06T19:01:06.263 に答える
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の代わりに「<<」と書くことができると思いますが、動作が異なるかどうかはわかりません

于 2009-10-04T03:35:54.157 に答える