2013-10-31 44 views
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是一個具有兩個字段的結構,分別爲typelocation,一個字符串和int。 idTable是引用指針的id的映射。 exp是一個指向我的表達式節點的指針,它正確計算並返回一個int。我已經完成了這個功能,一切都按照預期運行,但是在完成evaluate()後,它將返回到迭代循環,即使列表中沒有更多元素,循環將繼續,並且(*stmtIter)將指向一個位置,聲明存在,從而導致分段錯誤。報表評估中沒有任何內容操縱該列表。

一些洞察力會很好。謝謝!

回答

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

您沒有初始化該指針。編譯器應該真的提醒你。你是否啓用了所有可用的編譯器警告?

+0

我編輯澄清引用是一個結構。我不確定需要什麼樣的初始化,但是在gdb中逐步完成它,結構被創建並且值被適當地設置。 –

+0

'ref'只是一個指向'struct reference'的指針。最初它指向任何地方,可能在當前堆棧指針附近的某個位置。 –

+0

確實解決了它!謝謝。然而,我不知道爲什麼分段錯誤會出現在迭代器上,爲什麼它會按照我在這種情況下觀察到的方式行事。 –