9#ifndef MLIR_LIB_ASMPARSER_ASMPARSERIMPL_H
10#define MLIR_LIB_ASMPARSER_ASMPARSERIMPL_H
16#include "llvm/Support/Base64.h"
27template <
typename BaseT>
47 return parser.emitError(loc, message);
60 return parser.getEncodedSourceLocation(loc);
71 return parser.parseToken(Token::arrow,
"expected '->'");
81 return parser.parseToken(Token::l_brace,
"expected '{'");
91 return parser.parseToken(Token::r_brace,
"expected '}'");
101 return parser.parseToken(Token::colon,
"expected ':'");
111 return parser.parseToken(Token::comma,
"expected ','");
121 return parser.parseToken(Token::ellipsis,
"expected '...'");
131 return parser.parseToken(Token::equal,
"expected '='");
141 return parser.parseToken(Token::less,
"expected '<'");
151 return parser.parseToken(Token::greater,
"expected '>'");
161 return parser.parseToken(Token::l_paren,
"expected '('");
171 return parser.parseToken(Token::r_paren,
"expected ')'");
181 return parser.parseToken(Token::l_square,
"expected '['");
191 return parser.parseToken(Token::r_square,
"expected ']'");
201 return parser.parseToken(Token::question,
"expected '?'");
211 return parser.parseToken(Token::slash,
"expected '/'");
221 return parser.parseToken(Token::star,
"expected '*'");
231 return parser.parseToken(Token::plus,
"expected '+'");
241 return parser.parseToken(Token::minus,
"expected '-'");
251 return parser.parseToken(Token::vertical_bar,
"expected '|'");
261 return parser.parseOptionalString(
string);
267 if (!
parser.getToken().is(Token::string))
268 return emitError(loc,
"expected string");
275 StringRef b64QuotedString =
parser.getTokenSpelling();
276 StringRef b64String =
277 b64QuotedString.ltrim(
"\" \t\n\v\f\r").rtrim(
"\" \t\n\v\f\r");
278 if (
auto err = llvm::decodeBase64(b64String, *bytes))
291 APFloat &
result)
override {
292 bool isNegative =
parser.consumeIf(Token::minus);
294 std::optional<APFloat> apResult;
295 if (failed(
parser.parseFloatFromLiteral(apResult, curTok, isNegative,
305 llvm::APFloat apResult(0.0);
306 if (
parseFloat(APFloat::IEEEdouble(), apResult))
309 result = apResult.convertToDouble();
328 StringRef contextMessage)
override {
329 return parser.parseCommaSeparatedList(delimiter, parseElt, contextMessage);
336 ParseResult
parseKeyword(StringRef keyword,
const Twine &msg)
override {
337 if (
parser.getToken().isCodeCompletion())
338 return parser.codeCompleteExpectedTokens(keyword);
342 return emitError(loc,
"expected '") << keyword <<
"'" << msg;
349 if (
parser.getToken().isCodeCompletion())
350 return parser.codeCompleteOptionalTokens(keyword);
353 if (!
parser.isCurrentTokenAKeyword() ||
354 parser.getTokenSpelling() != keyword)
362 return parser.parseOptionalKeyword(keyword);
369 if (
parser.getToken().isCodeCompletion())
370 return parser.codeCompleteOptionalTokens(allowedKeywords);
373 if (!
parser.isCurrentTokenAKeyword())
376 StringRef currentKeyword =
parser.getTokenSpelling();
377 if (llvm::is_contained(allowedKeywords, currentKeyword)) {
378 *keyword = currentKeyword;
407 if (
parser.getToken().isNot(Token::hash_identifier))
418 if (
parser.getToken().isNot(Token::exclamation_identifier))
425 Type type)
override {
429 Type type)
override {
433 Type type)
override {
437 Type type)
override {
443 if (
parser.getToken().isNot(Token::l_brace))
458 return parser.parseAffineMapReference(map);
466 return parser.parseAffineExprReference(symbolSet, expr);
471 return parser.parseIntegerSetReference(set);
482 if (atToken.
isNot(Token::at_identifier))
490 if (
parser.getState().asmState) {
491 parser.getState().asmState->addUses(SymbolRefAttr::get(
result),
502 FailureOr<AsmDialectResourceHandle>
507 <<
"' does not expect resource handles";
509 std::string resourceName;
510 return parser.parseResourceHandle(interface, resourceName);
537 if (!
parser.consumeIf(Token::arrow))
544 return failure(
parser.parseToken(Token::colon,
"expected ':'") ||
550 if (
parser.parseToken(Token::colon,
"expected ':'"))
559 if (!
parser.consumeIf(Token::colon))
566 bool withTrailingX)
override {
567 return parser.parseDimensionListRanked(dimensions, allowDynamic,
572 return parser.parseXInDimensionList();
576 return success(
parser.getState().cyclicParsingStack.insert(opaquePointer));
580 parser.getState().cyclicParsingStack.pop_back();
602 (
void)
parser.codeCompleteExpectedTokens(tokens);
Base type for affine expression.
A multi-dimensional affine map Affine map's are immutable like Type's, and they are uniqued.
Delimiter
These are the supported delimiters around operand lists and region argument lists,...
ParseResult parseKeyword(StringRef keyword)
Parse a given keyword.
Attributes are known-constant values of operations.
This class is a general helper class for creating context-global objects like types,...
StringAttr getStringAttr(const Twine &bytes)
Dialects are groups of MLIR operations, types and attributes, as well as behavior associated with the...
StringRef getNamespace() const
This class represents a diagnostic that is inflight and set to be reported.
An integer set representing a conjunction of one or more affine equalities and inequalities.
This class defines the main interface for locations in MLIR and acts as a non-nullable wrapper around...
NamedAttrList is array of NamedAttributes that tracks whether it is sorted and does some basic work t...
This class implements Optional functionality for ParseResult.
This represents a token in the MLIR syntax.
SMRange getLocRange() const
std::string getSymbolReference() const
Given a token containing a symbol reference, return the unescaped string value.
bool isCodeCompletion() const
Returns true if the current token represents a code completion.
StringRef getSpelling() const
Instances of the Type class are uniqued, have an immutable identifier and an optional mutable compone...
ParseResult parseOptionalPlus() override
Parses a '+' token if present.
ParseResult parseOptionalLBrace() override
Parse a '{' token if present.
ParseResult parseOptionalArrowTypeList(SmallVectorImpl< Type > &result) override
Parse an optional arrow followed by a type list.
ParseResult parseOptionalStar() override
Parses a '*' if present.
ParseResult parseOptionalMinus() override
Parses a '-' token if present.
ParseResult parseColon() override
Parse a : token.
ParseResult parseFloat(double &result) override
Parse a floating point value from the stream.
InFlightDiagnostic emitError(SMLoc loc, const Twine &message) override
Emit a diagnostic at the specified location and return failure.
ParseResult parseMinus() override
Parses a '-' token.
ParseResult parseOptionalGreater() override
Parse a > token if present.
ParseResult parseOptionalEllipsis() override
Parses a ... if present.
ParseResult parseColonType(Type &result) override
Parse a colon followed by a type.
ParseResult parseArrow() override
Parse a -> token.
void codeCompleteExpectedTokens(ArrayRef< StringRef > tokens) override
Signal the code completion of a set of expected tokens.
ParseResult parseEllipsis() override
Parses a ....
ParseResult parseLParen() override
Parse a ( token.
ParseResult parseOptionalSlash() override
Parses a '/' if present.
ParseResult parseOptionalKeywordOrString(std::string *result) override
Parse an optional keyword or string and set instance into 'result'.`.
Location getEncodedSourceLoc(SMLoc loc) override
Re-encode the given source location as an MLIR location and return it.
ParseResult parseOptionalAttrDict(NamedAttrList &result) override
Parse a named dictionary into 'result' if it is present.
SMLoc nameLoc
The source location of the dialect symbol.
ParseResult parseRParen() override
Parse a ) token.
ParseResult parseQuestion() override
Parses a '?' token.
OptionalParseResult parseOptionalAttribute(ArrayAttr &result, Type type) override
ParseResult parseCustomAttributeWithFallback(Attribute &result, Type type, function_ref< ParseResult(Attribute &result, Type type)> parseAttribute) override
Parse a custom attribute with the provided callback, unless the next token is #, in which case the ge...
OptionalParseResult parseOptionalType(Type &result) override
Parse an optional type.
ParseResult parseIntegerSet(IntegerSet &set) override
Parse an integer set instance into 'set'.
ParseResult parseFloat(const llvm::fltSemantics &semantics, APFloat &result) override
Parse a floating point value with given semantics from the stream.
Builder & getBuilder() const override
Return a builder which provides useful access to MLIRContext, global objects like types and attribute...
SMLoc getNameLoc() const override
Return the location of the original name token.
ParseResult parseOptionalQuestion() override
Parses a '?' if present.
ParseResult parseLBrace() override
Parse a '{' token.
ParseResult parseOptionalComma() override
Parse a , token if present.
ParseResult parsePlus() override
Parses a '+' token.
ParseResult parseLess() override
Parse a '<' token.
ParseResult parseOptionalKeyword(StringRef *keyword, ArrayRef< StringRef > allowedKeywords) override
Parse a keyword if it is one of the 'allowedKeywords'.
OptionalParseResult parseOptionalDecimalInteger(APInt &result) override
Parse an optional integer value from the stream.
ParseResult parseRBrace() override
Parse a } token.
ParseResult parseOptionalRBrace() override
Parse a } token if present.
ParseResult parseGreater() override
Parse a '>' token.
ParseResult parseColonTypeList(SmallVectorImpl< Type > &result) override
Parse a colon followed by a type list, which must have at least one type.
ParseResult parseSlash() override
Parses a '/' token.
ParseResult parseOptionalLess() override
Parse a < token if present.
OptionalParseResult parseOptionalAttribute(StringAttr &result, Type type) override
OptionalParseResult parseOptionalAttribute(Attribute &result, Type type) override
ParseResult parseAttribute(Attribute &result, Type type) override
Parse an arbitrary attribute and return it in result.
Parser & parser
The main parser.
LogicalResult pushCyclicParsing(const void *opaquePointer) override
ParseResult parseKeywordOrCompletion(StringRef *keyword) override
Parse a keyword, or an empty string if the current location signals a code completion.
AsmParserImpl(SMLoc nameLoc, Parser &parser)
ParseResult parseAffineExpr(ArrayRef< std::pair< StringRef, AffineExpr > > symbolSet, AffineExpr &expr) override
Parse an affine expr instance into 'expr' using the already computed mapping from symbols to affine e...
ParseResult parseOptionalKeyword(StringRef keyword) override
Parse the given keyword if present.
FailureOr< AsmDialectResourceHandle > parseResourceHandle(Dialect *dialect) override
Parse a handle to a resource within the assembly format.
bool didEmitError() const
Return if any errors were emitted during parsing.
ParseResult parseComma() override
Parse a , token.
OptionalParseResult parseOptionalInteger(APInt &result) override
Parse an optional integer value from the stream.
ParseResult parseRSquare() override
Parse a ] token.
ParseResult parseLSquare() override
Parse a [ token.
ParseResult parseBase64Bytes(std::vector< char > *bytes) override
Parses a Base64 encoded string of bytes.
ParseResult parseOptionalArrow() override
Parses a -> if present.
~AsmParserImpl() override=default
ParseResult parseDimensionList(SmallVectorImpl< int64_t > &dimensions, bool allowDynamic, bool withTrailingX) override
ParseResult parseEqual() override
Parse a = token.
ParseResult parseCustomTypeWithFallback(Type &result, function_ref< ParseResult(Type &result)> parseType) override
Parse a custom attribute with the provided callback, unless the next token is #, in which case the ge...
ParseResult parseOptionalColonTypeList(SmallVectorImpl< Type > &result) override
Parse an optional colon followed by a type list, which if present must have at least one type.
ParseResult parseOptionalVerticalBar() override
Parse a '|' token if present.
ParseResult parseOptionalAttrDictWithKeyword(NamedAttrList &result) override
Parse a named dictionary into 'result' if the attributes keyword is present.
ParseResult parseStar() override
Parses a '*' token.
ParseResult parseOptionalLParen() override
Parses a '(' if present.
AsmParser::Delimiter Delimiter
ParseResult parseOptionalEqual() override
Parse a = token if present.
void popCyclicParsing() override
ParseResult parseOptionalLSquare() override
Parses a '[' if present.
ParseResult parseOptionalKeyword(StringRef *keyword) override
Parse a keyword, if present, into 'keyword'.
ParseResult parseAffineMap(AffineMap &map) override
Parse an affine map instance into 'map'.
ParseResult parseOptionalSymbolName(StringAttr &result) override
Parse an optional -identifier and store it (without the '@' symbol) in a string attribute named 'attr...
ParseResult parseVerticalBar() override
Parse a '|' token.
OptionalParseResult parseOptionalAttribute(SymbolRefAttr &result, Type type) override
SMLoc getCurrentLocation() override
Get the location of the next token and store it into the argument.
bool emittedError
A flag that indicates if any errors were emitted during parsing.
ParseResult parseOptionalColon() override
Parse a : token if present.
ParseResult parseOptionalString(std::string *string) override
Parses a quoted string token if present.
ParseResult parseOptionalRParen() override
Parses a ')' if present.
ParseResult parseXInDimensionList() override
ParseResult parseKeyword(StringRef keyword, const Twine &msg) override
ParseResult parseType(Type &result) override
Parse a type.
ParseResult parseCommaSeparatedList(Delimiter delimiter, function_ref< ParseResult()> parseElt, StringRef contextMessage) override
Parse a list of comma-separated items with an optional delimiter.
ParseResult parseOptionalRSquare() override
Parses a ']' if present.
ParseResult parseArrowTypeList(SmallVectorImpl< Type > &result) override
Parse an arrow followed by a type list.
This class implement support for parsing global entities like attributes and types.
Include the generated interface declarations.
StringRef toString(AsmResourceEntryKind kind)
llvm::function_ref< Fn > function_ref