c - 如何在 flex 和 bison 中获取 token 的字符串值?

标签 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", 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/

相关文章:

c - 十六进制代码差异

c - 使用 strcpy() 时,目标字符串是否需要比源字符串大 1 个元素?

C、Flex 和 Bison : error: conflicting types for ‘yyerror’

vhdl - Lex VHDL '(勾号) token

c - 在不求助于 GLR-Parser 的情况下解决模棱两可的语法

regex - 文本消息与数千个正则表达式的高效匹配

c - 使用c编程的顺序文件访问

java - C 到 Java(二进制数编程)

c++ - Bison 可以解析 UTF-8 字符吗?

grammar - Bison 语法中的歧义