В отсутствие объявления %union
bison определяет YYSTYPE
как int, поэтому все значения символов являются целыми числами.На самом деле у вас есть несколько решений этой проблемы:
1) yylval | union solution (РЕКОМЕНДУЕТСЯ):
Как вы, возможно, знаете, yylval является глобальной переменной, используемой лексером дляхраните переменную yytext (yylval = yytext;
), чтобы вы указали своему лексеру, какие типы вы хотите сохранить. Вы можете просто добавить эту строку в заголовок вашей грамматики YACC:
#define YYSTYPE char *
вы будете хранить здесь только строкузначения.
Кстати, если вы хотите хранить разные типы, вы должны указать в своем файле yacc:
%union {
char *a;
double d;
int fn;
}
, тогда в вашем lex у вас будет
[a-zA-Z0-9]+ { **yylval.a** = yytext; return ALPHANUM; }
2) Использование yytext:
Совет: для обратных вызовов после правил в yacc i, лично я предпочитаю использовать функции.не весь код, как вы: :)
это решение действительно простое.
Sentence: "Sphere("{callback_your_function(yytext);} ALPHANUM ")."
yytext здесь будет иметь значение вашего токена ALPHANUMпотому что это следующий токен.