public class DiagnosticErrorListener extends BaseErrorListener
ANTLRErrorListener
can be used to identify
certain potential correctness and performance problems in grammars. "Reports"
are made by calling Parser.notifyErrorListeners(java.lang.String)
with the appropriate
message.
Modifier and Type | Field and Description |
---|---|
protected boolean |
exactOnly
When
true , only exactly known ambiguities are reported. |
Constructor and Description |
---|
DiagnosticErrorListener()
Initializes a new instance of
DiagnosticErrorListener which only
reports exact ambiguities. |
DiagnosticErrorListener(boolean exactOnly)
Initializes a new instance of
DiagnosticErrorListener , specifying
whether all ambiguities or only exact ambiguities are reported. |
Modifier and Type | Method and Description |
---|---|
protected BitSet |
getConflictingAlts(BitSet reportedAlts,
ATNConfigSet configs)
Computes the set of conflicting or ambiguous alternatives from a
configuration set, if that information was not already provided by the
parser.
|
protected String |
getDecisionDescription(Parser recognizer,
DFA dfa) |
void |
reportAmbiguity(Parser recognizer,
DFA dfa,
int startIndex,
int stopIndex,
boolean exact,
BitSet ambigAlts,
ATNConfigSet configs)
This method is called by the parser when a full-context prediction
results in an ambiguity.
|
void |
reportAttemptingFullContext(Parser recognizer,
DFA dfa,
int startIndex,
int stopIndex,
BitSet conflictingAlts,
ATNConfigSet configs)
This method is called when an SLL conflict occurs and the parser is about
to use the full context information to make an LL decision.
|
void |
reportContextSensitivity(Parser recognizer,
DFA dfa,
int startIndex,
int stopIndex,
int prediction,
ATNConfigSet configs)
This method is called by the parser when a full-context prediction has a
unique result.
|
syntaxError
protected final boolean exactOnly
true
, only exactly known ambiguities are reported.public DiagnosticErrorListener()
DiagnosticErrorListener
which only
reports exact ambiguities.public DiagnosticErrorListener(boolean exactOnly)
DiagnosticErrorListener
, specifying
whether all ambiguities or only exact ambiguities are reported.exactOnly
- true
to report only exact ambiguities, otherwise
false
to report all ambiguities.public void reportAmbiguity(Parser recognizer, DFA dfa, int startIndex, int stopIndex, boolean exact, BitSet ambigAlts, ATNConfigSet configs)
ANTLRErrorListener
Each full-context prediction which does not result in a syntax error
will call either ANTLRErrorListener.reportContextSensitivity(org.antlr.v4.runtime.Parser, org.antlr.v4.runtime.dfa.DFA, int, int, int, org.antlr.v4.runtime.atn.ATNConfigSet)
or
ANTLRErrorListener.reportAmbiguity(org.antlr.v4.runtime.Parser, org.antlr.v4.runtime.dfa.DFA, int, int, boolean, java.util.BitSet, org.antlr.v4.runtime.atn.ATNConfigSet)
.
When ambigAlts
is not null, it contains the set of potentially
viable alternatives identified by the prediction algorithm. When
ambigAlts
is null, use ATNConfigSet.getAlts()
to obtain the
represented alternatives from the configs
argument.
When exact
is true
, all of the potentially
viable alternatives are truly viable, i.e. this is reporting an exact
ambiguity. When exact
is false
, at least two of
the potentially viable alternatives are viable for the current input, but
the prediction algorithm terminated as soon as it determined that at
least the minimum potentially viable alternative is truly
viable.
When the PredictionMode.LL_EXACT_AMBIG_DETECTION
prediction
mode is used, the parser is required to identify exact ambiguities so
exact
will always be true
.
This method is not used by lexers.
reportAmbiguity
in interface ANTLRErrorListener
reportAmbiguity
in class BaseErrorListener
recognizer
- the parser instancedfa
- the DFA for the current decisionstartIndex
- the input index where the decision startedstopIndex
- the input input where the ambiguity was identifiedexact
- true
if the ambiguity is exactly known, otherwise
false
. This is always true
when
PredictionMode.LL_EXACT_AMBIG_DETECTION
is used.ambigAlts
- the potentially ambiguous alternatives, or null
to indicate that the potentially ambiguous alternatives are the complete
set of represented alternatives in configs
configs
- the ATN configuration set where the ambiguity was
identifiedpublic void reportAttemptingFullContext(Parser recognizer, DFA dfa, int startIndex, int stopIndex, BitSet conflictingAlts, ATNConfigSet configs)
ANTLRErrorListener
If one or more configurations in configs
contains a semantic
predicate, the predicates are evaluated before this method is called. The
subset of alternatives which are still viable after predicates are
evaluated is reported in conflictingAlts
.
This method is not used by lexers.
reportAttemptingFullContext
in interface ANTLRErrorListener
reportAttemptingFullContext
in class BaseErrorListener
recognizer
- the parser instancedfa
- the DFA for the current decisionstartIndex
- the input index where the decision startedstopIndex
- the input index where the SLL conflict occurredconflictingAlts
- The specific conflicting alternatives. If this is
null
, the conflicting alternatives are all alternatives
represented in configs
. At the moment, conflictingAlts is non-null
(for the reference implementation, but Sam's optimized version can see this
as null).configs
- the ATN configuration set where the SLL conflict was
detectedpublic void reportContextSensitivity(Parser recognizer, DFA dfa, int startIndex, int stopIndex, int prediction, ATNConfigSet configs)
ANTLRErrorListener
Each full-context prediction which does not result in a syntax error
will call either ANTLRErrorListener.reportContextSensitivity(org.antlr.v4.runtime.Parser, org.antlr.v4.runtime.dfa.DFA, int, int, int, org.antlr.v4.runtime.atn.ATNConfigSet)
or
ANTLRErrorListener.reportAmbiguity(org.antlr.v4.runtime.Parser, org.antlr.v4.runtime.dfa.DFA, int, int, boolean, java.util.BitSet, org.antlr.v4.runtime.atn.ATNConfigSet)
.
For prediction implementations that only evaluate full-context
predictions when an SLL conflict is found (including the default
ParserATNSimulator
implementation), this method reports cases
where SLL conflicts were resolved to unique full-context predictions,
i.e. the decision was context-sensitive. This report does not necessarily
indicate a problem, and it may appear even in completely unambiguous
grammars.
configs
may have more than one represented alternative if the
full-context prediction algorithm does not evaluate predicates before
beginning the full-context prediction. In all cases, the final prediction
is passed as the prediction
argument.
Note that the definition of "context sensitivity" in this method
differs from the concept in DecisionInfo.contextSensitivities
.
This method reports all instances where an SLL conflict occurred but LL
parsing produced a unique result, whether or not that unique result
matches the minimum alternative in the SLL conflicting set.
This method is not used by lexers.
reportContextSensitivity
in interface ANTLRErrorListener
reportContextSensitivity
in class BaseErrorListener
recognizer
- the parser instancedfa
- the DFA for the current decisionstartIndex
- the input index where the decision startedstopIndex
- the input index where the context sensitivity was
finally determinedprediction
- the unambiguous result of the full-context predictionconfigs
- the ATN configuration set where the unambiguous prediction
was determinedprotected BitSet getConflictingAlts(BitSet reportedAlts, ATNConfigSet configs)
reportedAlts
- The set of conflicting or ambiguous alternatives, as
reported by the parser.configs
- The conflicting or ambiguous configuration set.reportedAlts
if it is not null
, otherwise
returns the set of alternatives represented in configs
.Copyright © 1992–2018 ANTLR. All rights reserved.