From 4c132b8a3185760a4d84e8bcfd304e0d0874f0aa Mon Sep 17 00:00:00 2001 From: Terence Parr Date: Thu, 11 Jun 2015 18:32:45 -0700 Subject: [PATCH 1/3] Fixes #899. Add error nodes to interpret or parse trees. Conflicts: runtime/Java/src/org/antlr/v4/runtime/ParserInterpreter.java --- .../antlr/v4/runtime/ParserInterpreter.java | 46 ++++++++++++++++++- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/runtime/Java/src/org/antlr/v4/runtime/ParserInterpreter.java b/runtime/Java/src/org/antlr/v4/runtime/ParserInterpreter.java index 4e52cfcd7..820941e86 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/ParserInterpreter.java +++ b/runtime/Java/src/org/antlr/v4/runtime/ParserInterpreter.java @@ -218,7 +218,7 @@ public class ParserInterpreter extends Parser { setState(atn.ruleToStopState[p.ruleIndex].stateNumber); getContext().exception = e; getErrorHandler().reportError(this, e); - getErrorHandler().recover(this, e); + recover(e); } break; @@ -271,7 +271,7 @@ public class ParserInterpreter extends Parser { case Transition.SET: case Transition.NOT_SET: if (!transition.matches(_input.LA(1), Token.MIN_USER_TOKEN_TYPE, 65535)) { - _errHandler.recoverInline(this); + recoverInline(); } matchWildcard(); break; @@ -404,4 +404,46 @@ public class ParserInterpreter extends Parser { overrideDecisionInputIndex = tokenIndex; overrideDecisionAlt = forcedAlt; } + + /** Rely on the error handler for this parser but, if no tokens are consumed + * to recover, add an error node. Otherwise, nothing is seen in the parse + * tree. + */ + protected void recover(RecognitionException e) { + int i = _input.index(); + getErrorHandler().recover(this, e); + if ( _input.index()==i ) { + // no input consumed, better add an error node + if ( e instanceof InputMismatchException ) { + InputMismatchException ime = (InputMismatchException)e; + Token tok = e.getOffendingToken(); + int expectedTokenType = ime.getExpectedTokens().getMinElement(); // get any element + String tokenText; + if ( expectedTokenType== Token.EOF ) tokenText = ""; + else tokenText = ""; + + Token errToken = + getTokenFactory().create(new Pair(tok.getTokenSource(), tok.getTokenSource().getInputStream()), + expectedTokenType, tokenText, + Token.DEFAULT_CHANNEL, + -1, -1, // invalid start/stop + tok.getLine(), tok.getCharPositionInLine()); + _ctx.addErrorNode(errToken); + } + else { // NoViableAlt + Token tok = e.getOffendingToken(); + Token errToken = + getTokenFactory().create(new Pair(tok.getTokenSource(), tok.getTokenSource().getInputStream()), + Token.INVALID_TYPE, "", + Token.DEFAULT_CHANNEL, + -1, -1, // invalid start/stop + tok.getLine(), tok.getCharPositionInLine()); + _ctx.addErrorNode(errToken); + } + } + } + + protected Token recoverInline() { + return _errHandler.recoverInline(this); + } } From 8524630c03752ff1d43ffa4e192c3b730facd8d8 Mon Sep 17 00:00:00 2001 From: parrt Date: Fri, 12 Jun 2015 12:36:42 -0700 Subject: [PATCH 2/3] show not one of the expected. --- runtime/Java/src/org/antlr/v4/runtime/ParserInterpreter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/Java/src/org/antlr/v4/runtime/ParserInterpreter.java b/runtime/Java/src/org/antlr/v4/runtime/ParserInterpreter.java index 820941e86..9aa1c5afd 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/ParserInterpreter.java +++ b/runtime/Java/src/org/antlr/v4/runtime/ParserInterpreter.java @@ -420,7 +420,7 @@ public class ParserInterpreter extends Parser { int expectedTokenType = ime.getExpectedTokens().getMinElement(); // get any element String tokenText; if ( expectedTokenType== Token.EOF ) tokenText = ""; - else tokenText = ""; + else tokenText = ""; Token errToken = getTokenFactory().create(new Pair(tok.getTokenSource(), tok.getTokenSource().getInputStream()), From 12a36946e89306a3886541be98be6190d07662f4 Mon Sep 17 00:00:00 2001 From: parrt Date: Fri, 12 Jun 2015 12:43:30 -0700 Subject: [PATCH 3/3] actually just show text of erroneous token in red in treeviewer. --- runtime/Java/src/org/antlr/v4/runtime/ParserInterpreter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runtime/Java/src/org/antlr/v4/runtime/ParserInterpreter.java b/runtime/Java/src/org/antlr/v4/runtime/ParserInterpreter.java index 9aa1c5afd..f8f68f721 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/ParserInterpreter.java +++ b/runtime/Java/src/org/antlr/v4/runtime/ParserInterpreter.java @@ -424,7 +424,7 @@ public class ParserInterpreter extends Parser { Token errToken = getTokenFactory().create(new Pair(tok.getTokenSource(), tok.getTokenSource().getInputStream()), - expectedTokenType, tokenText, + expectedTokenType, tok.getText(), Token.DEFAULT_CHANNEL, -1, -1, // invalid start/stop tok.getLine(), tok.getCharPositionInLine()); @@ -434,7 +434,7 @@ public class ParserInterpreter extends Parser { Token tok = e.getOffendingToken(); Token errToken = getTokenFactory().create(new Pair(tok.getTokenSource(), tok.getTokenSource().getInputStream()), - Token.INVALID_TYPE, "", + Token.INVALID_TYPE, tok.getText(), Token.DEFAULT_CHANNEL, -1, -1, // invalid start/stop tok.getLine(), tok.getCharPositionInLine());