我正在为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)
接下来将指向不存在语句的位置,从而给出分段错误。报表评估中的任何内容都不会操纵列表。
一些见解会很棒。谢谢!
答案 0 :(得分:2)
reference * ref;
ref->type = type;
您没有初始化该指针。编译器应该真的警告你。您是否启用了所有可用的编译器警告?