4

我想我的问题真的很简单,但我现在尝试修复它几个小时,但我似乎没有得到它。我有一个 ast 树(使用 boost-library 创建)并通过递归对其进行迭代。我将所有节点保存在 NodeDescriptions 列表中,其中包含实际节点的编号、实际节点的名称以及作为实际节点的父节点的节点。但是,我的父节点总是编号错误。我想我的变量范围做错了,以错误的方式传递它,或者类似的事情。如果有人可以帮助我,我会很高兴:

void convert_to_parsetree(BOOST_SPIRIT_NAMESPACE::tree_match<iterator_t>::const_tree_iterator parse_node, int calNode) {
   int remNum = calNode;
   std::string node_value(parse_node->value.begin(), parse_node->value.end());
   //First Element: Node-Counter, Second Element, Name of Node, Third Element: Parent Node Number
   myList.push_back(NodeDescription(counter++, node_value, remNum));

   if (parse_node->children.size() > 0) {

        if (parse_node->children.size() > 1) {
            //std::string value(parse_node->children[0].value.begin(), parse_node->children[0].value.end());
            //std::string value2(parse_node->children[1].value.begin(), parse_node->children[1].value.end());

            BOOST_SPIRIT_NAMESPACE::tree_match<iterator_t>::const_tree_iterator children_it = parse_node->children.begin();
            for (int i = 0; i < parse_node->children.size(); ++i) {
                convert_to_parsetree(children_it, counter);
                children_it++;
            }
        } else {
            convert_to_parsetree(parse_node->children.begin(), counter);
        }
    }
}

很简单,但不知何故它不起作用。预先感谢和亲切的问候。

4

1 回答 1

2

问题是在您的递归调用中,您将全局变量中的值counter作为第二个参数传递。但是,您的递归函数使用第二个参数作为“父节点号”(因为它保存在 中remNum),并且全局counter递增。这意味着for使用递归调用遍历子级的循环将counter在每次迭代中传递不同的值,即使每个递归调用都应该来自同一个“父级”。

当前的递归级别应该counter在递增之前将当前值记住为其节点号,并且这个记住的值应该传递到循环的每次迭代中for

在下面的代码的固定版本中,我简化了您的功能以提高可读性。

typedef BOOST_SPIRIT_NAMESPACE::tree_match<iterator_t>::const_tree_iterator
   MyTreeIterator;

void convert_to_parsetree (MyTreeIterator parse_node, int parent_number) {
   int node_number = counter++;
   std::string node_name(parse_node->value.begin(), parse_node->value.end());
   myList.push_back(NodeDescription(node_number, node_name, parent_number));
   for (MyTreeIterator children_it = parse_node->children.begin();
        children_it != parse_node->children.end();
        ++children_it) {
      convert_to_parsetree(children_it, node_number);
   }
}
于 2013-09-20T20:44:52.090 回答