public class DefaultErrorStrategy extends Object implements ANTLRErrorStrategy
ANTLRErrorStrategy
used for
error reporting and recovery in ANTLR parsers.Modifier and Type | Field and Description |
---|---|
protected boolean |
errorRecoveryMode
Indicates whether the error strategy is currently "recovering from an
error".
|
protected int |
lastErrorIndex
The index into the input stream where the last error occurred.
|
protected IntervalSet |
lastErrorStates |
Constructor and Description |
---|
DefaultErrorStrategy() |
Modifier and Type | Method and Description |
---|---|
protected void |
beginErrorCondition(Parser recognizer)
This method is called to enter error recovery mode when a recognition
exception is reported.
|
protected void |
consumeUntil(Parser recognizer,
IntervalSet set)
Consume tokens until one matches the given token set.
|
protected void |
endErrorCondition(Parser recognizer)
This method is called to leave error recovery mode after recovering from
a recognition exception.
|
protected String |
escapeWSAndQuote(String s) |
protected IntervalSet |
getErrorRecoverySet(Parser recognizer) |
protected IntervalSet |
getExpectedTokens(Parser recognizer) |
protected Token |
getMissingSymbol(Parser recognizer)
Conjure up a missing token during error recovery.
|
protected String |
getSymbolText(Token symbol) |
protected int |
getSymbolType(Token symbol) |
protected String |
getTokenErrorDisplay(Token t)
How should a token be displayed in an error message? The default
is to display just the text, but during development you might
want to have a lot of information spit out.
|
boolean |
inErrorRecoveryMode(Parser recognizer)
Tests whether or not
recognizer is in the process of recovering
from an error. |
void |
recover(Parser recognizer,
RecognitionException e)
This method is called to recover from exception
e . |
Token |
recoverInline(Parser recognizer)
This method is called when an unexpected symbol is encountered during an
inline match operation, such as
Parser.match(int) . |
void |
reportError(Parser recognizer,
RecognitionException e)
Report any kind of
RecognitionException . |
protected void |
reportFailedPredicate(Parser recognizer,
FailedPredicateException e)
This is called by
reportError(org.antlr.v4.runtime.Parser, org.antlr.v4.runtime.RecognitionException) when the exception is a
FailedPredicateException . |
protected void |
reportInputMismatch(Parser recognizer,
InputMismatchException e)
This is called by
reportError(org.antlr.v4.runtime.Parser, org.antlr.v4.runtime.RecognitionException) when the exception is an
InputMismatchException . |
void |
reportMatch(Parser recognizer)
This method is called by when the parser successfully matches an input
symbol.
|
protected void |
reportMissingToken(Parser recognizer)
This method is called to report a syntax error which requires the
insertion of a missing token into the input stream.
|
protected void |
reportNoViableAlternative(Parser recognizer,
NoViableAltException e)
This is called by
reportError(org.antlr.v4.runtime.Parser, org.antlr.v4.runtime.RecognitionException) when the exception is a
NoViableAltException . |
protected void |
reportUnwantedToken(Parser recognizer)
This method is called to report a syntax error which requires the removal
of a token from the input stream.
|
void |
reset(Parser recognizer)
Reset the error handler state for the specified
recognizer . |
protected Token |
singleTokenDeletion(Parser recognizer)
This method implements the single-token deletion inline error recovery
strategy.
|
protected boolean |
singleTokenInsertion(Parser recognizer)
This method implements the single-token insertion inline error recovery
strategy.
|
void |
sync(Parser recognizer)
The default implementation of
ANTLRErrorStrategy.sync(org.antlr.v4.runtime.Parser) makes sure
that the current lookahead symbol is consistent with what were expecting
at this point in the ATN. |
protected boolean errorRecoveryMode
protected int lastErrorIndex
protected IntervalSet lastErrorStates
public void reset(Parser recognizer)
recognizer
.
The default implementation simply calls endErrorCondition(org.antlr.v4.runtime.Parser)
to
ensure that the handler is not in error recovery mode.
reset
in interface ANTLRErrorStrategy
recognizer
- the parser instanceprotected void beginErrorCondition(Parser recognizer)
recognizer
- the parser instancepublic boolean inErrorRecoveryMode(Parser recognizer)
recognizer
is in the process of recovering
from an error. In error recovery mode, Parser.consume()
adds
symbols to the parse tree by calling
ParserRuleContext.addErrorNode(Token)
instead of
ParserRuleContext.addChild(Token)
.inErrorRecoveryMode
in interface ANTLRErrorStrategy
recognizer
- the parser instancetrue
if the parser is currently recovering from a parse
error, otherwise false
protected void endErrorCondition(Parser recognizer)
recognizer
- public void reportMatch(Parser recognizer)
The default implementation simply calls endErrorCondition(org.antlr.v4.runtime.Parser)
.
reportMatch
in interface ANTLRErrorStrategy
recognizer
- the parser instancepublic void reportError(Parser recognizer, RecognitionException e)
RecognitionException
. This method is called by
the default exception handler generated for a rule method.
The default implementation returns immediately if the handler is already
in error recovery mode. Otherwise, it calls beginErrorCondition(org.antlr.v4.runtime.Parser)
and dispatches the reporting task based on the runtime type of e
according to the following table.
NoViableAltException
: Dispatches the call to
reportNoViableAlternative(org.antlr.v4.runtime.Parser, org.antlr.v4.runtime.NoViableAltException)
InputMismatchException
: Dispatches the call to
reportInputMismatch(org.antlr.v4.runtime.Parser, org.antlr.v4.runtime.InputMismatchException)
FailedPredicateException
: Dispatches the call to
reportFailedPredicate(org.antlr.v4.runtime.Parser, org.antlr.v4.runtime.FailedPredicateException)
Parser.notifyErrorListeners(java.lang.String)
to report
the exceptionreportError
in interface ANTLRErrorStrategy
recognizer
- the parser instancee
- the recognition exception to reportpublic void recover(Parser recognizer, RecognitionException e)
e
. This method is
called after ANTLRErrorStrategy.reportError(org.antlr.v4.runtime.Parser, org.antlr.v4.runtime.RecognitionException)
by the default exception handler
generated for a rule method.
The default implementation resynchronizes the parser by consuming tokens until we find one in the resynchronization set--loosely the set of tokens that can follow the current rule.
recover
in interface ANTLRErrorStrategy
recognizer
- the parser instancee
- the recognition exception to recover fromANTLRErrorStrategy.reportError(org.antlr.v4.runtime.Parser, org.antlr.v4.runtime.RecognitionException)
public void sync(Parser recognizer) throws RecognitionException
ANTLRErrorStrategy.sync(org.antlr.v4.runtime.Parser)
makes sure
that the current lookahead symbol is consistent with what were expecting
at this point in the ATN. You can call this anytime but ANTLR only
generates code to check before subrules/loops and each iteration.
Implements Jim Idle's magic sync mechanism in closures and optional subrules. E.g.,
a : sync ( stuff sync )* ; sync : {consume to what can follow sync} ;At the start of a sub rule upon error,
sync(org.antlr.v4.runtime.Parser)
performs single
token deletion, if possible. If it can't do that, it bails on the current
rule and uses the default error recovery, which consumes until the
resynchronization set of the current rule.
If the sub rule is optional ((...)?
, (...)*
, or block
with an empty alternative), then the expected set includes what follows
the subrule.
During loop iteration, it consumes until it sees a token that can start a sub rule or what follows loop. Yes, that is pretty aggressive. We opt to stay in the loop as long as possible.
ORIGINS
Previous versions of ANTLR did a poor job of their recovery within loops. A single mismatch token or missing token would force the parser to bail out of the entire rules surrounding the loop. So, for rule
classDef : 'class' ID '{' member* '}'input with an extra token between members would force the parser to consume until it found the next class definition rather than the next member definition of the current class.
This functionality cost a little bit of effort because the parser has to compare token set at the start of the loop and at each iteration. If for some reason speed is suffering for you, you can turn off this functionality by simply overriding this method as a blank { }.
sync
in interface ANTLRErrorStrategy
recognizer
- the parser instanceRecognitionException
- if an error is detected by the error
strategy but cannot be automatically recovered at the current state in
the parsing processsync(org.antlr.v4.runtime.Parser)
protected void reportNoViableAlternative(Parser recognizer, NoViableAltException e)
reportError(org.antlr.v4.runtime.Parser, org.antlr.v4.runtime.RecognitionException)
when the exception is a
NoViableAltException
.recognizer
- the parser instancee
- the recognition exceptionreportError(org.antlr.v4.runtime.Parser, org.antlr.v4.runtime.RecognitionException)
protected void reportInputMismatch(Parser recognizer, InputMismatchException e)
reportError(org.antlr.v4.runtime.Parser, org.antlr.v4.runtime.RecognitionException)
when the exception is an
InputMismatchException
.recognizer
- the parser instancee
- the recognition exceptionreportError(org.antlr.v4.runtime.Parser, org.antlr.v4.runtime.RecognitionException)
protected void reportFailedPredicate(Parser recognizer, FailedPredicateException e)
reportError(org.antlr.v4.runtime.Parser, org.antlr.v4.runtime.RecognitionException)
when the exception is a
FailedPredicateException
.recognizer
- the parser instancee
- the recognition exceptionreportError(org.antlr.v4.runtime.Parser, org.antlr.v4.runtime.RecognitionException)
protected void reportUnwantedToken(Parser recognizer)
LT(1)
symbol and has not yet been
removed from the input stream. When this method returns,
recognizer
is in error recovery mode.
This method is called when singleTokenDeletion(org.antlr.v4.runtime.Parser)
identifies
single-token deletion as a viable recovery strategy for a mismatched
input error.
The default implementation simply returns if the handler is already in
error recovery mode. Otherwise, it calls beginErrorCondition(org.antlr.v4.runtime.Parser)
to
enter error recovery mode, followed by calling
Parser.notifyErrorListeners(java.lang.String)
.
recognizer
- the parser instanceprotected void reportMissingToken(Parser recognizer)
recognizer
is in error recovery mode.
This method is called when singleTokenInsertion(org.antlr.v4.runtime.Parser)
identifies
single-token insertion as a viable recovery strategy for a mismatched
input error.
The default implementation simply returns if the handler is already in
error recovery mode. Otherwise, it calls beginErrorCondition(org.antlr.v4.runtime.Parser)
to
enter error recovery mode, followed by calling
Parser.notifyErrorListeners(java.lang.String)
.
recognizer
- the parser instancepublic Token recoverInline(Parser recognizer) throws RecognitionException
Parser.match(int)
. If the error
strategy successfully recovers from the match failure, this method
returns the Token
instance which should be treated as the
successful result of the match.
This method handles the consumption of any tokens - the caller should
not call Parser.consume()
after a successful recovery.
Note that the calling code will not report an error if this method
returns successfully. The error strategy implementation is responsible
for calling Parser.notifyErrorListeners(java.lang.String)
as appropriate.
The default implementation attempts to recover from the mismatched input
by using single token insertion and deletion as described below. If the
recovery attempt fails, this method throws an
InputMismatchException
.
EXTRA TOKEN (single token deletion)
LA(1)
is not what we are looking for. If LA(2)
has the
right token, however, then assume LA(1)
is some extra spurious
token and delete it. Then consume and return the next token (which was
the LA(2)
token) as the successful result of the match operation.
This recovery strategy is implemented by singleTokenDeletion(org.antlr.v4.runtime.Parser)
.
MISSING TOKEN (single token insertion)
If current token (at LA(1)
) is consistent with what could come
after the expected LA(1)
token, then assume the token is missing
and use the parser's TokenFactory
to create it on the fly. The
"insertion" is performed by returning the created token as the successful
result of the match operation.
This recovery strategy is implemented by singleTokenInsertion(org.antlr.v4.runtime.Parser)
.
EXAMPLE
For example, Input i=(3;
is clearly missing the ')'
. When
the parser returns from the nested call to expr
, it will have
call chain:
stat → expr → atomand it will be trying to match the
')'
at this point in the
derivation:
=> ID '=' '(' INT ')' ('+' atom)* ';' ^The attempt to match
')'
will fail when it sees ';'
and
call recoverInline(org.antlr.v4.runtime.Parser)
. To recover, it sees that LA(1)==';'
is in the set of tokens that can follow the ')'
token reference
in rule atom
. It can assume that you forgot the ')'
.recoverInline
in interface ANTLRErrorStrategy
recognizer
- the parser instanceRecognitionException
- if the error strategy was not able to
recover from the unexpected input symbolprotected boolean singleTokenInsertion(Parser recognizer)
recoverInline(org.antlr.v4.runtime.Parser)
if the single-token
deletion strategy fails to recover from the mismatched input. If this
method returns true
, recognizer
will be in error recovery
mode.
This method determines whether or not single-token insertion is viable by
checking if the LA(1)
input symbol could be successfully matched
if it were instead the LA(2)
symbol. If this method returns
true
, the caller is responsible for creating and inserting a
token with the correct type to produce this behavior.
recognizer
- the parser instancetrue
if single-token insertion is a viable recovery
strategy for the current mismatched input, otherwise false
protected Token singleTokenDeletion(Parser recognizer)
recoverInline(org.antlr.v4.runtime.Parser)
to attempt to recover
from mismatched input. If this method returns null, the parser and error
handler state will not have changed. If this method returns non-null,
recognizer
will not be in error recovery mode since the
returned token was a successful match.
If the single-token deletion is successful, this method calls
reportUnwantedToken(org.antlr.v4.runtime.Parser)
to report the error, followed by
Parser.consume()
to actually "delete" the extraneous token. Then,
before returning reportMatch(org.antlr.v4.runtime.Parser)
is called to signal a successful
match.
recognizer
- the parser instanceToken
instance if single-token
deletion successfully recovers from the mismatched input, otherwise
null
protected Token getMissingSymbol(Parser recognizer)
protected IntervalSet getExpectedTokens(Parser recognizer)
protected String getTokenErrorDisplay(Token t)
protected int getSymbolType(Token symbol)
protected IntervalSet getErrorRecoverySet(Parser recognizer)
protected void consumeUntil(Parser recognizer, IntervalSet set)
Copyright © 1992-2015 ANTLR. All Rights Reserved.