brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.6 KiB · 62e2482 Raw
84 lines · cpp
1//===- DirectiveNameParser.cpp --------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "llvm/Frontend/OpenMP/DirectiveNameParser.h"10#include "llvm/ADT/Sequence.h"11#include "llvm/ADT/StringExtras.h"12#include "llvm/ADT/StringRef.h"13#include "llvm/Frontend/OpenMP/OMP.h"14 15#include <cassert>16#include <memory>17 18namespace llvm::omp {19DirectiveNameParser::DirectiveNameParser(SourceLanguage L) {20  // Take every directive, get its name in every version, break the name up21  // into whitespace-separated tokens, and insert each token.22  for (size_t I : llvm::seq<size_t>(Directive_enumSize)) {23    auto D = static_cast<Directive>(I);24    if (D == Directive::OMPD_unknown || !(getDirectiveLanguages(D) & L))25      continue;26    for (unsigned Ver : getOpenMPVersions())27      insertName(getOpenMPDirectiveName(D, Ver), D);28  }29}30 31const DirectiveNameParser::State *32DirectiveNameParser::consume(const State *Current, StringRef Tok) const {33  if (!Current)34    return Current;35  assert(Current->isValid() && "Invalid input state");36  if (const State *Next = Current->next(Tok))37    return Next->isValid() ? Next : nullptr;38  return nullptr;39}40 41SmallVector<StringRef> DirectiveNameParser::tokenize(StringRef Str) {42  SmallVector<StringRef> Tokens;43  SplitString(Str, Tokens);44  return Tokens;45}46 47void DirectiveNameParser::insertName(StringRef Name, Directive D) {48  State *Where = &InitialState;49 50  for (StringRef Tok : tokenize(Name))51    Where = insertTransition(Where, Tok);52 53  Where->Value = D;54}55 56DirectiveNameParser::State *57DirectiveNameParser::insertTransition(State *From, StringRef Tok) {58  assert(From && "Expecting state");59  if (!From->Transition)60    From->Transition = std::make_unique<State::TransitionMapTy>();61  if (State *Next = From->next(Tok))62    return Next;63 64  auto [Where, DidIt] = From->Transition->try_emplace(Tok, State());65  assert(DidIt && "Map insertion failed");66  return &Where->second;67}68 69const DirectiveNameParser::State *70DirectiveNameParser::State::next(StringRef Tok) const {71  if (!Transition)72    return nullptr;73  auto F = Transition->find(Tok);74  return F != Transition->end() ? &F->second : nullptr;75}76 77DirectiveNameParser::State *DirectiveNameParser::State::next(StringRef Tok) {78  if (!Transition)79    return nullptr;80  auto F = Transition->find(Tok);81  return F != Transition->end() ? &F->second : nullptr;82}83} // namespace llvm::omp84