def recover(self, recognizer: Parser, e: RecognitionException): # Mark the context (and "some" parent contexts): recognizer._ctx.exception = e # Try to do custom recovery using control-flow: controlRecoverSet = self.getControlRecoverySet(recognizer) index = recognizer._input.index state = recognizer.state if controlRecoverSet.intervals: self.consumeUntil(recognizer, controlRecoverSet) # Same state, nothing was done, fallback to parent: if recognizer.state == state and recognizer._input.index == index: super().recover(recognizer, e) else: # Something was consumed, but do we have to consume the next token # to close the statement? Yes if the current context if a "block" # context and the next context its close token: for tctx, tok in self.BlockContexts.items(): if (isinstance(recognizer._ctx, tctx) and recognizer.getTokenStream().LA(1) == tok): recognizer.consume() break return recognizer.getTokenStream().LT(1)
def reportContextSensitivity(self, recognizer:Parser, dfa:DFA, startIndex:int, stopIndex:int, prediction:int, configs:ATNConfigSet): with StringIO() as buf: buf.write("reportContextSensitivity d=") buf.write(self.getDecisionDescription(recognizer, dfa)) buf.write(", input='") buf.write(recognizer.getTokenStream().getText((startIndex, stopIndex))) buf.write("'") recognizer.notifyErrorListeners(buf.getvalue())
def reportAttemptingFullContext(self, recognizer:Parser, dfa:DFA, startIndex:int, stopIndex:int, conflictingAlts:set, configs:ATNConfigSet): with StringIO() as buf: buf.write(u"reportAttemptingFullContext d=") buf.write(self.getDecisionDescription(recognizer, dfa)) buf.write(u", input='") buf.write(recognizer.getTokenStream().getText((startIndex, stopIndex))) buf.write(u"'") recognizer.notifyErrorListeners(buf.getvalue())
def messageNoViableAlternative(self, recognizer: Parser, e: NoViableAltException) -> str: tokens = recognizer.getTokenStream() if tokens is not None: if e.startToken.type == Token.EOF: input = "<EOF>" else: input = tokens.getText(e.startToken, e.offendingToken) else: input = "<unknown input>" return "no viable alternative at input " + self.escapeWSAndQuote(input)
def reportAmbiguity(self, recognizer:Parser, dfa:DFA, startIndex:int, stopIndex:int, exact:bool, ambigAlts:set, configs:ATNConfigSet): if self.exactOnly and not exact: return with StringIO() as buf: buf.write("reportAmbiguity d=") buf.write(self.getDecisionDescription(recognizer, dfa)) buf.write(": ambigAlts=") buf.write(str(self.getConflictingAlts(ambigAlts, configs))) buf.write(", input='") buf.write(recognizer.getTokenStream().getText((startIndex, stopIndex))) buf.write("'") recognizer.notifyErrorListeners(buf.getvalue())