我的.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美元是一个int,我怎么把它变成一个字符串?
例如:“Sphere(worldGlobe)。”我希望$ 2在这里有字符串值worldGlobe。
感谢您的帮助
答案 0 :(得分:7)
在没有%union
声明的情况下,bison将YYSTYPE
定义为int,所以所有的
符号值是整数。
事实上,你有一些解决这个问题的方法:
1)yylval | union解决方案(推荐):
您可能知道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令牌的值,因为它是下一个令牌。