私は 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)
され、次にステートメントが存在しない場所を指します、したがって、セグメンテーション違反を引き起こします。ステートメント評価内では、リストを操作するものは何もありません。
いくつかの洞察は素晴らしいでしょう。ありがとう!