私は簡略化されたパスカルパーサー/インタープリタを書いています。今はセグメンテーションフォールトについて考えています。私はまだそれらを取得していない、すべてうまく動作しているが、私はCygwinの下で開発しているので、私はvalgrindを介してプログラムをテストすることはできません。基本的に私がやっていることは、以下に説明されてトークンセマンティック値(シンボルレコード)を正しく破棄し、GNU Bisonを使用してメモリリークを回避する方法は?
:もちろん
typedef struct{
char idType; //Integer (i), Real (r), Char (c), String (s) or Function (f)
union{
int intValue;
double fltValue;
char chrValue;
char *strValue;
}idValue;
}symrec;
.
.
.
%union{
symrec *symbol;
}
.
.
.
%destructor {
if($$->idType == 's'){
free($$->idValue.strValue);
}
free($$);
} tIdentifier tLiteralString tLiteralChar tLiteralInteger tLiteralReal
は、トークンが正しく、すべて型付けされています。問題は、例えば、ある表現を否定するときです。私は通常mallocの代わりにsymrec *を再利用します。
例:もちろん
pArithmetic: tMinus pExpression { $$ = -$2; }
、これは(例では、私はちょうどint型と見なさやデータ型などの二重)、私はきちんと* symrecを解析するが、これによ、私のコンテキストでは有効ではありませんシナリオでは、デストラクタdealloc $ 2を$$を何らかのぶら下がりポインタとして残しませんか?
これを書いているうちに、これが本当に起こっていくつかのセグメンテーションを取得したら、私は$ 2 = NULLにしてもいいと思っています。 %destructor {}節でそれをチェックしますか?
PS:私は英語のネイティブスピーカーではありません。私はこれをかなり長くしています。だから私はすぐに解説してくれる混乱したアイデアをあなたの恩赦に頼んでいます。
なぜ%destructorがバイソンに導入されたのですか? –
申し訳ありませんが、正確にあなたに伝えることはできません。この質問は、数か月前に私がコンパイラクラスの宿題を作成したときに現れました。そして、そのデストラクタが新しい構文であることに気づいていませんでした。 – Spidey