Beispiel #1
0
    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())
Beispiel #3
0
 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 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())
Beispiel #6
0
    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())
Beispiel #7
0
 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)