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
是一個具有兩個字段的結構,分別爲type
和location
,一個字符串和int。 idTable是引用指針的id的映射。 exp
是一個指向我的表達式節點的指針,它正確計算並返回一個int。我已經完成了這個功能,一切都按照預期運行,但是在完成evaluate()
後,它將返回到迭代循環,即使列表中沒有更多元素,循環將繼續,並且(*stmtIter)
將指向一個位置,聲明存在,從而導致分段錯誤。報表評估中沒有任何內容操縱該列表。
一些洞察力會很好。謝謝!
我編輯澄清引用是一個結構。我不確定需要什麼樣的初始化,但是在gdb中逐步完成它,結構被創建並且值被適當地設置。 –
'ref'只是一個指向'struct reference'的指針。最初它指向任何地方,可能在當前堆棧指針附近的某個位置。 –
確實解決了它!謝謝。然而,我不知道爲什麼分段錯誤會出現在迭代器上,爲什麼它會按照我在這種情況下觀察到的方式行事。 –