私は、パーサーが 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 のスタックをループして、そこに置いたポインターを解放するにはどうすればよいですか?