2009-10-04 7 views

Répondre

2
%TOKEN LSHIFT RSHIFT RRSHIFT 

en écriture lex

"<<"  { return LSHIFT; } 
">>"  { return RSHIFT; } 
">>>"  { return RRSHIFT; } 

alors vous pouvez écrire

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

Je pense que vous pouvez écrire "< <" au lieu de LSHIFT car il compile, mais je ne sais pas si elle s'exécute différemment

+0

Oui, vous pouvez utiliser "<<" dans le fichier de grammaire, c'est exactement pareil. – akim

+1

L'utilisation de '" << "' génère un jeton unique pour le décalage, mais il ne génère pas de définition pour ce jeton dans le fichier '.tab.h', il n'y a donc aucun moyen facile de produire ce jeton dans votre lexeur. –

1

Vous ne pouvez avoir qu'un seul caractère entre les guillemets i n bison - tout jeton de plusieurs caractères doit être reconnu par le lexeur comme tel et retourné comme un seul jeton, comme décrit par acidzombie

Lorsque vous mettez plusieurs caractères entre guillemets dans bison (comme vous l'avez fait), il est essentiellement juste ignore tout sauf le premier, ce qui signifie que '>>' et '>>>' sont vraiment le même jeton (le même que '>'), donnant l'erreur que vous voyez. Ce comportement n'est pas très utile, mais il a été hérité du programme yacc original.

+0

Je ne sais pas si vous remarquez que j'ai demandé et répondu à cette question;) –

Questions connexes