diff options
author | robot-piglet <robot-piglet@yandex-team.com> | 2023-12-02 01:45:21 +0300 |
---|---|---|
committer | robot-piglet <robot-piglet@yandex-team.com> | 2023-12-02 02:42:50 +0300 |
commit | 9c43d58f75cf086b744cf4fe2ae180e8f37e4a0c (patch) | |
tree | 9f88a486917d371d099cd712efd91b4c122d209d /contrib/libs/antlr4_cpp_runtime/src/Parser.h | |
parent | 32fb6dda1feb24f9ab69ece5df0cb9ec238ca5e6 (diff) | |
download | ydb-9c43d58f75cf086b744cf4fe2ae180e8f37e4a0c.tar.gz |
Intermediate changes
Diffstat (limited to 'contrib/libs/antlr4_cpp_runtime/src/Parser.h')
-rw-r--r-- | contrib/libs/antlr4_cpp_runtime/src/Parser.h | 461 |
1 files changed, 461 insertions, 0 deletions
diff --git a/contrib/libs/antlr4_cpp_runtime/src/Parser.h b/contrib/libs/antlr4_cpp_runtime/src/Parser.h new file mode 100644 index 0000000000..f490b00c38 --- /dev/null +++ b/contrib/libs/antlr4_cpp_runtime/src/Parser.h @@ -0,0 +1,461 @@ +/* Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. + * Use of this file is governed by the BSD 3-clause license that + * can be found in the LICENSE.txt file in the project root. + */ + +#pragma once + +#include "Recognizer.h" +#include "tree/ParseTreeListener.h" +#include "tree/ParseTree.h" +#include "TokenStream.h" +#include "TokenSource.h" +#include "misc/Interval.h" + +namespace antlr4 { + + /// This is all the parsing support code essentially; most of it is error recovery stuff. + class ANTLR4CPP_PUBLIC Parser : public Recognizer { + public: + + class TraceListener : public tree::ParseTreeListener { + public: + TraceListener(Parser *outerInstance); + virtual ~TraceListener(); + + virtual void enterEveryRule(ParserRuleContext *ctx) override; + virtual void visitTerminal(tree::TerminalNode *node) override; + virtual void visitErrorNode(tree::ErrorNode *node) override; + virtual void exitEveryRule(ParserRuleContext *ctx) override; + + private: + Parser *const outerInstance; + }; + + class TrimToSizeListener : public tree::ParseTreeListener { + public: + static TrimToSizeListener INSTANCE; + + virtual ~TrimToSizeListener(); + + virtual void enterEveryRule(ParserRuleContext *ctx) override; + virtual void visitTerminal(tree::TerminalNode *node) override; + virtual void visitErrorNode(tree::ErrorNode *node) override; + virtual void exitEveryRule(ParserRuleContext *ctx) override; + }; + + Parser(TokenStream *input); + virtual ~Parser(); + + /// reset the parser's state + virtual void reset(); + + /// <summary> + /// Match current input symbol against {@code ttype}. If the symbol type + /// matches, <seealso cref="ANTLRErrorStrategy#reportMatch"/> and <seealso cref="#consume"/> are + /// called to complete the match process. + /// + /// If the symbol type does not match, + /// <seealso cref="ANTLRErrorStrategy#recoverInline"/> is called on the current error + /// strategy to attempt recovery. If <seealso cref="#getBuildParseTree"/> is + /// {@code true} and the token index of the symbol returned by + /// <seealso cref="ANTLRErrorStrategy#recoverInline"/> is -1, the symbol is added to + /// the parse tree by calling {@link #createErrorNode(ParserRuleContext, Token)} then + /// {@link ParserRuleContext#addErrorNode(ErrorNode)}. + /// </summary> + /// <param name="ttype"> the token type to match </param> + /// <returns> the matched symbol </returns> + /// <exception cref="RecognitionException"> if the current input symbol did not match + /// {@code ttype} and the error strategy could not recover from the + /// mismatched symbol </exception> + virtual Token* match(size_t ttype); + + /// <summary> + /// Match current input symbol as a wildcard. If the symbol type matches + /// (i.e. has a value greater than 0), <seealso cref="ANTLRErrorStrategy#reportMatch"/> + /// and <seealso cref="#consume"/> are called to complete the match process. + /// <p/> + /// If the symbol type does not match, + /// <seealso cref="ANTLRErrorStrategy#recoverInline"/> is called on the current error + /// strategy to attempt recovery. If <seealso cref="#getBuildParseTree"/> is + /// {@code true} and the token index of the symbol returned by + /// <seealso cref="ANTLRErrorStrategy#recoverInline"/> is -1, the symbol is added to + /// the parse tree by calling <seealso cref="ParserRuleContext#addErrorNode"/>. + /// </summary> + /// <returns> the matched symbol </returns> + /// <exception cref="RecognitionException"> if the current input symbol did not match + /// a wildcard and the error strategy could not recover from the mismatched + /// symbol </exception> + virtual Token* matchWildcard(); + + /// <summary> + /// Track the <seealso cref="ParserRuleContext"/> objects during the parse and hook + /// them up using the <seealso cref="ParserRuleContext#children"/> list so that it + /// forms a parse tree. The <seealso cref="ParserRuleContext"/> returned from the start + /// rule represents the root of the parse tree. + /// <p/> + /// Note that if we are not building parse trees, rule contexts only point + /// upwards. When a rule exits, it returns the context but that gets garbage + /// collected if nobody holds a reference. It points upwards but nobody + /// points at it. + /// <p/> + /// When we build parse trees, we are adding all of these contexts to + /// <seealso cref="ParserRuleContext#children"/> list. Contexts are then not candidates + /// for garbage collection. + /// </summary> + virtual void setBuildParseTree(bool buildParseTrees); + + /// <summary> + /// Gets whether or not a complete parse tree will be constructed while + /// parsing. This property is {@code true} for a newly constructed parser. + /// </summary> + /// <returns> {@code true} if a complete parse tree will be constructed while + /// parsing, otherwise {@code false} </returns> + virtual bool getBuildParseTree(); + + /// <summary> + /// Trim the internal lists of the parse tree during parsing to conserve memory. + /// This property is set to {@code false} by default for a newly constructed parser. + /// </summary> + /// <param name="trimParseTrees"> {@code true} to trim the capacity of the <seealso cref="ParserRuleContext#children"/> + /// list to its size after a rule is parsed. </param> + virtual void setTrimParseTree(bool trimParseTrees); + + /// <returns> {@code true} if the <seealso cref="ParserRuleContext#children"/> list is trimmed + /// using the default <seealso cref="Parser.TrimToSizeListener"/> during the parse process. </returns> + virtual bool getTrimParseTree(); + + virtual std::vector<tree::ParseTreeListener *> getParseListeners(); + + /// <summary> + /// Registers {@code listener} to receive events during the parsing process. + /// <p/> + /// To support output-preserving grammar transformations (including but not + /// limited to left-recursion removal, automated left-factoring, and + /// optimized code generation), calls to listener methods during the parse + /// may differ substantially from calls made by + /// <seealso cref="ParseTreeWalker#DEFAULT"/> used after the parse is complete. In + /// particular, rule entry and exit events may occur in a different order + /// during the parse than after the parser. In addition, calls to certain + /// rule entry methods may be omitted. + /// <p/> + /// With the following specific exceptions, calls to listener events are + /// <em>deterministic</em>, i.e. for identical input the calls to listener + /// methods will be the same. + /// + /// <ul> + /// <li>Alterations to the grammar used to generate code may change the + /// behavior of the listener calls.</li> + /// <li>Alterations to the command line options passed to ANTLR 4 when + /// generating the parser may change the behavior of the listener calls.</li> + /// <li>Changing the version of the ANTLR Tool used to generate the parser + /// may change the behavior of the listener calls.</li> + /// </ul> + /// </summary> + /// <param name="listener"> the listener to add + /// </param> + /// <exception cref="NullPointerException"> if {@code} listener is {@code null} </exception> + virtual void addParseListener(tree::ParseTreeListener *listener); + + /// <summary> + /// Remove {@code listener} from the list of parse listeners. + /// <p/> + /// If {@code listener} is {@code null} or has not been added as a parse + /// listener, this method does nothing. + /// </summary> + /// <seealso cref= #addParseListener + /// </seealso> + /// <param name="listener"> the listener to remove </param> + virtual void removeParseListener(tree::ParseTreeListener *listener); + + /// <summary> + /// Remove all parse listeners. + /// </summary> + /// <seealso cref= #addParseListener </seealso> + virtual void removeParseListeners(); + + /// <summary> + /// Notify any parse listeners of an enter rule event. + /// </summary> + /// <seealso cref= #addParseListener </seealso> + virtual void triggerEnterRuleEvent(); + + /// <summary> + /// Notify any parse listeners of an exit rule event. + /// </summary> + /// <seealso cref= #addParseListener </seealso> + virtual void triggerExitRuleEvent(); + + /// <summary> + /// Gets the number of syntax errors reported during parsing. This value is + /// incremented each time <seealso cref="#notifyErrorListeners"/> is called. + /// </summary> + /// <seealso cref= #notifyErrorListeners </seealso> + virtual size_t getNumberOfSyntaxErrors(); + + virtual TokenFactory<CommonToken>* getTokenFactory() override; + + /// <summary> + /// Tell our token source and error strategy about a new way to create tokens. </summary> + template<typename T1> + void setTokenFactory(TokenFactory<T1> *factory) { + _input->getTokenSource()->setTokenFactory(factory); + } + + /// The ATN with bypass alternatives is expensive to create so we create it + /// lazily. The ATN is owned by us. + virtual const atn::ATN& getATNWithBypassAlts(); + + /// <summary> + /// The preferred method of getting a tree pattern. For example, here's a + /// sample use: + /// + /// <pre> + /// ParseTree t = parser.expr(); + /// ParseTreePattern p = parser.compileParseTreePattern("<ID>+0", MyParser.RULE_expr); + /// ParseTreeMatch m = p.match(t); + /// String id = m.get("ID"); + /// </pre> + /// </summary> + virtual tree::pattern::ParseTreePattern compileParseTreePattern(const std::string &pattern, int patternRuleIndex); + + /// <summary> + /// The same as <seealso cref="#compileParseTreePattern(String, int)"/> but specify a + /// <seealso cref="Lexer"/> rather than trying to deduce it from this parser. + /// </summary> + virtual tree::pattern::ParseTreePattern compileParseTreePattern(const std::string &pattern, int patternRuleIndex, + Lexer *lexer); + + virtual Ref<ANTLRErrorStrategy> getErrorHandler(); + virtual void setErrorHandler(Ref<ANTLRErrorStrategy> const& handler); + + virtual IntStream* getInputStream() override; + void setInputStream(IntStream *input) override; + + virtual TokenStream* getTokenStream(); + + /// Set the token stream and reset the parser. + virtual void setTokenStream(TokenStream *input); + + /// <summary> + /// Match needs to return the current input symbol, which gets put + /// into the label for the associated token ref; e.g., x=ID. + /// </summary> + virtual Token* getCurrentToken(); + + void notifyErrorListeners(const std::string &msg); + + virtual void notifyErrorListeners(Token *offendingToken, const std::string &msg, std::exception_ptr e); + + /// Consume and return the <seealso cref="#getCurrentToken current symbol"/>. + /// <p/> + /// E.g., given the following input with {@code A} being the current + /// lookahead symbol, this function moves the cursor to {@code B} and returns + /// {@code A}. + /// + /// <pre> + /// A B + /// ^ + /// </pre> + /// + /// If the parser is not in error recovery mode, the consumed symbol is added + /// to the parse tree using <seealso cref="ParserRuleContext#addChild(TerminalNode)"/>, and + /// <seealso cref="ParseTreeListener#visitTerminal"/> is called on any parse listeners. + /// If the parser <em>is</em> in error recovery mode, the consumed symbol is + /// added to the parse tree using {@link #createErrorNode(ParserRuleContext, Token)} then + /// {@link ParserRuleContext#addErrorNode(ErrorNode)} and + /// <seealso cref="ParseTreeListener#visitErrorNode"/> is called on any parse + /// listeners. + virtual Token* consume(); + + /// Always called by generated parsers upon entry to a rule. Access field + /// <seealso cref="#_ctx"/> get the current context. + virtual void enterRule(ParserRuleContext *localctx, size_t state, size_t ruleIndex); + + void exitRule(); + + virtual void enterOuterAlt(ParserRuleContext *localctx, size_t altNum); + + /** + * Get the precedence level for the top-most precedence rule. + * + * @return The precedence level for the top-most precedence rule, or -1 if + * the parser context is not nested within a precedence rule. + */ + int getPrecedence() const; + + /// @deprecated Use + /// <seealso cref="#enterRecursionRule(ParserRuleContext, int, int, int)"/> instead. + virtual void enterRecursionRule(ParserRuleContext *localctx, size_t ruleIndex); + virtual void enterRecursionRule(ParserRuleContext *localctx, size_t state, size_t ruleIndex, int precedence); + + /** Like {@link #enterRule} but for recursive rules. + * Make the current context the child of the incoming localctx. + */ + virtual void pushNewRecursionContext(ParserRuleContext *localctx, size_t state, size_t ruleIndex); + virtual void unrollRecursionContexts(ParserRuleContext *parentctx); + virtual ParserRuleContext* getInvokingContext(size_t ruleIndex); + virtual ParserRuleContext* getContext(); + virtual void setContext(ParserRuleContext *ctx); + virtual bool precpred(RuleContext *localctx, int precedence) override; + virtual bool inContext(const std::string &context); + + /// <summary> + /// Checks whether or not {@code symbol} can follow the current state in the + /// ATN. The behavior of this method is equivalent to the following, but is + /// implemented such that the complete context-sensitive follow set does not + /// need to be explicitly constructed. + /// + /// <pre> + /// return getExpectedTokens().contains(symbol); + /// </pre> + /// </summary> + /// <param name="symbol"> the symbol type to check </param> + /// <returns> {@code true} if {@code symbol} can follow the current state in + /// the ATN, otherwise {@code false}. </returns> + virtual bool isExpectedToken(size_t symbol); + + bool isMatchedEOF() const; + + /// <summary> + /// Computes the set of input symbols which could follow the current parser + /// state and context, as given by <seealso cref="#getState"/> and <seealso cref="#getContext"/>, + /// respectively. + /// </summary> + /// <seealso cref= ATN#getExpectedTokens(int, RuleContext) </seealso> + virtual misc::IntervalSet getExpectedTokens(); + + virtual misc::IntervalSet getExpectedTokensWithinCurrentRule(); + + /// Get a rule's index (i.e., {@code RULE_ruleName} field) or INVALID_INDEX if not found. + virtual size_t getRuleIndex(const std::string &ruleName); + + virtual ParserRuleContext* getRuleContext(); + + /// <summary> + /// Return List<String> of the rule names in your parser instance + /// leading up to a call to the current rule. You could override if + /// you want more details such as the file/line info of where + /// in the ATN a rule is invoked. + /// + /// This is very useful for error messages. + /// </summary> + virtual std::vector<std::string> getRuleInvocationStack(); + + virtual std::vector<std::string> getRuleInvocationStack(RuleContext *p); + + /// <summary> + /// For debugging and other purposes. </summary> + virtual std::vector<std::string> getDFAStrings(); + + /// <summary> + /// For debugging and other purposes. </summary> + virtual void dumpDFA(); + + virtual std::string getSourceName(); + + atn::ParseInfo getParseInfo() const; + + /** + * @since 4.3 + */ + void setProfile(bool profile); + + /// <summary> + /// During a parse is sometimes useful to listen in on the rule entry and exit + /// events as well as token matches. This is for quick and dirty debugging. + /// </summary> + virtual void setTrace(bool trace); + + /** + * Gets whether a {@link TraceListener} is registered as a parse listener + * for the parser. + * + * @see #setTrace(boolean) + */ + bool isTrace() const; + + tree::ParseTreeTracker& getTreeTracker() { return _tracker; } + + /** How to create a token leaf node associated with a parent. + * Typically, the terminal node to create is not a function of the parent + * but this method must still set the parent pointer of the terminal node + * returned. I would prefer having {@link ParserRuleContext#addAnyChild(ParseTree)} + * set the parent pointer, but the parent pointer is implementation dependent + * and currently there is no setParent() in {@link TerminalNode} (and can't + * add method in Java 1.7 without breaking backward compatibility). + * + * @since 4.7 + */ + tree::TerminalNode *createTerminalNode(Token *t); + + /** How to create an error node, given a token, associated with a parent. + * Typically, the error node to create is not a function of the parent + * but this method must still set the parent pointer of the terminal node + * returned. I would prefer having {@link ParserRuleContext#addAnyChild(ParseTree)} + * set the parent pointer, but the parent pointer is implementation dependent + * and currently there is no setParent() in {@link ErrorNode} (and can't + * add method in Java 1.7 without breaking backward compatibility). + * + * @since 4.7 + */ + tree::ErrorNode *createErrorNode(Token *t); + + protected: + /// The ParserRuleContext object for the currently executing rule. + /// This is always non-null during the parsing process. + // ml: this is one of the contexts tracked in _allocatedContexts. + ParserRuleContext *_ctx; + + /// The error handling strategy for the parser. The default is DefaultErrorStrategy. + /// See also getErrorHandler. + Ref<ANTLRErrorStrategy> _errHandler; + + /// <summary> + /// The input stream. + /// </summary> + /// <seealso cref= #getInputStream </seealso> + /// <seealso cref= #setInputStream </seealso> + TokenStream *_input; + + std::vector<int> _precedenceStack; + + /// <summary> + /// Specifies whether or not the parser should construct a parse tree during + /// the parsing process. The default value is {@code true}. + /// </summary> + /// <seealso cref= #getBuildParseTree </seealso> + /// <seealso cref= #setBuildParseTree </seealso> + bool _buildParseTrees; + + /// The list of <seealso cref="ParseTreeListener"/> listeners registered to receive + /// events during the parse. + /// <seealso cref= #addParseListener </seealso> + std::vector<tree::ParseTreeListener *> _parseListeners; + + /// <summary> + /// The number of syntax errors reported during parsing. This value is + /// incremented each time <seealso cref="#notifyErrorListeners"/> is called. + /// </summary> + size_t _syntaxErrors; + + /** Indicates parser has match()ed EOF token. See {@link #exitRule()}. */ + bool _matchedEOF; + + virtual void addContextToParseTree(); + + // All rule contexts created during a parse run. This is cleared when calling reset(). + tree::ParseTreeTracker _tracker; + + private: + /// When setTrace(true) is called, a reference to the + /// TraceListener is stored here so it can be easily removed in a + /// later call to setTrace(false). The listener itself is + /// implemented as a parser listener so this field is not directly used by + /// other parser methods. + TraceListener *_tracer; + + void InitializeInstanceFields(); + }; + +} // namespace antlr4 |