Bison堆栈值($n)被覆盖(使用C)
我在Bison中编写了一个解析器,在表达式上的行为如下: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
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
}