/* 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 "Exceptions.h" namespace antlr4 { /// The root of the ANTLR exception hierarchy. In general, ANTLR tracks just /// 3 kinds of errors: prediction errors, failed predicate errors, and /// mismatched input errors. In each case, the parser knows where it is /// in the input, where it is in the ATN, the rule invocation stack, /// and what kind of problem occurred. class ANTLR4CPP_PUBLIC RecognitionException : public RuntimeException { private: /// The Recognizer where this exception originated. Recognizer *_recognizer; IntStream *_input; ParserRuleContext *_ctx; /// The current Token when an error occurred. Since not all streams /// support accessing symbols by index, we have to track the Token /// instance itself. Token *_offendingToken; size_t _offendingState; public: RecognitionException(Recognizer *recognizer, IntStream *input, ParserRuleContext *ctx, Token *offendingToken = nullptr); RecognitionException(const std::string &message, Recognizer *recognizer, IntStream *input, ParserRuleContext *ctx, Token *offendingToken = nullptr); RecognitionException(RecognitionException const&) = default; ~RecognitionException(); RecognitionException& operator=(RecognitionException const&) = default; /// Get the ATN state number the parser was in at the time the error /// occurred. For NoViableAltException and /// LexerNoViableAltException exceptions, this is the /// DecisionState number. For others, it is the state whose outgoing /// edge we couldn't match. /// /// If the state number is not known, this method returns -1. virtual size_t getOffendingState() const; protected: void setOffendingState(size_t offendingState); /// Gets the set of input symbols which could potentially follow the /// previously matched symbol at the time this exception was thrown. /// /// If the set of expected tokens is not known and could not be computed, /// this method returns an empty set. /// /// @returns The set of token types that could potentially follow the current /// state in the ATN, or an empty set if the information is not available. public: virtual misc::IntervalSet getExpectedTokens() const; /// /// Gets the at the time this exception was thrown. ///

/// If the context is not available, this method returns {@code null}. ///

/// The at the time this exception was thrown. /// If the context is not available, this method returns {@code null}. virtual RuleContext* getCtx() const; /// /// Gets the input stream which is the symbol source for the recognizer where /// this exception was thrown. ///

/// If the input stream is not available, this method returns {@code null}. ///

/// The input stream which is the symbol source for the recognizer /// where this exception was thrown, or {@code null} if the stream is not /// available. virtual IntStream* getInputStream() const; virtual Token* getOffendingToken() const; /// /// Gets the where this exception occurred. ///

/// If the recognizer is not available, this method returns {@code null}. ///

/// The recognizer where this exception occurred, or {@code null} if /// the recognizer is not available. virtual Recognizer* getRecognizer() const; private: void InitializeInstanceFields(); }; } // namespace antlr4