| /* 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. |
| */ |
| |
| #include "Exceptions.h" |
| #include "ParserRuleContext.h" |
| #include "InputMismatchException.h" |
| #include "Parser.h" |
| |
| #include "BailErrorStrategy.h" |
| |
| using namespace antlr4; |
| |
| void BailErrorStrategy::recover(Parser *recognizer, std::exception_ptr e) { |
| ParserRuleContext *context = recognizer->getContext(); |
| do { |
| context->exception = e; |
| if (context->parent == nullptr) |
| break; |
| context = static_cast<ParserRuleContext *>(context->parent); |
| } while (true); |
| |
| try { |
| std::rethrow_exception(e); // Throw the exception to be able to catch and rethrow nested. |
| #if defined(_MSC_FULL_VER) && _MSC_FULL_VER < 190023026 |
| } catch (RecognitionException &inner) { |
| throw ParseCancellationException(inner.what()); |
| #else |
| } catch (RecognitionException & /*inner*/) { |
| std::throw_with_nested(ParseCancellationException()); |
| #endif |
| } |
| } |
| |
| Token* BailErrorStrategy::recoverInline(Parser *recognizer) { |
| InputMismatchException e(recognizer); |
| std::exception_ptr exception = std::make_exception_ptr(e); |
| |
| ParserRuleContext *context = recognizer->getContext(); |
| do { |
| context->exception = exception; |
| if (context->parent == nullptr) |
| break; |
| context = static_cast<ParserRuleContext *>(context->parent); |
| } while (true); |
| |
| try { |
| throw e; |
| #if defined(_MSC_FULL_VER) && _MSC_FULL_VER < 190023026 |
| } catch (InputMismatchException &inner) { |
| throw ParseCancellationException(inner.what()); |
| #else |
| } catch (InputMismatchException & /*inner*/) { |
| std::throw_with_nested(ParseCancellationException()); |
| #endif |
| } |
| } |
| |
| void BailErrorStrategy::sync(Parser * /*recognizer*/) { |
| } |