【问题标题】:Error in the semantic values returned by bison野牛返回的语义值错误
【发布时间】:2023-08-17 21:52:01
【问题描述】:

我的bison语法的一部分如图

head: OPEN statement CLOSE 
    {
       $$=$2;
    }
     ;
statement: word
    {
         $$=$1;
     }
    | statement word
     {
         $$=$1;
          printf("%s",$$);
     }
   ;

现在,如果我的输入是 [hai hello] 其中 [ 是 OPEN & ] 分别是 CLOSE,那么在 printf 语句中我得到的输出是“hai hello”本身..但是在 $$ 的 head 我得到“喂喂]”。其他语法也会发生同样的情况。即,如果我尝试打印 $1 的值,也会打印 $2,$3,... 的值。为什么会这样。

【问题讨论】:

    标签: return-value bison semantics


    【解决方案1】:

    问题可能出在您的词法分析器中——您可能有一些词法分析器操作,它们执行yylval.str = yytext; 之类的操作以返回语义值。问题是yytext 是指向扫描器读取缓冲区的指针,并且仅在下一次调用yylex 之前有效。因此,解析器中的所有语义值很快就变成了悬空指针,它们指向的内容不再有效。

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

    【讨论】:

    • 如果我们不修复语法中的移位/减少冲突,真的有什么问题吗?
    • @ANU:我不明白你的问题——你发布的语法没有冲突,即使有,这完全独立于正确分配语义值的问题,以便避免悬空指针。
    • @ANU:那你应该问另一个问题。通常,语法冲突意味着 bison 构建了一个解析器来解析语言的子集。这可能没问题,也可能是个问题——您需要了解发生的具体冲突以及默认解决冲突的结果。
    • kk。谢谢你。我已经发布了另一个问题以供怀疑。希望你也能帮助我解决这个问题。