我的 lex 文件中有以下定义:
L [a-zA-Z_]
A [a-zA-Z_0-9]
%%
{L}{A}* { yylval.id = yytext; return IDENTIFIER; }
我在 YACC 文件中执行以下操作:
primary_expression
: IDENTIFIER { puts("IDENTIFIER: "); printf("%s", $1); }
我的源代码(我正在分析的源代码)具有以下分配:
ab= 10;
由于某种原因,那printf("%s", $1);
部分正在打印ab=
而且不仅是ab
.
我很确定那是正在打印的部分ab=
因为当我删除printf("%s", $1);
标识符根本不被打印。
我真的没有主意了。我究竟做错了什么?
让我知道是否可以说得更清楚。
我究竟做错了什么?
您假设该字符串指向yytext
是恒定的。它不是。
指向的字符串的生命周期yytext
是关联规则的词汇动作。如果这条规则最终回归,yytext
将存活到下一次yylex
叫做。就是这样。
bison
- 生成的解析器具有单符号前瞻功能。因此,当解析器执行语义操作时,yylex
已被再次调用(用于前瞻);因此,您不能使用保存的值yytext
即使对于规则中的最后一个(或唯一的)标记也是如此。
解决办法:复制字符串。 (我用strdup
,但无论出于何种原因,有些人喜欢 malloc 和 strcpy。如果这样做,请不要忘记 NUL 终止符。)并记住free()
当你完成它时,复制它。
以供参考:Flex 手册所说的内容。 http://westes.github.io/flex/manual/A-Note-About-yytext-And-Memory.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)