我正在为 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 是指向语句指针列表的指针。它必须是一个指向列表的指针,因为 bison 可以容纳 bison 不接受需要构造函数的类型%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)
下一个指向不存在语句的位置,从而给出分段错误。语句评估中的任何内容都不会操纵列表。
一些洞察力会很棒。谢谢!