在 AbstractParseTreeVisitor.h 中,我在以下部分(第 35-48 行)中为
shouldVisitNextChild(node, result))
苦苦挣扎:
virtual std::any visitChildren(ParseTree *node) override {
std::any result = defaultResult();
size_t n = node->children.size();
for (size_t i = 0; i < n; i++) {
if (!shouldVisitNextChild(node, result)) {
break;
}
std::any childResult = node->children[i]->accept(this);
result = aggregateResult(std::move(result), std::move(childResult));
}
return result;
}
虽然此函数是在子级循环中调用的,但它始终测试父级。该函数可以做的唯一验证是检查
result
。这就是它的用意吗?
我早就预料到了
if (!shouldVisitNextChild(node->children[i], result)) {
break;
}
这将允许看到聚焦的节点。
代码很好:)
shouldVisitNextChild
第一个参数是存储子节点的父节点,第二个参数是结果,其中函数正在跟踪当前状态。
您可以覆盖此功能。默认实现始终返回 true,表示访问Children 仅应在所有子项都被访问后才返回。覆盖此方法的一个原因是为访问单个子项的结果有可能确定整个访问操作的结果的情况提供“短路”评估选项。