12#include "llvm/ADT/StringMap.h"
13#include "llvm/ADT/StringRef.h"
14#include "llvm/Support/Error.h"
20using namespace transformer;
31template <
typename... Ts>
using RangeSelectorOp =
RangeSelector (*)(Ts...);
38 StringRef OriginalInput;
43template <
typename ResultType>
struct ParseProgress {
50template <
typename T>
using ParseFunction = ExpectedProgress<T> (*)(ParseState);
52class ParseError :
public llvm::ErrorInfo<ParseError> {
57 ParseError(
size_t Pos, std::string ErrorMsg, std::string InputExcerpt)
58 : Pos(Pos), ErrorMsg(
std::move(ErrorMsg)),
59 Excerpt(
std::move(InputExcerpt)) {}
61 void log(llvm::raw_ostream &OS)
const override {
62 OS <<
"parse error at position (" << Pos <<
"): " << ErrorMsg
66 std::error_code convertToErrorCode()
const override {
67 return llvm::inconvertibleErrorCode();
80static const llvm::StringMap<RangeSelectorOp<std::string>> &
82 static const llvm::StringMap<RangeSelectorOp<std::string>> M = {
94static const llvm::StringMap<RangeSelectorOp<RangeSelector>> &
96 static const llvm::StringMap<RangeSelectorOp<RangeSelector>> M = {
101static const llvm::StringMap<RangeSelectorOp<std::string, std::string>> &
103 static const llvm::StringMap<RangeSelectorOp<std::string, std::string>> M = {
108static const llvm::StringMap<RangeSelectorOp<RangeSelector, RangeSelector>> &
110 static const llvm::StringMap<RangeSelectorOp<RangeSelector, RangeSelector>>
115template <
typename Element>
116std::optional<Element>
findOptional(
const llvm::StringMap<Element> &Map,
117 llvm::StringRef Key) {
118 auto it = Map.find(Key);
124template <
typename ResultType>
127 return ParseProgress<ResultType>{State, std::move(Result)};
131 size_t Pos = S.OriginalInput.size() - S.Input.size();
132 return llvm::make_error<ParseError>(Pos, std::move(ErrorMsg),
133 S.OriginalInput.substr(Pos, 20).str());
137static ParseState
advance(ParseState S,
size_t N) {
138 S.Input = S.Input.drop_front(N);
148static ExpectedProgress<std::nullopt_t>
parseChar(
char c, ParseState State) {
150 if (State.Input.empty() || State.Input.front() !=
c)
152 (
"expected char not found: " + llvm::Twine(
c)).str());
157static ExpectedProgress<std::string>
parseId(ParseState State) {
159 auto Id = State.Input.take_while(
170 if (State.Input.empty())
172 if (!State.Input.consume_front(
"\""))
175 "expecting string, but encountered other character or end of input");
177 StringRef
Id = State.Input.take_until([](
char c) {
return c ==
'"'; });
178 if (State.Input.size() ==
Id.size())
187ExpectedProgress<RangeSelector>
parseSingle(ParseFunction<T> ParseElement,
188 RangeSelectorOp<T> Op,
192 return P.takeError();
194 auto E = ParseElement(
P->State);
196 return E.takeError();
200 return P.takeError();
208ExpectedProgress<RangeSelector>
parsePair(ParseFunction<T> ParseElement,
209 RangeSelectorOp<T, T> Op,
213 return P.takeError();
215 auto Left = ParseElement(
P->State);
217 return Left.takeError();
221 return P.takeError();
223 auto Right = ParseElement(
P->State);
225 return Right.takeError();
229 return P.takeError();
232 Op(std::move(Left->Value), std::move(Right->Value)));
238static ExpectedProgress<RangeSelector>
242 return Id.takeError();
244 std::string OpName = std::move(
Id->Value);
261 ParseState State = {Input, Input};
264 return Result.takeError();
265 State = Result->State;
268 if (State.Input.empty())
269 return Result->Value;
static ExpectedProgress< std::string > parseStringId(ParseState State)
static ExpectedProgress< std::nullopt_t > parseChar(char c, ParseState State)
ParseProgress< ResultType > makeParseProgress(ParseState State, ResultType Result)
static StringRef consumeWhitespace(StringRef S)
ExpectedProgress< RangeSelector > parseSingle(ParseFunction< T > ParseElement, RangeSelectorOp< T > Op, ParseState State)
ExpectedProgress< RangeSelector > parsePair(ParseFunction< T > ParseElement, RangeSelectorOp< T, T > Op, ParseState State)
std::optional< Element > findOptional(const llvm::StringMap< Element > &Map, llvm::StringRef Key)
static llvm::Error makeParseError(const ParseState &S, std::string ErrorMsg)
static const llvm::StringMap< RangeSelectorOp< RangeSelector > > & getUnaryRangeSelectors()
static ExpectedProgress< RangeSelector > parseRangeSelectorImpl(ParseState State)
static ExpectedProgress< std::string > parseId(ParseState State)
static ParseState advance(ParseState S, size_t N)
static const llvm::StringMap< RangeSelectorOp< RangeSelector, RangeSelector > > & getBinaryRangeSelectors()
static const llvm::StringMap< RangeSelectorOp< std::string, std::string > > & getBinaryStringSelectors()
static const llvm::StringMap< RangeSelectorOp< std::string > > & getUnaryStringSelectors()
Defines parsing functions for Transformer types.
Defines a combinator library supporting the definition of selectors, which select source ranges based...
__device__ __2f16 float c
The JSON file list parser is used to communicate input to InstallAPI.
LLVM_READNONE bool isASCII(char c)
Returns true if a byte is an ASCII character.
LLVM_READONLY bool isAsciiIdentifierContinue(unsigned char c)
LLVM_READONLY bool isWhitespace(unsigned char c)
Return true if this character is horizontal or vertical ASCII whitespace: ' ', '\t',...