3

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

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();泄漏。有没有一种方法可以设置一个析构函数,当它从堆栈中弹出时?

4

1 回答 1

2

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

%destructor { LinkedList_Del($$); } column_expression

祝你好运!

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

于 2013-02-06T14:36:07.757 回答