Bison堆栈值($n)被覆盖(使用C)

Bison堆栈值($n)被覆盖(使用C),c,char,bison,C,Char,Bison,我在Bison中编写了一个解析器,在表达式上的行为如下: expr: integer{ exprPass pass; sprintf(s, load instructions, $1); //s is a global char buffer pass.s= s; pass.type = int; $$ = pass; } | double{ exprPass pass; sprintf(s, loa

我在Bison中编写了一个解析器,在表达式上的行为如下:

expr: 
   integer{
     exprPass pass;
     sprintf(s, load instructions, $1); //s is a global char buffer
     pass.s= s;
     pass.type = int;
     $$ = pass;
   }
   |
   double{
     exprPass pass;
     sprintf(s, load instructions, $1); //s is a global char buffer
     pass.s= s;
     pass.type = int;
     $$ = pass;
   }
   (etc)
这很好,直到我运行它通过类似

comparison: expression LESSTHAN expression
当我打印$1.s时,它与#3.s相同

$2有正确的操作员,没有问题


我知道表达是可行的;当在词法分析器中分配了
exprPass
时(或为Bison做准备的任何东西),是否将
s
设置为指向词法分析器中包含识别字符串的缓冲区?如果是这样,那么发生的是:

  • 识别第一个表达式,并将
    exprPass
    设置为指向该表达式
  • 词法分析器重用缓冲区继续识别字符串
  • 现在,第一个
    exprPass
    指向不再包含原始字符串的缓冲区
  • 当解析器有两个表达式时,它们都指向相同的缓冲区,因此它们包含相同的字符串

若要解决此问题,必须在第一次识别每个字符串时复制该字符串(或保留其值),并且在不再需要该字符串时必须释放该副本的内存。根据您的需要,当词法分析器识别到字符串时,将其转换为数字可能会更容易,并将数字存储在
exprPass
中。然后,您只有一个值的副本,不必处理复制字符串和管理内存分配。

当在词法分析器中分配
exprPass
时(或为Bison准备的任何其他内容),
s
是否设置为指向词法分析器中包含识别字符串的缓冲区?如果是这样,那么发生的是:

  • 识别第一个表达式,并将
    exprPass
    设置为指向该表达式
  • 词法分析器重用缓冲区继续识别字符串
  • 现在,第一个
    exprPass
    指向不再包含原始字符串的缓冲区
  • 当解析器有两个表达式时,它们都指向相同的缓冲区,因此它们包含相同的字符串

若要解决此问题,必须在第一次识别每个字符串时复制该字符串(或保留其值),并且在不再需要该字符串时必须释放该副本的内存。根据您的需要,当词法分析器识别到字符串时,将其转换为数字可能会更容易,并将数字存储在
exprPass
中。这样,您就只有一个值的副本,而不必处理复制字符串和管理内存分配的问题。

非常感谢您,这就解决了这个问题!非常感谢你,这就解决了它!
typedef exprPass{
   char* s;
   variable_type type;
   //some other data
}