Как получить строковое значение токена в flex и bison? - PullRequest
4 голосов
/ 26 декабря 2011

У меня есть этот токен в моем файле .lex:

[a-zA-Z0-9]+    { yylval = yytext; return ALPHANUM; }

и этот код в моем .y файле:

Sentence: "Sphere(" ALPHANUM ")."
{
FILE* file = fopen("C:/test.txt", "a+");
char st1[] = "polySphere -name ";
strcat(st1, $2);
strcat(st1, ";");
fprintf(file,"%s", st1);
fclose(file);
}

Я получаю эту ошибку при попытке скомпилировать:

предупреждение: передача аргумента 2 из strcat делает указатель из целого числа без приведения

Итак, $ 2 - это int, как мне сделать его строкой?

Например: «Сфера (worldGlobe)». Я хочу, чтобы $ 2 имел строковое значение worldGlobe здесь.

Спасибо за любую помощь

1 Ответ

7 голосов
/ 26 декабря 2011

В отсутствие объявления %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потому что это следующий токен.

...