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:
52 case Token::kw_f8E5M3FNU:
63 case Token::exclamation_identifier:
94 elements.push_back(t);
104 auto parseElt = [&]() -> ParseResult {
106 elements.push_back(elt);
107 return elt ?
success() : failure();
119 if (
parseToken(Token::l_paren,
"expected '('"))
140 if (
parseToken(Token::less,
"expected '<' in complex type"))
146 parseToken(Token::greater,
"expected '>' in complex type"))
148 if (!isa<FloatType>(elementType) && !isa<IntegerType>(elementType))
149 return emitError(elementTypeLoc,
"invalid element type for complex"),
152 return ComplexType::get(elementType);
160 assert(
getToken().is(Token::l_paren));
164 parseToken(Token::arrow,
"expected '->' in function type") ||
168 return builder.getFunctionType(arguments, results);
189 if (
parseToken(Token::less,
"expected '<' in memref type"))
215 return emitError(typeLoc,
"invalid memref element type"),
nullptr;
217 MemRefLayoutAttrInterface layout;
220 auto parseElt = [&]() -> ParseResult {
226 if (isa<MemRefLayoutAttrInterface>(attr)) {
227 layout = cast<MemRefLayoutAttrInterface>(attr);
228 }
else if (memorySpace) {
229 return emitError(
"multiple memory spaces specified in memref type");
236 return emitError(
"cannot have affine map for unranked memref type");
238 return emitError(
"expected memory space to be last in memref type");
246 if (
parseToken(Token::comma,
"expected ',' or '>' in memref type") ||
281 case Token::kw_memref:
283 case Token::kw_tensor:
285 case Token::kw_complex:
287 case Token::kw_tuple:
289 case Token::kw_vector:
292 case Token::inttype: {
294 if (!width.has_value())
295 return (
emitError(
"invalid integer width"),
nullptr);
296 if (*width > IntegerType::kMaxWidth) {
298 << IntegerType::kMaxWidth <<
" bits";
302 IntegerType::SignednessSemantics signSemantics = IntegerType::Signless;
303 if (std::optional<bool> signedness =
getToken().getIntTypeSignedness())
304 signSemantics = *signedness ? IntegerType::Signed : IntegerType::Unsigned;
307 return IntegerType::get(
getContext(), *width, signSemantics);
311 case Token::kw_f4E2M1FN:
313 return builder.getType<Float4E2M1FNType>();
314 case Token::kw_f6E2M3FN:
316 return builder.getType<Float6E2M3FNType>();
317 case Token::kw_f6E3M2FN:
319 return builder.getType<Float6E3M2FNType>();
320 case Token::kw_f8E5M2:
322 return builder.getType<Float8E5M2Type>();
323 case Token::kw_f8E4M3:
325 return builder.getType<Float8E4M3Type>();
326 case Token::kw_f8E4M3FN:
328 return builder.getType<Float8E4M3FNType>();
329 case Token::kw_f8E5M2FNUZ:
331 return builder.getType<Float8E5M2FNUZType>();
332 case Token::kw_f8E4M3FNUZ:
334 return builder.getType<Float8E4M3FNUZType>();
335 case Token::kw_f8E4M3B11FNUZ:
337 return builder.getType<Float8E4M3B11FNUZType>();
338 case Token::kw_f8E3M4:
340 return builder.getType<Float8E3M4Type>();
341 case Token::kw_f8E8M0FNU:
343 return builder.getType<Float8E8M0FNUType>();
344 case Token::kw_f8E5M3FNU:
346 return builder.getType<Float8E5M3FNUType>();
349 return builder.getType<BFloat16Type>();
352 return builder.getType<Float16Type>();
355 return builder.getType<FloatTF32Type>();
358 return builder.getType<Float32Type>();
361 return builder.getType<Float64Type>();
364 return builder.getType<Float80Type>();
367 return builder.getType<Float128Type>();
370 case Token::kw_index:
380 case Token::kw_token:
382 return builder.getType<TokenType>();
385 case Token::exclamation_identifier:
389 case Token::code_complete:
390 if (
getToken().isCodeCompletionFor(Token::exclamation_identifier))
404 if (
parseToken(Token::less,
"expected '<' in tensor type"))
431 if (parseResult.has_value()) {
432 if (failed(parseResult.value()))
434 if (
auto v = dyn_cast_or_null<VerifiableTensorEncoding>(encoding)) {
435 if (failed(v.verifyEncoding(dimensions, elementType,
436 [&] { return emitError(); })))
442 if (!elementType ||
parseToken(Token::greater,
"expected '>' in tensor type"))
445 return emitError(elementTypeLoc,
"invalid tensor element type"),
nullptr;
449 return emitError(
"cannot apply encoding to unranked tensor"),
nullptr;
450 return UnrankedTensorType::get(elementType);
452 return RankedTensorType::get(dimensions, elementType, encoding);
463 if (
parseToken(Token::less,
"expected '<' in tuple type"))
473 parseToken(Token::greater,
"expected '>' in tuple type"))
489 if (
parseToken(Token::less,
"expected '<' in vector type"))
500 if (!elementType ||
parseToken(Token::greater,
"expected '>' in vector type"))
521 bool scalable =
consumeIf(Token::l_square);
524 dimensions.push_back(value);
529 scalableDims.push_back(scalable);
553 bool allowDynamic,
bool withTrailingX) {
554 auto parseDim = [&]() -> LogicalResult {
558 return emitError(loc,
"expected static shape");
559 dimensions.push_back(ShapedType::kDynamic);
564 dimensions.push_back(value);
570 while (
getToken().isAny(Token::integer, Token::question)) {
577 if (
getToken().isAny(Token::integer, Token::question)) {
578 if (failed(parseDim()))
580 while (
getToken().is(Token::bare_identifier) &&
606 *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.