Bisonのエラー処理に問題があります。私は次の文法を持っています(私は関連する部分だけを切り取っています)。FlexはトークンをBisonに送信し、文字列「ConfigParam」が解析されると終端記号「KW_CONFIGPARAM」を返します。IDENTは、C++文字列オブジェクトへのポインタです。
statementlist : statement ';' { $$ = new string("statementlist"); }
| statementlist statement ';' { $$ = new string("statementlist"); }
;
statement : KW_CONFIGPARAM IDENT { $$ = new string("statement"); /* use $2, IDENT is used in main program */ }
;
IDENTのような文字列に次のデストラクタを指定しています。
%destructor {printf( "行%dでフリー:%s \ n"、@ $。first_line、$$-> c_str()); delete($$); }
今、私は次の入力を持っています。最初の行は有効ですが、2番目の行は無効です(識別子がありません):
ConfigParam p;
ConfigParam;
出力:
In input 2:12 - 2:12 : syntax error
free at line 2: p
free at line 1: statementlist
2行目のエラーのため、Bisonは文句を言い、構文エラーを返し、解析スタック上のすべてのオブジェクトのデストラクタを呼び出します。最初の行の識別子「p」のデストラクタが呼び出される理由がわかりません。これは最初の行に属し、正常に解析されました。問題は、pがメインプログラムで使用されており、Bisonによって削除されるべきではないということです。
(無効な)ステートメントとして選択した場合、任意の文字列( "foo")pはBisonによって削除されません。
ConfigParam p;
foo;
In input 2:1 - 2:3 : syntax error
free at line 1: statementlist
free at line 2: foo
なぜこれが機能するのですか?