我的野牛语法的一部分如图所示
head: OPEN statement CLOSE
{
$$=$2;
}
;
statement: word
{
$$=$1;
}
| statement word
{
$$=$1;
printf("%s",$$);
}
;
现在,如果我的输入是[hai hello],那么[是OPEN& ]分别是CLOSE,然后在printf语句中我得到输出为“hai hello”本身..但是在头部的$$中我得到“hai hello]”。其他语法也是如此。即,如果我尝试打印$ 1的valye,则还会打印$ 2,$ 3,......的值...为什么会这样。
答案 0 :(得分:0)
问题可能在你的词法分析器中 - 你可能有类似yylval.str = yytext;
之类的词法分析器动作来返回语义值。问题是yytext
是指向扫描程序读取缓冲区的指针,仅在下一次调用yylex
之前有效。因此,解析器中的所有语义值都会迅速成为悬空指针,并且它们指向的内容不再有效。
您需要在词法分析器中复制令牌字符串。使用像yylval.str = strdup(yytext);
这样的操作。当然,您的解析器中存在潜在的内存泄漏问题 - 您需要free
您不再需要的$ n值。