2013-02-06 48 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