1 | //===- ParserState.h - MLIR ParserState -------------------------*- C++ -*-===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #ifndef MLIR_LIB_ASMPARSER_PARSERSTATE_H |
10 | #define MLIR_LIB_ASMPARSER_PARSERSTATE_H |
11 | |
12 | #include "Lexer.h" |
13 | #include "mlir/IR/Attributes.h" |
14 | #include "mlir/IR/OpImplementation.h" |
15 | #include "llvm/ADT/SetVector.h" |
16 | #include "llvm/ADT/StringMap.h" |
17 | |
18 | namespace mlir { |
19 | class OpAsmDialectInterface; |
20 | |
21 | namespace detail { |
22 | |
23 | //===----------------------------------------------------------------------===// |
24 | // SymbolState |
25 | //===----------------------------------------------------------------------===// |
26 | |
27 | /// This class contains record of any parsed top-level symbols. |
28 | struct SymbolState { |
29 | /// A map from attribute alias identifier to Attribute. |
30 | llvm::StringMap<Attribute> attributeAliasDefinitions; |
31 | |
32 | /// A map from type alias identifier to Type. |
33 | llvm::StringMap<Type> typeAliasDefinitions; |
34 | |
35 | /// A map of dialect resource keys to the resolved resource name and handle |
36 | /// to use during parsing. |
37 | DenseMap<const OpAsmDialectInterface *, |
38 | llvm::StringMap<std::pair<std::string, AsmDialectResourceHandle>>> |
39 | dialectResources; |
40 | |
41 | /// A map from unique integer identifier to DistinctAttr. |
42 | DenseMap<uint64_t, DistinctAttr> distinctAttributes; |
43 | }; |
44 | |
45 | //===----------------------------------------------------------------------===// |
46 | // ParserState |
47 | //===----------------------------------------------------------------------===// |
48 | |
49 | /// This class refers to all of the state maintained globally by the parser, |
50 | /// such as the current lexer position etc. |
51 | struct ParserState { |
52 | ParserState(const llvm::SourceMgr &sourceMgr, const ParserConfig &config, |
53 | SymbolState &symbols, AsmParserState *asmState, |
54 | AsmParserCodeCompleteContext *codeCompleteContext) |
55 | : config(config), |
56 | lex(sourceMgr, config.getContext(), codeCompleteContext), |
57 | curToken(lex.lexToken()), lastToken(Token::error, "" ), symbols(symbols), |
58 | asmState(asmState), codeCompleteContext(codeCompleteContext) {} |
59 | ParserState(const ParserState &) = delete; |
60 | void operator=(const ParserState &) = delete; |
61 | |
62 | /// The configuration used to setup the parser. |
63 | const ParserConfig &config; |
64 | |
65 | /// The lexer for the source file we're parsing. |
66 | Lexer lex; |
67 | |
68 | /// This is the next token that hasn't been consumed yet. |
69 | Token curToken; |
70 | |
71 | /// This is the last token that has been consumed. |
72 | Token lastToken; |
73 | |
74 | /// The current state for symbol parsing. |
75 | SymbolState &symbols; |
76 | |
77 | /// Stack of potentially cyclic mutable attributes or type currently being |
78 | /// parsed. |
79 | SetVector<const void *> cyclicParsingStack; |
80 | |
81 | /// An optional pointer to a struct containing high level parser state to be |
82 | /// populated during parsing. |
83 | AsmParserState *asmState; |
84 | |
85 | /// An optional code completion context. |
86 | AsmParserCodeCompleteContext *codeCompleteContext; |
87 | |
88 | // Contains the stack of default dialect to use when parsing regions. |
89 | // A new dialect get pushed to the stack before parsing regions nested |
90 | // under an operation implementing `OpAsmOpInterface`, and |
91 | // popped when done. At the top-level we start with "builtin" as the |
92 | // default, so that the top-level `module` operation parses as-is. |
93 | SmallVector<StringRef> defaultDialectStack{"builtin" }; |
94 | }; |
95 | |
96 | } // namespace detail |
97 | } // namespace mlir |
98 | |
99 | #endif // MLIR_LIB_ASMPARSER_PARSERSTATE_H |
100 | |