Flex / Bison:错误恢复析构函数?

时间:2013-02-06 13:54:50

标签: c bison flex-lexer

对于包含至少一个项目的逗号分隔列表,我有以下语法:

column_expression_list:
    column_expression {
        $$ = LinkedList_New();
        LinkedListItem *item = LinkedListItem_New($1);
        LinkedList_add($$, item);
    }
    |
    column_expression_list T_COMMA column_expression {
        LinkedListItem *item = LinkedListItem_New($3);
        LinkedList_add($1, item);
    }
;

但请考虑一下:

column_expression error

$$ = LinkedList_New();会泄漏。有没有办法可以在弹出堆栈时设置析构函数?

1 个答案:

答案 0 :(得分:1)

假设您使用名为“LinkedList_Del”的函数销毁其中包含所有项目的列表,请使用Bison的%destructor指令,该指令专门用于清除由于错误而最终未使用的已分配元素:

%destructor { LinkedList_Del($$); } column_expression
祝你好运!

参考: http://www.gnu.org/software/bison/manual/bison.html#Destructor-Decl