我想我的问题很简单,但我现在试着解决它几个小时,我似乎没有得到它.我有一个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);
}
}
}
很简单,但不知何故它不起作用.在此先感谢并亲切的问候.
最佳答案 问题是在递归调用中,您将全局变量计数器中的值作为第二个参数传递.但是,您的递归函数使用第二个参数作为“父节点编号”(因为它保存在remNum中),并且全局计数器会递增.这意味着使用递归调用迭代子节点的for循环将在每次迭代时传入不同的计数器值,即使每个递归调用应该来自相同的“父”.
当前的递归级别应该记住当前计数器值作为其递增之前的节点数,并且这个记住的值应该被传递到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);
}
}