bison返回的语义值出错

时间:2014-08-13 17:01:47

标签: return-value bison semantics

我的野牛语法的一部分如图所示

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,......的值...为什么会这样。

1 个答案:

答案 0 :(得分:0)

问题可能在你的词法分析器中 - 你可能有类似yylval.str = yytext;之类的词法分析器动作来返回语义值。问题是yytext是指向扫描程序读取缓冲区的指针,仅在下一次调用yylex之前有效。因此,解析器中的所有语义值都会迅速成为悬空指针,并且它们指向的内容不再有效。

您需要在词法分析器中复制令牌字符串。使用像yylval.str = strdup(yytext);这样的操作。当然,您的解析器中存在潜在的内存泄漏问题 - 您需要free您不再需要的$ n值。