| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- # 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.
- #
- # need forward declaration
- Token = None
- Lexer = None
- Parser = None
- TokenStream = None
- ATNConfigSet = None
- ParserRulecontext = None
- PredicateTransition = None
- BufferedTokenStream = None
- class UnsupportedOperationException(Exception):
- def __init__(self, msg:str):
- super().__init__(msg)
- class IllegalStateException(Exception):
- def __init__(self, msg:str):
- super().__init__(msg)
- class CancellationException(IllegalStateException):
- def __init__(self, msg:str):
- super().__init__(msg)
- # 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.
- from antlr4.InputStream import InputStream
- from antlr4.ParserRuleContext import ParserRuleContext
- from antlr4.Recognizer import Recognizer
- class RecognitionException(Exception):
- def __init__(self, message:str=None, recognizer:Recognizer=None, input:InputStream=None, ctx:ParserRulecontext=None):
- super().__init__(message)
- self.message = message
- self.recognizer = recognizer
- self.input = input
- self.ctx = ctx
- # The current {@link Token} when an error occurred. Since not all streams
- # support accessing symbols by index, we have to track the {@link Token}
- # instance itself.
- self.offendingToken = None
- # Get the ATN state number the parser was in at the time the error
- # occurred. For {@link NoViableAltException} and
- # {@link LexerNoViableAltException} exceptions, this is the
- # {@link DecisionState} number. For others, it is the state whose outgoing
- # edge we couldn't match.
- self.offendingState = -1
- if recognizer is not None:
- self.offendingState = recognizer.state
- # <p>If the state number is not known, this method returns -1.</p>
- #
- # Gets the set of input symbols which could potentially follow the
- # previously matched symbol at the time this exception was thrown.
- #
- # <p>If the set of expected tokens is not known and could not be computed,
- # this method returns {@code null}.</p>
- #
- # @return The set of token types that could potentially follow the current
- # state in the ATN, or {@code null} if the information is not available.
- #/
- def getExpectedTokens(self):
- if self.recognizer is not None:
- return self.recognizer.atn.getExpectedTokens(self.offendingState, self.ctx)
- else:
- return None
- class LexerNoViableAltException(RecognitionException):
- def __init__(self, lexer:Lexer, input:InputStream, startIndex:int, deadEndConfigs:ATNConfigSet):
- super().__init__(message=None, recognizer=lexer, input=input, ctx=None)
- self.startIndex = startIndex
- self.deadEndConfigs = deadEndConfigs
- def __str__(self):
- symbol = ""
- if self.startIndex >= 0 and self.startIndex < self.input.size:
- symbol = self.input.getText(self.startIndex, self.startIndex)
- # TODO symbol = Utils.escapeWhitespace(symbol, false);
- return "LexerNoViableAltException('" + symbol + "')"
- # Indicates that the parser could not decide which of two or more paths
- # to take based upon the remaining input. It tracks the starting token
- # of the offending input and also knows where the parser was
- # in the various paths when the error. Reported by reportNoViableAlternative()
- #
- class NoViableAltException(RecognitionException):
- def __init__(self, recognizer:Parser, input:TokenStream=None, startToken:Token=None,
- offendingToken:Token=None, deadEndConfigs:ATNConfigSet=None, ctx:ParserRuleContext=None):
- if ctx is None:
- ctx = recognizer._ctx
- if offendingToken is None:
- offendingToken = recognizer.getCurrentToken()
- if startToken is None:
- startToken = recognizer.getCurrentToken()
- if input is None:
- input = recognizer.getInputStream()
- super().__init__(recognizer=recognizer, input=input, ctx=ctx)
- # Which configurations did we try at input.index() that couldn't match input.LT(1)?#
- self.deadEndConfigs = deadEndConfigs
- # The token object at the start index; the input stream might
- # not be buffering tokens so get a reference to it. (At the
- # time the error occurred, of course the stream needs to keep a
- # buffer all of the tokens but later we might not have access to those.)
- self.startToken = startToken
- self.offendingToken = offendingToken
- # This signifies any kind of mismatched input exceptions such as
- # when the current input does not match the expected token.
- #
- class InputMismatchException(RecognitionException):
- def __init__(self, recognizer:Parser):
- super().__init__(recognizer=recognizer, input=recognizer.getInputStream(), ctx=recognizer._ctx)
- self.offendingToken = recognizer.getCurrentToken()
- # A semantic predicate failed during validation. Validation of predicates
- # occurs when normally parsing the alternative just like matching a token.
- # Disambiguating predicate evaluation occurs when we test a predicate during
- # prediction.
- class FailedPredicateException(RecognitionException):
- def __init__(self, recognizer:Parser, predicate:str=None, message:str=None):
- super().__init__(message=self.formatMessage(predicate,message), recognizer=recognizer,
- input=recognizer.getInputStream(), ctx=recognizer._ctx)
- s = recognizer._interp.atn.states[recognizer.state]
- trans = s.transitions[0]
- from antlr4.atn.Transition import PredicateTransition
- if isinstance(trans, PredicateTransition):
- self.ruleIndex = trans.ruleIndex
- self.predicateIndex = trans.predIndex
- else:
- self.ruleIndex = 0
- self.predicateIndex = 0
- self.predicate = predicate
- self.offendingToken = recognizer.getCurrentToken()
- def formatMessage(self, predicate:str, message:str):
- if message is not None:
- return message
- else:
- return "failed predicate: {" + predicate + "}?"
- class ParseCancellationException(CancellationException):
- pass
- del Token
- del Lexer
- del Parser
- del TokenStream
- del ATNConfigSet
- del ParserRulecontext
- del PredicateTransition
- del BufferedTokenStream
|