llvm-project/clang-tools-extra/pseudo/lib/Disambiguate.cpp

49 lines
1.5 KiB
C++

//===--- Disambiguate.cpp - Find the best tree in the forest --------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "clang-pseudo/Disambiguate.h"
namespace clang::pseudo {
Disambiguation disambiguate(const ForestNode *Root,
const DisambiguateParams &Params) {
// FIXME: this is a dummy placeholder strategy, implement a real one!
Disambiguation Result;
for (const ForestNode &N : Root->descendants()) {
if (N.kind() == ForestNode::Ambiguous)
Result.try_emplace(&N, 1);
}
return Result;
}
void removeAmbiguities(ForestNode *&Root, const Disambiguation &D) {
std::vector<ForestNode **> Queue = {&Root};
while (!Queue.empty()) {
ForestNode **Next = Queue.back();
Queue.pop_back();
switch ((*Next)->kind()) {
case ForestNode::Sequence:
for (ForestNode *&Child : (*Next)->elements())
Queue.push_back(&Child);
break;
case ForestNode::Ambiguous: {
assert(D.count(*Next) != 0 && "disambiguation is incomplete!");
ForestNode *ChosenChild = (*Next)->alternatives()[D.lookup(*Next)];
*Next = ChosenChild;
Queue.push_back(Next);
break;
}
case ForestNode::Terminal:
case ForestNode::Opaque:
break;
}
}
}
} // namespace clang::pseudo