2013-02-06 30 views
3

我有一个逗号分隔的列表下面的语法与至少一个项目:Flex/Bison:错误恢复析构函数?

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

+0

由于这无关瓦特/ UI框架的Flex我删除标记,并添加GNU-FLEX [对于词法分析器] – JeffryHouser

回答

1

假如你摧毁使用一个名为“LinkedList_Del”功能中的所有项目的列表,使用的是特别提出清理这最终不是因为错误的使用分配元素野牛的%析构函数指令:

%destructor { LinkedList_Del($$); } column_expression 

祝你好运!

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

+0

我发誓,我一个刚语法错误之前试过这种。有趣的是,当我使用'column_expression'时,它没有什么区别 - 但是如果我使用'column_expression_list',它可以很好地工作。非常感谢! –

+1

哦,是的,你是对的,它是'column_expression_list',因为bison采用可以形成的最高级别的实体,在这种情况下'column_expression'在'column_expression_list'中有意义,所以这个值被传递到'column_expression_list'应该被丢弃,因为不适合更高级的类型 – RumburaK