我用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美元时,它和3美元是一样的!
$2有正确的接线员,没有问题
我知道expression工作正常;使用printfs在2我的表达式结构是
typedef exprPass{
   char* s;
   variable_type type;
   //some other data
}

最佳答案

当在词法分析器中分配了exprPass(或者为BISY准备其他东西)时,s设置指向指向包含识别字符串的词法分析器中的缓冲区吗?如果是这样,那么发生的是:
将识别第一个表达式,并将exprPass设置为指向该表达式。
词法分析器重用缓冲器来继续识别字符串。
现在第一个exprPass指向不再包含原始字符串的缓冲区。
当解析器有两个表达式时,它们指向同一个缓冲区,因此它们包含相同的字符串。
若要解决此问题,必须在首次识别每个字符串时对其进行复制(或保留其值),并且必须在不再需要该字符串时释放该副本的内存。根据您的需要,当词法分析器识别并将该数字存储在exprPass中时,将字符串转换为数字更容易。然后,您只有值的副本,不必处理复制字符串和管理内存分配。

09-06 14:40