我的 .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|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中规则后的回调,个人更喜欢使用函数。不是你做的整个代码:)
这个解决方案非常简单。
句子:"Sphere("{callback_your_function(yytext);} ALPHANUM ")。"
此处的 yytext 将具有您的 ALPHANUM token 的值,因为它是下一个 token 。
关于c - 如何在 flex 和 bison 中获取 token 的字符串值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8632516/