1

私は、パーサーが Bison に実装されているスクリプト言語に取り組んでいます。文法について質問はありません。文法は完全に機能しており、言語は機能しますが、思い通りにエラーを処理しません。

問題は次のとおりです。パーサーを実装して、ルールが削減されるにつれて、スタック上に式ツリーを少しずつ構築するようにしました。スクリプト全体が読み込まれると、単一の式ツリーがスタックに残り、それを直接バイトコードに変換できるという考えです。その特定のルールの文法は次のようになります。

script: block { pp_write_block($1); pp_free_tree($1); fputc(CODEEND,ppbcout); YYACCEPT; } ;

ここでpp_free_tree($1)は、式ツリー全体を再帰的に解放します。エラーが発生するまでは、これで問題ありません。解析中に Bison が失敗した場合は、スタックにヒープに割り当てられた一連のツリーが残されます。

それで、私の質問はmalloc、Bison で解析エラーが発生した場合、スタック上にあるこれらの 'd ツリーを解放するにはどうすればよいですか? 本当に必要なのは、スタック内のpp_free_tree各ポインターを呼び出してスタックをループする方法だけです。しかし、どうやってそれを行うのかはわかりません。

tl,dr : Bison のスタックをループして、そこに置いたポインターを解放するにはどうすればよいですか?

4

1 に答える 1

1

%destructor ディレクティブを探しているようです。

http://www.gnu.org/software/bison/manual/html_node/Destructor-Decl.html

于 2013-03-13T08:39:25.130 に答える