| //===- ParserState.h - MLIR ParserState -------------------------*- C++ -*-===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef MLIR_LIB_ASMPARSER_PARSERSTATE_H | |
| #define MLIR_LIB_ASMPARSER_PARSERSTATE_H | |
| #include "Lexer.h" | |
| #include "mlir/IR/Attributes.h" | |
| #include "mlir/IR/OpImplementation.h" | |
| #include "llvm/ADT/SetVector.h" | |
| #include "llvm/ADT/StringMap.h" | |
| namespace mlir { | |
| class OpAsmDialectInterface; | |
| namespace detail { | |
| //===----------------------------------------------------------------------===// | |
| // SymbolState | |
| //===----------------------------------------------------------------------===// | |
| /// This class contains record of any parsed top-level symbols. | |
| struct SymbolState { | |
| /// A map from attribute alias identifier to Attribute. | |
| llvm::StringMap<Attribute> attributeAliasDefinitions; | |
| /// A map from type alias identifier to Type. | |
| llvm::StringMap<Type> typeAliasDefinitions; | |
| /// A map of dialect resource keys to the resolved resource name and handle | |
| /// to use during parsing. | |
| DenseMap<const OpAsmDialectInterface *, | |
| llvm::StringMap<std::pair<std::string, AsmDialectResourceHandle>>> | |
| dialectResources; | |
| /// A map from unique integer identifier to DistinctAttr. | |
| DenseMap<uint64_t, DistinctAttr> distinctAttributes; | |
| }; | |
| //===----------------------------------------------------------------------===// | |
| // ParserState | |
| //===----------------------------------------------------------------------===// | |
| /// This class refers to all of the state maintained globally by the parser, | |
| /// such as the current lexer position etc. | |
| struct ParserState { | |
| ParserState(const llvm::SourceMgr &sourceMgr, const ParserConfig &config, | |
| SymbolState &symbols, AsmParserState *asmState, | |
| AsmParserCodeCompleteContext *codeCompleteContext) | |
| : config(config), | |
| lex(sourceMgr, config.getContext(), codeCompleteContext), | |
| curToken(lex.lexToken()), lastToken(Token::error, ""), symbols(symbols), | |
| asmState(asmState), codeCompleteContext(codeCompleteContext) {} | |
| ParserState(const ParserState &) = delete; | |
| void operator=(const ParserState &) = delete; | |
| /// The configuration used to setup the parser. | |
| const ParserConfig &config; | |
| /// The lexer for the source file we're parsing. | |
| Lexer lex; | |
| /// This is the next token that hasn't been consumed yet. | |
| Token curToken; | |
| /// This is the last token that has been consumed. | |
| Token lastToken; | |
| /// The current state for symbol parsing. | |
| SymbolState &symbols; | |
| /// Stack of potentially cyclic mutable attributes or type currently being | |
| /// parsed. | |
| SetVector<const void *> cyclicParsingStack; | |
| /// An optional pointer to a struct containing high level parser state to be | |
| /// populated during parsing. | |
| AsmParserState *asmState; | |
| /// An optional code completion context. | |
| AsmParserCodeCompleteContext *codeCompleteContext; | |
| // Contains the stack of default dialect to use when parsing regions. | |
| // A new dialect get pushed to the stack before parsing regions nested | |
| // under an operation implementing `OpAsmOpInterface`, and | |
| // popped when done. At the top-level we start with "builtin" as the | |
| // default, so that the top-level `module` operation parses as-is. | |
| SmallVector<StringRef> defaultDialectStack{"builtin"}; | |
| }; | |
| } // namespace detail | |
| } // namespace mlir | |
| #endif // MLIR_LIB_ASMPARSER_PARSERSTATE_H |