Bison / Yacc, сделать литеральный токен своим собственным значением? - PullRequest
2 голосов
/ 16 ноября 2009

Ниже мое правило, когда я заменяю $ 2 на '=', мой код работает. Я знаю, что по умолчанию все литеральные токены используют свои значения ascii (следовательно, для многосимвольных токенов требуется определение)

ниже не работает. Функция вызывается с 0 вместо '=', как я и ожидал. Есть ли вариант, который я могу установить? (Это не так на страницах руководства)

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

В другой части кода у меня есть MathOp: '=' | '+' | '%' ..., поэтому я и заинтересован.

Ответы [ 2 ]

3 голосов
/ 22 ноября 2009

Значение $ 2 в этом контексте будет равно значению функции yylex, введенной в глобальную переменную yylval, до того, как она вернула токен '='. Если лексер ничего не помещает в yylval, вероятно, он все равно будет равен 0, как вы видите.

2 голосов
/ 17 ноября 2009

Я думаю, что вы правы, Бизон просто так не работает.

Вы можете легко это исправить, конечно:

  • просто объявите токен для =, узнайте его в лексере и верните его семантическое значение или ...
  • объявить производство для него и вернуть его с $$ или ...
  • присваивать '=' yylval в yylex ()
...