49 lines
1.5 KiB
C++
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
|