2009-07-08 6 views
2

私は簡略化されたパスカルパーサー/インタープリタを書いています。今はセグメンテーションフォールトについて考えています。私はまだそれらを取得していない、すべてうまく動作しているが、私は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:私は英語のネイティブスピーカーではありません。私はこれをかなり長くしています。だから私はすぐに解説してくれる混乱したアイデアをあなたの恩赦に頼んでいます。

+0

なぜ%destructorがバイソンに導入されたのですか? –

+0

申し訳ありませんが、正確にあなたに伝えることはできません。この質問は、数か月前に私がコンパイラクラスの宿題を作成したときに現れました。そして、そのデストラクタが新しい構文であることに気づいていませんでした。 – Spidey

答えて

1

いいえ、%destructorは、パーサーがエラー回復の一環としてシンボルを捨てている場合にのみ呼び出されます。

ルールが一致する場合、シンボルの所有権は通常$$に転送するか、ルール内で破棄する必要があります。だからあなたの単項マイナスの例は、ぶら下がっているポインタがありません。

segfaultを見つけるには、コードをgdbの下で実行することをおすすめします。

+0

私はどの時点で正確にわからないが、セグメンテーションがなくなった! したがって、%destructorsには、通常の破壊と同じ一般的なルールを使用できますが、エラー回復システムによって呼び出される点が異なります。説明をありがとうございます。 – Spidey

関連する問題