35 case Token::kw_memref:
36 case Token::kw_tensor:
37 case Token::kw_complex:
39 case Token::kw_vector:
41 case Token::kw_f4E2M1FN:
42 case Token::kw_f6E2M3FN:
43 case Token::kw_f6E3M2FN:
44 case Token::kw_f8E5M2:
45 case Token::kw_f8E4M3:
46 case Token::kw_f8E4M3FN:
47 case Token::kw_f8E5M2FNUZ:
48 case Token::kw_f8E4M3FNUZ:
49 case Token::kw_f8E4M3B11FNUZ:
50 case Token::kw_f8E3M4:
51 case Token::kw_f8E8M0FNU:
62 case Token::exclamation_identifier:
93 elements.push_back(t);
103 auto parseElt = [&]() -> ParseResult {
105 elements.push_back(elt);
106 return elt ?
success() : failure();
118 if (
parseToken(Token::l_paren,
"expected '('"))
139 if (
parseToken(Token::less,
"expected '<' in complex type"))
145 parseToken(Token::greater,
"expected '>' in complex type"))
147 if (!isa<FloatType>(elementType) && !isa<IntegerType>(elementType))
148 return emitError(elementTypeLoc,
"invalid element type for complex"),
151 return ComplexType::get(elementType);
159 assert(
getToken().is(Token::l_paren));
163 parseToken(Token::arrow,
"expected '->' in function type") ||
167 return builder.getFunctionType(arguments, results);
188 if (
parseToken(Token::less,
"expected '<' in memref type"))
214 return emitError(typeLoc,
"invalid memref element type"),
nullptr;
216 MemRefLayoutAttrInterface layout;
219 auto parseElt = [&]() -> ParseResult {
225 if (isa<MemRefLayoutAttrInterface>(attr)) {
226 layout = cast<MemRefLayoutAttrInterface>(attr);
227 }
else if (memorySpace) {
228 return emitError(
"multiple memory spaces specified in memref type");
235 return emitError(
"cannot have affine map for unranked memref type");
237 return emitError(
"expected memory space to be last in memref type");
245 if (
parseToken(Token::comma,
"expected ',' or '>' in memref type") ||
280 case Token::kw_memref:
282 case Token::kw_tensor:
284 case Token::kw_complex:
286 case Token::kw_tuple:
288 case Token::kw_vector:
291 case Token::inttype: {
293 if (!width.has_value())
294 return (
emitError(
"invalid integer width"),
nullptr);
295 if (*width > IntegerType::kMaxWidth) {
297 << IntegerType::kMaxWidth <<
" bits";
301 IntegerType::SignednessSemantics signSemantics = IntegerType::Signless;
302 if (std::optional<bool> signedness =
getToken().getIntTypeSignedness())
303 signSemantics = *signedness ? IntegerType::Signed : IntegerType::Unsigned;
306 return IntegerType::get(
getContext(), *width, signSemantics);
310 case Token::kw_f4E2M1FN:
312 return builder.getType<Float4E2M1FNType>();
313 case Token::kw_f6E2M3FN:
315 return builder.getType<Float6E2M3FNType>();
316 case Token::kw_f6E3M2FN:
318 return builder.getType<Float6E3M2FNType>();
319 case Token::kw_f8E5M2:
321 return builder.getType<Float8E5M2Type>();
322 case Token::kw_f8E4M3:
324 return builder.getType<Float8E4M3Type>();
325 case Token::kw_f8E4M3FN:
327 return builder.getType<Float8E4M3FNType>();
328 case Token::kw_f8E5M2FNUZ:
330 return builder.getType<Float8E5M2FNUZType>();
331 case Token::kw_f8E4M3FNUZ:
333 return builder.getType<Float8E4M3FNUZType>();
334 case Token::kw_f8E4M3B11FNUZ:
336 return builder.getType<Float8E4M3B11FNUZType>();
337 case Token::kw_f8E3M4:
339 return builder.getType<Float8E3M4Type>();
340 case Token::kw_f8E8M0FNU:
342 return builder.getType<Float8E8M0FNUType>();
345 return builder.getType<BFloat16Type>();
348 return builder.getType<Float16Type>();
351 return builder.getType<FloatTF32Type>();
354 return builder.getType<Float32Type>();
357 return builder.getType<Float64Type>();
360 return builder.getType<Float80Type>();
363 return builder.getType<Float128Type>();
366 case Token::kw_index:
376 case Token::kw_token:
378 return builder.getType<TokenType>();
381 case Token::exclamation_identifier:
385 case Token::code_complete:
386 if (
getToken().isCodeCompletionFor(Token::exclamation_identifier))
400 if (
parseToken(Token::less,
"expected '<' in tensor type"))
427 if (parseResult.has_value()) {
428 if (failed(parseResult.value()))
430 if (
auto v = dyn_cast_or_null<VerifiableTensorEncoding>(encoding)) {
431 if (failed(v.verifyEncoding(dimensions, elementType,
432 [&] { return emitError(); })))
438 if (!elementType ||
parseToken(Token::greater,
"expected '>' in tensor type"))
441 return emitError(elementTypeLoc,
"invalid tensor element type"),
nullptr;
445 return emitError(
"cannot apply encoding to unranked tensor"),
nullptr;
446 return UnrankedTensorType::get(elementType);
448 return RankedTensorType::get(dimensions, elementType, encoding);
459 if (
parseToken(Token::less,
"expected '<' in tuple type"))
469 parseToken(Token::greater,
"expected '>' in tuple type"))
485 if (
parseToken(Token::less,
"expected '<' in vector type"))
496 if (!elementType ||
parseToken(Token::greater,
"expected '>' in vector type"))
517 bool scalable =
consumeIf(Token::l_square);
520 dimensions.push_back(value);
525 scalableDims.push_back(scalable);
549 bool allowDynamic,
bool withTrailingX) {
550 auto parseDim = [&]() -> LogicalResult {
554 return emitError(loc,
"expected static shape");
555 dimensions.push_back(ShapedType::kDynamic);
560 dimensions.push_back(value);
566 while (
getToken().isAny(Token::integer, Token::question)) {
573 if (
getToken().isAny(Token::integer, Token::question)) {
574 if (failed(parseDim()))
576 while (
getToken().is(Token::bare_identifier) &&
602 *dimension > (uint64_t)std::numeric_limits<int64_t>::max())
Attributes are known-constant values of operations.
static bool isValidElementType(Type type)
Return true if the specified element type is ok in a memref.
This class implements Optional functionality for ParseResult.
static bool isValidElementType(Type type)
Return true if the specified element type is ok in a tensor.
static std::optional< uint64_t > getUInt64IntegerValue(StringRef spelling)
For an integer token, return its value as an uint64_t.
std::optional< unsigned > getIntTypeBitwidth() const
For an inttype token, return its bitwidth.
Instances of the Type class are uniqued, have an immutable identifier and an optional mutable compone...
ParseResult parseXInDimensionList()
Parse an 'x' token in a dimension list, handling the case where the x is juxtaposed with an element t...
T getChecked(SMLoc loc, ParamsT &&...params)
Invoke the getChecked method of the given Attribute or Type class, using the provided location to emi...
OptionalParseResult parseOptionalType(Type &type)
Optionally parse a type.
ParseResult parseToken(Token::Kind expectedToken, const Twine &message)
Consume the specified token if present and return success.
ParseResult parseCommaSeparatedListUntil(Token::Kind rightToken, function_ref< ParseResult()> parseElement, bool allowEmptyList=true)
Parse a comma-separated list of elements up until the specified end token.
Type parseType()
Parse an arbitrary type.
ParseResult parseTypeListParens(SmallVectorImpl< Type > &elements)
Parse a parenthesized list of types.
ParseResult parseVectorDimensionList(SmallVectorImpl< int64_t > &dimensions, SmallVectorImpl< bool > &scalableDims)
Parse a dimension list in a vector type.
Type parseMemRefType()
Parse a memref type.
Type parseNonFunctionType()
Parse a non function type.
Type parseExtendedType()
Parse an extended type.
Type parseTupleType()
Parse a tuple type.
InFlightDiagnostic emitError(const Twine &message={})
Emit an error and return failure.
ParserState & state
The Parser is subclassed and reinstantiated.
Attribute parseAttribute(Type type={})
Parse an arbitrary attribute with an optional type.
StringRef getTokenSpelling() const
void consumeToken()
Advance the current lexer onto the next token.
ParseResult parseIntegerInDimensionList(int64_t &value)
Type parseComplexType()
Parse a complex type.
ParseResult parseDimensionListRanked(SmallVectorImpl< int64_t > &dimensions, bool allowDynamic=true, bool withTrailingX=true)
Parse a dimension list of a tensor or memref type.
ParseResult parseFunctionResultTypes(SmallVectorImpl< Type > &elements)
Parse a function result type.
InFlightDiagnostic emitWrongTokenError(const Twine &message={})
Emit an error about a "wrong token".
ParseResult parseCommaSeparatedList(Delimiter delimiter, function_ref< ParseResult()> parseElementFn, StringRef contextMessage=StringRef())
Parse a list of comma-separated items with an optional delimiter.
VectorType parseVectorType()
Parse a vector type.
Type parseFunctionType()
Parse a function type.
OptionalParseResult parseOptionalAttribute(Attribute &attribute, Type type={})
Parse an optional attribute with the provided type.
ParseResult parseTypeListNoParens(SmallVectorImpl< Type > &elements)
Parse a list of types without an enclosing parenthesis.
const Token & getToken() const
Return the current token the parser is inspecting.
MLIRContext * getContext() const
Type parseTensorType()
Parse a tensor type.
bool consumeIf(Token::Kind kind)
If the current token has the specified kind, consume it and return true.
Include the generated interface declarations.