xref: /llvm-project/mlir/lib/AsmParser/ParserState.h (revision c1d02bd1479e669f6622f3f9b5b52423ae9631a1)
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 {
ParserStateParserState52   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