2009-11-16 11 views
2

Voici ma règle, quand je remplace $ 2 avec '=' mon code fonctionne. Je sais par défaut que tous les jetons littéraux utilisent leur valeur ASCII (d'où la raison pour laquelle un jeton multi-caractères nécessite une définition)Bison/Yacc, rendre le jeton littéral retourne sa propre valeur?

Le code ci-dessous ne fonctionne pas. La fonction est appelée avec 0 au lieu de '=' comme je l'espère. Y at-il une option que je peux définir? (Il ne semble pas via les pages de manuel)

AssignExpr: var '=' rval   { $$ = func($1, $2, $3); } 

Dans un autre morceau de code que j'ai MathOp: '=' | '+' | '%' ... donc pourquoi je suis intéressé.

Répondre

3

La valeur de 2 $ dans ce contexte sera tout la fonction yylex placée dans la variable globale yylval avant de renvoyer le jeton '='. Si le lexer ne place rien dans yylval, il sera probablement toujours 0, comme vous le voyez.

2

Je pense que vous avez raison, Bison ne fonctionne pas comme ça.

Vous pouvez facilement le fixer, bien sûr:

  • déclare juste un jeton pour =, reconnaître dans votre lexer et retourner sa valeur sémantique, ou ...
  • Déclarez une production pour elle et le retourner avec $$ ou ...
  • assign '=' à yylval dans yylex()