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 是指向语句指针列表的指针。它必须是一个指向列表的指针,因为 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)下一个指向不存在语句的位置,从而给出分段错误。语句评估中的任何内容都不会操纵列表。

一些洞察力会很棒。谢谢!

4

1 回答 1

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

您没有初始化该指针。编译器真的应该警告你。您是否启用了所有可用的编译器警告?

于 2013-10-31T03:37:30.570 回答