我的 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);
时,不会打印标识符完全没有。
我真的没办法了。我究竟做错了什么?
让我知道是否可以更清楚。
最佳答案
What am I doing wrong?
您假设 yytext
指向的字符串是常量。它不是。
yytext
指向的字符串的生命周期是关联规则的词法 Action 。如果该规则最终返回,yytext
将继续存在,直到下一次调用 yylex
。就是这样。
bison
生成的解析器具有单符号前瞻性。因此,当解析器执行语义操作时,yylex
已被再次调用(用于先行);因此,即使是规则中的最后一个(或唯一一个)标记,您也不能使用 yytext
的保存值。
解决方法:复制字符串。 (我使用 strdup
,但出于某种原因有些人喜欢 malloc 和 strcpy。如果你这样做,请不要忘记 NUL 终止符。)并记住 free()
完成后的副本。
关于c - Lex 正则表达式获得了一些额外的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24398448/