我用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
中时,将字符串转换为数字更容易。然后,您只有值的副本,不必处理复制字符串和管理内存分配。