我正在编写一个简化的 Pascal 解析器/解释器,现在我正在考虑分段错误。我还没有得到它们,一切都运行良好,但由于我是在 Cygwin 下开发的,所以我无法通过 valgrind 测试程序。
基本上我在做什么如下所述:
typedef struct{
char idType; //Integer (i), Real (r), Char (c), String (s) or Function (f)
union{
int intValue;
double fltValue;
char chrValue;
char *strValue;
}idValue;
}symrec;
.
.
.
%union{
symrec *symbol;
}
.
.
.
%destructor {
if($$->idType == 's'){
free($$->idValue.strValue);
}
free($$);
} tIdentifier tLiteralString tLiteralChar tLiteralInteger tLiteralReal
当然,令牌输入正确和一切。例如,问题是在否定某些表达式时。我通常重用一些 symrec * 而不是 malloc 一个新的。
例子:
pArithmetic: tMinus pExpression { $$ = -$2; }
当然,这在我的上下文中是无效的(在示例中,我只是将 int 或 double 作为数据类型),我正在正确解析 symrec *,但在这种情况下,析构函数 dealloc $2 不会留下 $$ 为某种悬空指针?
在写这篇文章时,我在想,如果这真的发生并且给我带来了一些段错误,我可以让 $2 = NULL; 并在 %destructor{} 子句中检查?
PS:我不是以英语为母语的人,而且我已经写了很长时间,所以对于任何混淆的想法,请见谅,我会及时重新解释。