2

我正在编写一个简化的 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:我不是以英语为母语的人,而且我已经写了很长时间,所以对于任何混淆的想法,请见谅,我会及时重新解释。

4

1 回答 1

1

不,%destructors 仅在解析器丢弃符号作为错误恢复的一部分时才被调用。

当规则匹配时,符号的所有权应该被转移,通常是转移到$$,或者在规则中销毁。因此,您的一元减号示例没有悬空指针。

要查找您的段错误,我建议您在gdb.

于 2009-07-08T10:24:51.670 回答