;
27using namespacetransformer;
38template<
typename... Ts>
usingRangeSelectorOp =
RangeSelector(*)(Ts...);
45StringRef OriginalInput;
50template<
typenameResultType>
structParseProgress {
57template<
typenameT>
usingParseFunction = ExpectedProgress<T> (*)(ParseState);
59class ParseError:
publicllvm::ErrorInfo<ParseError> {
64 ParseError(
size_tPos, std::string ErrorMsg, std::string InputExcerpt)
65: Pos(Pos), ErrorMsg(
std::move(ErrorMsg)),
66Excerpt(
std::move(InputExcerpt)) {}
68 void log(llvm::raw_ostream &OS)
const override{
69OS <<
"parse error at position ("<< Pos <<
"): "<< ErrorMsg
73std::error_code convertToErrorCode()
const override{
74 returnllvm::inconvertibleErrorCode();
87static constllvm::StringMap<RangeSelectorOp<std::string>> &
89 static constllvm::StringMap<RangeSelectorOp<std::string>> M = {
101static constllvm::StringMap<RangeSelectorOp<RangeSelector>> &
103 static constllvm::StringMap<RangeSelectorOp<RangeSelector>> M = {
108static constllvm::StringMap<RangeSelectorOp<std::string, std::string>> &
110 static constllvm::StringMap<RangeSelectorOp<std::string, std::string>> M = {
115static constllvm::StringMap<RangeSelectorOp<RangeSelector, RangeSelector>> &
117 static constllvm::StringMap<RangeSelectorOp<RangeSelector, RangeSelector>>
122template<
typenameElement>
123std::optional<Element>
findOptional(
constllvm::StringMap<Element> &Map,
124llvm::StringRef Key) {
125 autoit = Map.find(Key);
131template<
typenameResultType>
134 returnParseProgress<ResultType>{State, std::move(Result)};
138 size_tPos = S.OriginalInput.size() - S.Input.size();
139 returnllvm::make_error<ParseError>(Pos, std::move(ErrorMsg),
140S.OriginalInput.substr(Pos, 20).str());
144staticParseState
advance(ParseState S,
size_tN) {
145S.Input = S.Input.drop_front(N);
155staticExpectedProgress<std::nullopt_t>
parseChar(
char c, ParseState State) {
157 if(State.Input.empty() || State.Input.front() !=
c)
159(
"expected char not found: "+ llvm::Twine(
c)).str());
164staticExpectedProgress<std::string>
parseId(ParseState State) {
166 auto Id= State.Input.take_while(
177 if(State.Input.empty())
179 if(!State.Input.consume_front(
"\""))
182 "expecting string, but encountered other character or end of input");
184StringRef
Id= State.Input.take_until([](
char c) {
return c==
'"'; });
185 if(State.Input.size() ==
Id.size())
193template<
typenameT>
194ExpectedProgress<RangeSelector>
parseSingle(ParseFunction<T> ParseElement,
195RangeSelectorOp<T> Op,
199 return P.takeError();
201 auto E= ParseElement(
P->State);
203 return E.takeError();
207 return P.takeError();
214template<
typenameT>
215ExpectedProgress<RangeSelector>
parsePair(ParseFunction<T> ParseElement,
216RangeSelectorOp<T, T> Op,
220 return P.takeError();
222 autoLeft = ParseElement(
P->State);
224 returnLeft.takeError();
228 return P.takeError();
230 autoRight = ParseElement(
P->State);
232 returnRight.takeError();
236 return P.takeError();
239Op(std::move(Left->Value), std::move(Right->Value)));
245staticExpectedProgress<RangeSelector>
249 return Id.takeError();
251std::string OpName = std::move(
Id->Value);
264 return makeParseError(State,
"unknown selector name: "+ OpName);
268ParseState State = {Input, Input};
271 returnResult.takeError();
272State = Result->State;
275 if(State.Input.empty())
276 returnResult->Value;
277 return makeParseError(State,
"unexpected input after selector");
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...
Defines the clang::SourceLocation class and associated facilities.
__device__ __2f16 float c
RangeSelector initListElements(std::string ID)
RangeSelector enclose(RangeSelector Begin, RangeSelector End)
Selects from the start of Begin and to the end of End.
RangeSelector member(std::string ID)
Given a MemberExpr, selects the member token.
RangeSelector between(RangeSelector R1, RangeSelector R2)
Selects the range between R1 and `R2.
RangeSelector elseBranch(std::string ID)
Given an \IfStmt (bound to ID), selects the range of the else branch, starting from the else keyword.
RangeSelector node(std::string ID)
Selects a node, including trailing semicolon, if any (for declarations and non-expression statements)...
MatchConsumer< CharSourceRange > RangeSelector
RangeSelector encloseNodes(std::string BeginID, std::string EndID)
Convenience version of range where end-points are bound nodes.
RangeSelector after(RangeSelector Selector)
Selects the point immediately following Selector.
RangeSelector callArgs(std::string ID)
RangeSelector before(RangeSelector Selector)
Selects the (empty) range [B,B) when Selector selects the range [B,E).
llvm::Expected< RangeSelector > parseRangeSelector(llvm::StringRef Input)
Parses a string representation of a RangeSelector.
RangeSelector statement(std::string ID)
Selects a node, including trailing semicolon (always).
RangeSelector expansion(RangeSelector S)
Selects the range from which S was expanded (possibly along with other source), if S is an expansion,...
RangeSelector statements(std::string ID)
RangeSelector name(std::string ID)
Given a node with a "name", (like NamedDecl, DeclRefExpr, CxxCtorInitializer, and TypeLoc) selects th...
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',...
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4