diff --git a/runtime/Java/src/org/antlr/v4/runtime/atn/ActionTransition.java b/runtime/Java/src/org/antlr/v4/runtime/atn/ActionTransition.java index 23162f1b5..675113420 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/ActionTransition.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/ActionTransition.java @@ -57,6 +57,11 @@ public final class ActionTransition extends Transition { return true; // we are to be ignored by analysis 'cept for predicates } + @Override + public boolean matches(int symbol, int minVocabSymbol, int maxVocabSymbol) { + return false; + } + @Override public String toString() { return "action_"+ruleIndex+":"+actionIndex; diff --git a/runtime/Java/src/org/antlr/v4/runtime/atn/AtomTransition.java b/runtime/Java/src/org/antlr/v4/runtime/atn/AtomTransition.java index 405cad363..907b5e5e3 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/AtomTransition.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/AtomTransition.java @@ -51,6 +51,11 @@ public final class AtomTransition extends Transition { @NotNull public IntervalSet label() { return IntervalSet.of(label); } + @Override + public boolean matches(int symbol, int minVocabSymbol, int maxVocabSymbol) { + return label == symbol; + } + @Override @NotNull public String toString() { diff --git a/runtime/Java/src/org/antlr/v4/runtime/atn/EpsilonTransition.java b/runtime/Java/src/org/antlr/v4/runtime/atn/EpsilonTransition.java index 3ff8a97a0..a2acae2c4 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/EpsilonTransition.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/EpsilonTransition.java @@ -42,6 +42,11 @@ public final class EpsilonTransition extends Transition { @Override public boolean isEpsilon() { return true; } + @Override + public boolean matches(int symbol, int minVocabSymbol, int maxVocabSymbol) { + return false; + } + @Override @NotNull public String toString() { diff --git a/runtime/Java/src/org/antlr/v4/runtime/atn/LexerATNSimulator.java b/runtime/Java/src/org/antlr/v4/runtime/atn/LexerATNSimulator.java index 0c659afac..6c1a66075 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/LexerATNSimulator.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/LexerATNSimulator.java @@ -491,66 +491,11 @@ public class LexerATNSimulator extends ATNSimulator { @Nullable public ATNState getReachableTarget(Transition trans, int t) { - switch (trans.getSerializationType()) { - case Transition.ATOM: - AtomTransition at = (AtomTransition)trans; - if ( at.label == t ) { - if ( debug ) { - System.out.format("match %s\n", getTokenName(at.label)); - } - - return at.target; - } - - return null; - - case Transition.RANGE: - RangeTransition rt = (RangeTransition)trans; - if ( t>=rt.from && t<=rt.to ) { - if ( debug ) { - System.out.format("match range %s\n", rt); - } - - return rt.target; - } - - return null; - - case Transition.SET: - SetTransition st = (SetTransition)trans; - if ( st.set.contains(t) ) { - if ( debug ) { - System.out.format("match set %s\n", st.set.toString(true)); - } - - return st.target; - } - - return null; - - case Transition.NOT_SET: - NotSetTransition nst = (NotSetTransition)trans; - if (!nst.set.contains(t) && t!=IntStream.EOF) // ~set doesn't not match EOF - { - if ( debug ) { - System.out.format("match ~set %s\n", nst.set.toString(true)); - } - - return nst.target; - } - - return null; - - case Transition.WILDCARD: - if (t != IntStream.EOF) { - return trans.target; - } - - return null; - - default: - return null; + if (trans.matches(t, Lexer.MIN_CHAR_VALUE, Lexer.MAX_CHAR_VALUE)) { + return trans.target; } + + return null; } @NotNull diff --git a/runtime/Java/src/org/antlr/v4/runtime/atn/NotSetTransition.java b/runtime/Java/src/org/antlr/v4/runtime/atn/NotSetTransition.java index 5f66abec3..5e67060bc 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/NotSetTransition.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/NotSetTransition.java @@ -43,6 +43,13 @@ public final class NotSetTransition extends SetTransition { return NOT_SET; } + @Override + public boolean matches(int symbol, int minVocabSymbol, int maxVocabSymbol) { + return symbol >= minVocabSymbol + && symbol <= maxVocabSymbol + && !super.matches(symbol, minVocabSymbol, maxVocabSymbol); + } + @Override public String toString() { return '~'+super.toString(); diff --git a/runtime/Java/src/org/antlr/v4/runtime/atn/ParserATNSimulator.java b/runtime/Java/src/org/antlr/v4/runtime/atn/ParserATNSimulator.java index ca470e926..18a9e37c2 100755 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/ParserATNSimulator.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/ParserATNSimulator.java @@ -913,44 +913,11 @@ public class ParserATNSimulator extends ATNSimulator { @Nullable public ATNState getReachableTarget(@NotNull Transition trans, int ttype) { - switch (trans.getSerializationType()) { - case Transition.ATOM: - AtomTransition at = (AtomTransition)trans; - if ( at.label == ttype ) { - return at.target; - } - return null; - - case Transition.SET: - SetTransition st = (SetTransition)trans; - if ( st.set.contains(ttype) ) { - return st.target; - } - return null; - - case Transition.NOT_SET: - NotSetTransition nst = (NotSetTransition)trans; - if ( !nst.set.contains(ttype) ) { - return nst.target; - } - return null; - - case Transition.RANGE: - RangeTransition rt = (RangeTransition)trans; - if ( ttype>=rt.from && ttype<=rt.to ) { - return rt.target; - } - return null; - - case Transition.WILDCARD: - if (ttype != Token.EOF) { - return trans.target; - } - return null; - - default: - return null; + if (trans.matches(ttype, 0, atn.maxTokenType)) { + return trans.target; } + + return null; } public SemanticContext[] getPredsForAmbigAlts(@NotNull BitSet ambigAlts, diff --git a/runtime/Java/src/org/antlr/v4/runtime/atn/PredicateTransition.java b/runtime/Java/src/org/antlr/v4/runtime/atn/PredicateTransition.java index 4e6d17bcc..36e70fda7 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/PredicateTransition.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/PredicateTransition.java @@ -57,6 +57,11 @@ public final class PredicateTransition extends Transition { @Override public boolean isEpsilon() { return true; } + @Override + public boolean matches(int symbol, int minVocabSymbol, int maxVocabSymbol) { + return false; + } + public SemanticContext.Predicate getPredicate() { return new SemanticContext.Predicate(ruleIndex, predIndex, isCtxDependent); } diff --git a/runtime/Java/src/org/antlr/v4/runtime/atn/RangeTransition.java b/runtime/Java/src/org/antlr/v4/runtime/atn/RangeTransition.java index d353924a5..31b55a36f 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/RangeTransition.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/RangeTransition.java @@ -51,6 +51,11 @@ public final class RangeTransition extends Transition { @NotNull public IntervalSet label() { return IntervalSet.of(from, to); } + @Override + public boolean matches(int symbol, int minVocabSymbol, int maxVocabSymbol) { + return symbol >= from && symbol <= to; + } + @Override @NotNull public String toString() { diff --git a/runtime/Java/src/org/antlr/v4/runtime/atn/RuleTransition.java b/runtime/Java/src/org/antlr/v4/runtime/atn/RuleTransition.java index b7f4cf10f..f876cd635 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/RuleTransition.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/RuleTransition.java @@ -56,4 +56,9 @@ public final class RuleTransition extends Transition { @Override public boolean isEpsilon() { return true; } + + @Override + public boolean matches(int symbol, int minVocabSymbol, int maxVocabSymbol) { + return false; + } } diff --git a/runtime/Java/src/org/antlr/v4/runtime/atn/SetTransition.java b/runtime/Java/src/org/antlr/v4/runtime/atn/SetTransition.java index d3a61482e..48b8b1d75 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/SetTransition.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/SetTransition.java @@ -55,6 +55,11 @@ public class SetTransition extends Transition { @NotNull public IntervalSet label() { return set; } + @Override + public boolean matches(int symbol, int minVocabSymbol, int maxVocabSymbol) { + return set.contains(symbol); + } + @Override @NotNull public String toString() { diff --git a/runtime/Java/src/org/antlr/v4/runtime/atn/Transition.java b/runtime/Java/src/org/antlr/v4/runtime/atn/Transition.java index 063d5d99b..669e22489 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/Transition.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/Transition.java @@ -110,4 +110,6 @@ public abstract class Transition { @Nullable public IntervalSet label() { return null; } + + public abstract boolean matches(int symbol, int minVocabSymbol, int maxVocabSymbol); } diff --git a/runtime/Java/src/org/antlr/v4/runtime/atn/WildcardTransition.java b/runtime/Java/src/org/antlr/v4/runtime/atn/WildcardTransition.java index 22c8edd97..3a960fe58 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/WildcardTransition.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/WildcardTransition.java @@ -39,6 +39,11 @@ public final class WildcardTransition extends Transition { return WILDCARD; } + @Override + public boolean matches(int symbol, int minVocabSymbol, int maxVocabSymbol) { + return symbol >= minVocabSymbol && symbol <= maxVocabSymbol; + } + @Override @NotNull public String toString() {