C 如何在flex和bison中获取令牌的字符串值?

C 如何在flex和bison中获取令牌的字符串值?,c,bison,flex-lexer,C,Bison,Flex Lexer,我的.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", s

我的.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);
}
我在尝试编译时遇到以下错误:

警告:传递'strcat'的参数2会使指针从整数变为不带强制转换的整数

那么$2是一个整数,我怎么把它变成一个字符串呢

例如:“Sphere(worldGlobe)。”我希望$2的字符串值为worldGlobe


感谢您的帮助

在缺少
%union
声明的情况下,bison将
YYSTYPE
定义为int,因此所有 符号值是整数。 事实上,您有一些解决此问题的方法:

1)yylval联合解决方案(推荐):
正如您所知,yylval是lexer用于存储yytext变量(
yylval=yytext;
)的全局变量,因此您应该告诉lexer要存储哪些类型。您只需将此行添加到YACC语法的标题中:

#define YYSTYPE char *
这里只存储字符串值

顺便说一下,如果要存储不同的类型,应在yacc文件中指定:

%union {
    char *a;
    double d;
    int fn;
}
那么在你的莱克斯里你就有了

[a-zA-Z0-9]+    { **yylval.a** = yytext; return ALPHANUM; }
2)使用yytext:

建议:对于yacc i中规则之后的回调,个人更喜欢使用函数。不是像您这样完整的代码:)

这个解决方案非常简单。
语句:“球体({callback\u your_函数(yytext)}ALPHANUM”)”


此处的yytext将具有ALPHANUM标记的值,因为它是下一个标记

您能否显示.y文件中的联合声明和.y文件中的ALPHANUM标记声明?假设您有多个yylval类型。如果返回的都是char*,那么在.y文件的序言部分应该有
#define YYSTYPE char*
。我会小心地将原始yytext指针插入yylval。下次执行某些操作时,缓冲区将被覆盖。如果您有一个解析器将几个这样的令牌收集到一个规则中,同时使用$1、$2引用它们,那么这不是一种合适的方法。如果只是在循环中调用yylex()并逐个处理令牌,这可能没什么问题。