0

私は bison/flex で言語のパーサーをまとめており、抽象構文ツリーを実装しています。ただし、非常に原始的な静的型チェックを実装するとすぐに、ステートメント リストを反復処理しているリスト イテレータでセグメンテーション違反が発生し始めました。

リスト反復子を保持するルート プログラム ノード:

program::program(list<statement *> *stmtList) : stmts(stmtList) {}

void program::evaluate() {
   list<statement *>::iterator stmtIter;
   for (stmtIter = stmts->begin(); stmtIter != stmts->end();
      stmtIter++) {
     (*stmtIter)->evaluate();
  }
}

stmtList は、ステートメントへのポインターのリストへのポインターです。バイソンはコンストラクターを必要とする型を受け入れないため、リストへのポインターである必要があります。%union

失敗しているステートメント ノードの例は次のとおりです。

void declare_assign_stmt::evaluate() 
{
    reference * ref;
    ref->type = type;

    if(ref->type != exp->type)
    {
        cerr << "Incompatible types!" << endl;
    }
    else {
        ref->location = exp->evaluate();;
        idTable[id] = ref;
    };

}

referenceは 2 つのフィールドを持つ構造体で、typeそれぞれlocation文字列と int です。idTable は、参照ポインタへの id のマップです。exp私の式ノードへのポインターであり、正しく評価され、int を返します。私はこの関数をステップ実行し、すべてが期待どおりに動作しますが、完了evaluate()すると反復ループに戻り、リストに要素が含まれていない場合でも、ループは続行(*stmtIter)され、次にステートメントが存在しない場所を指します、したがって、セグメンテーション違反を引き起こします。ステートメント評価内では、リストを操作するものは何もありません。

いくつかの洞察は素晴らしいでしょう。ありがとう!

4

1 に答える 1

2
reference * ref;
ref->type = type;

そのポインタを初期化しませんでした。コンパイラはそれについて本当に警告するはずです。利用可能なすべてのコンパイラ警告を有効にしましたか?

于 2013-10-31T03:37:30.570 に答える