From 60df00be4f3b26959b3436299dfeba0814817ed8 Mon Sep 17 00:00:00 2001 From: Sam Harwell Date: Wed, 1 Aug 2012 14:35:37 -0500 Subject: [PATCH 1/3] Transition classes override getSerializationType() --- .../Java/src/org/antlr/v4/runtime/atn/ActionTransition.java | 5 +++++ .../Java/src/org/antlr/v4/runtime/atn/AtomTransition.java | 5 +++++ .../Java/src/org/antlr/v4/runtime/atn/EpsilonTransition.java | 5 +++++ .../Java/src/org/antlr/v4/runtime/atn/NotSetTransition.java | 5 +++++ .../src/org/antlr/v4/runtime/atn/PredicateTransition.java | 5 +++++ .../Java/src/org/antlr/v4/runtime/atn/RangeTransition.java | 5 +++++ .../Java/src/org/antlr/v4/runtime/atn/RuleTransition.java | 5 +++++ runtime/Java/src/org/antlr/v4/runtime/atn/SetTransition.java | 5 +++++ runtime/Java/src/org/antlr/v4/runtime/atn/Transition.java | 2 +- .../src/org/antlr/v4/runtime/atn/WildcardTransition.java | 5 +++++ 10 files changed, 46 insertions(+), 1 deletion(-) 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 9cd99ad52..546fdea35 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/ActionTransition.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/ActionTransition.java @@ -47,6 +47,11 @@ public class ActionTransition extends Transition { this.isCtxDependent = isCtxDependent; } + @Override + public int getSerializationType() { + return ACTION; + } + @Override public boolean isEpsilon() { return true; // we are to be ignored by analysis 'cept for predicates 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 34cc3c7f8..8adb833f3 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/AtomTransition.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/AtomTransition.java @@ -42,6 +42,11 @@ public class AtomTransition extends Transition { this.label = label; } + @Override + public int getSerializationType() { + return ATOM; + } + @Override @NotNull public IntervalSet label() { return IntervalSet.of(label); } 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 9357c58b2..8678ecf1a 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/EpsilonTransition.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/EpsilonTransition.java @@ -34,6 +34,11 @@ import org.antlr.v4.runtime.misc.NotNull; public class EpsilonTransition extends Transition { public EpsilonTransition(@NotNull ATNState target) { super(target); } + @Override + public int getSerializationType() { + return EPSILON; + } + @Override public boolean isEpsilon() { return true; } 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 f4640f6c6..11e060283 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/NotSetTransition.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/NotSetTransition.java @@ -38,6 +38,11 @@ public class NotSetTransition extends SetTransition { super(target, set); } + @Override + public int getSerializationType() { + return NOT_SET; + } + @Override public String toString() { return '~'+super.toString(); 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 9cc54d4c7..32b389b2f 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/PredicateTransition.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/PredicateTransition.java @@ -49,6 +49,11 @@ public class PredicateTransition extends Transition { this.isCtxDependent = isCtxDependent; } + @Override + public int getSerializationType() { + return PREDICATE; + } + @Override public boolean isEpsilon() { return true; } 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 53e9ae1b7..b2212c3f7 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/RangeTransition.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/RangeTransition.java @@ -42,6 +42,11 @@ public class RangeTransition extends Transition { this.to = to; } + @Override + public int getSerializationType() { + return RANGE; + } + @Override @NotNull public IntervalSet label() { return IntervalSet.of(from, to); } 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 d52d1837f..4c1128083 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/RuleTransition.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/RuleTransition.java @@ -49,6 +49,11 @@ public class RuleTransition extends Transition { this.followState = followState; } + @Override + public int getSerializationType() { + return RULE; + } + @Override public boolean isEpsilon() { return true; } } 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 f061c3b88..f9dd9883c 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/SetTransition.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/SetTransition.java @@ -46,6 +46,11 @@ public class SetTransition extends Transition { this.set = set; } + @Override + public int getSerializationType() { + return SET; + } + @Override @NotNull public IntervalSet label() { return set; } 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 4cc711ba8..bf48bd69a 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/Transition.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/Transition.java @@ -99,7 +99,7 @@ public abstract class Transition { this.target = target; } - public int getSerializationType() { return 0; } + public abstract int getSerializationType(); /** Are we epsilon, action, sempred? */ public boolean isEpsilon() { return false; } 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 e888e9caa..f5b175ef7 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/WildcardTransition.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/WildcardTransition.java @@ -34,6 +34,11 @@ import org.antlr.v4.runtime.misc.NotNull; public class WildcardTransition extends Transition { public WildcardTransition(@NotNull ATNState target) { super(target); } + @Override + public int getSerializationType() { + return WILDCARD; + } + @Override @NotNull public String toString() { From ff4eb0f744805019c08865e9eebcd99bf99d59dc Mon Sep 17 00:00:00 2001 From: Sam Harwell Date: Thu, 2 Aug 2012 12:10:07 -0500 Subject: [PATCH 2/3] Transition classes except for SetTransition are final --- runtime/Java/src/org/antlr/v4/runtime/atn/ActionTransition.java | 2 +- runtime/Java/src/org/antlr/v4/runtime/atn/AtomTransition.java | 2 +- .../Java/src/org/antlr/v4/runtime/atn/EpsilonTransition.java | 2 +- runtime/Java/src/org/antlr/v4/runtime/atn/NotSetTransition.java | 2 +- .../Java/src/org/antlr/v4/runtime/atn/PredicateTransition.java | 2 +- runtime/Java/src/org/antlr/v4/runtime/atn/RangeTransition.java | 2 +- runtime/Java/src/org/antlr/v4/runtime/atn/RuleTransition.java | 2 +- .../Java/src/org/antlr/v4/runtime/atn/WildcardTransition.java | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) 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 546fdea35..23162f1b5 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/ActionTransition.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/ActionTransition.java @@ -31,7 +31,7 @@ package org.antlr.v4.runtime.atn; import org.antlr.v4.runtime.misc.NotNull; -public class ActionTransition extends Transition { +public final class ActionTransition extends Transition { public final int ruleIndex; public final int actionIndex; public final boolean isCtxDependent; // e.g., $i ref in action 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 8adb833f3..37c868fc6 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/AtomTransition.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/AtomTransition.java @@ -33,7 +33,7 @@ import org.antlr.v4.runtime.misc.NotNull; import org.antlr.v4.runtime.misc.IntervalSet; /** TODO: make all transitions sets? no, should remove set edges */ -public class AtomTransition extends Transition { +public final class AtomTransition extends Transition { /** The token type or character value; or, signifies special label. */ public final int label; 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 8678ecf1a..3ff8a97a0 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/EpsilonTransition.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/EpsilonTransition.java @@ -31,7 +31,7 @@ package org.antlr.v4.runtime.atn; import org.antlr.v4.runtime.misc.NotNull; -public class EpsilonTransition extends Transition { +public final class EpsilonTransition extends Transition { public EpsilonTransition(@NotNull ATNState target) { super(target); } @Override 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 11e060283..5f66abec3 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/NotSetTransition.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/NotSetTransition.java @@ -33,7 +33,7 @@ import org.antlr.v4.runtime.misc.IntervalSet; import org.antlr.v4.runtime.misc.NotNull; import org.antlr.v4.runtime.misc.Nullable; -public class NotSetTransition extends SetTransition { +public final class NotSetTransition extends SetTransition { public NotSetTransition(@NotNull ATNState target, @Nullable IntervalSet set) { super(target, set); } 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 32b389b2f..4e6d17bcc 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/PredicateTransition.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/PredicateTransition.java @@ -37,7 +37,7 @@ import org.antlr.v4.runtime.misc.NotNull; * may have to combine a bunch of them as it collects predicates from * multiple ATN configurations into a single DFA state. */ -public class PredicateTransition extends Transition { +public final class PredicateTransition extends Transition { public final int ruleIndex; public final int predIndex; public final boolean isCtxDependent; // e.g., $i ref in pred 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 b2212c3f7..988b36640 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/RangeTransition.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/RangeTransition.java @@ -32,7 +32,7 @@ package org.antlr.v4.runtime.atn; import org.antlr.v4.runtime.misc.NotNull; import org.antlr.v4.runtime.misc.IntervalSet; -public class RangeTransition extends Transition { +public final class RangeTransition extends Transition { public final int from; public final int to; 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 4c1128083..b7f4cf10f 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/RuleTransition.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/RuleTransition.java @@ -32,7 +32,7 @@ package org.antlr.v4.runtime.atn; import org.antlr.v4.runtime.misc.NotNull; /** */ -public class RuleTransition extends Transition { +public final class RuleTransition extends Transition { /** Ptr to the rule definition object for this rule ref */ public final int ruleIndex; // no Rule object at runtime 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 f5b175ef7..22c8edd97 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/WildcardTransition.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/WildcardTransition.java @@ -31,7 +31,7 @@ package org.antlr.v4.runtime.atn; import org.antlr.v4.runtime.misc.NotNull; -public class WildcardTransition extends Transition { +public final class WildcardTransition extends Transition { public WildcardTransition(@NotNull ATNState target) { super(target); } @Override From 54a375941205e7e2f1d0dfb4127c33ba0ddbbb96 Mon Sep 17 00:00:00 2001 From: Sam Harwell Date: Thu, 2 Aug 2012 12:20:44 -0500 Subject: [PATCH 3/3] LexerATNSimulator and ParserATNSimulator switch on result of getSerializationType() instead of performing multiple type checks --- .../v4/runtime/atn/LexerATNSimulator.java | 84 ++++++++++++++----- .../v4/runtime/atn/ParserATNSimulator.java | 65 +++++++++----- 2 files changed, 106 insertions(+), 43 deletions(-) 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 0519aa364..007eb364e 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/LexerATNSimulator.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/LexerATNSimulator.java @@ -452,7 +452,8 @@ public class LexerATNSimulator extends ATNSimulator { @Nullable public ATNState getReachableTarget(Transition trans, int t) { - if ( trans instanceof AtomTransition ) { + switch (trans.getSerializationType()) { + case Transition.ATOM: AtomTransition at = (AtomTransition)trans; if ( at.label == t ) { if ( debug ) { @@ -461,8 +462,10 @@ public class LexerATNSimulator extends ATNSimulator { return at.target; } - } - else if ( trans.getClass() == RangeTransition.class ) { + + return null; + + case Transition.RANGE: RangeTransition rt = (RangeTransition)trans; if ( t>=rt.from && t<=rt.to ) { if ( debug ) { @@ -471,24 +474,44 @@ public class LexerATNSimulator extends ATNSimulator { return rt.target; } - } - else if ( trans instanceof SetTransition ) { + + return null; + + case Transition.SET: SetTransition st = (SetTransition)trans; - boolean not = trans instanceof NotSetTransition; - if ( (!not && st.set.contains(t)) || - (not && !st.set.contains(t) && t!=CharStream.EOF) ) // ~set doesn't not match EOF - { + if ( st.set.contains(t) ) { if ( debug ) { - System.out.format("match %sset %s\n", not ? "~" : "", st.set.toString(true)); + 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!=CharStream.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 != CharStream.EOF) { + return trans.target; + } + + return null; + + default: + return null; } - else if ( trans instanceof WildcardTransition && t!=CharStream.EOF ) { - return trans.target; - } - return null; } public void deleteWildcardConfigsForAlt(@NotNull ATNConfigSet closure, int ci, int alt) { @@ -572,13 +595,16 @@ public class LexerATNSimulator extends ATNSimulator { @NotNull ATNConfigSet configs) { ATNState p = config.state; - ATNConfig c = null; - if ( t.getClass() == RuleTransition.class ) { + ATNConfig c; + + switch (t.getSerializationType()) { + case Transition.RULE: RuleContext newContext = new RuleContext(config.context, p.stateNumber); c = new ATNConfig(config, t.target, newContext); - } - else if ( t.getClass() == PredicateTransition.class ) { + break; + + case Transition.PREDICATE: if (recog == null) { System.out.format("Predicates cannot be evaluated without a recognizer; assuming true.\n"); } @@ -609,15 +635,27 @@ public class LexerATNSimulator extends ATNSimulator { if ( recog == null || recog.sempred(null, pt.ruleIndex, pt.predIndex) ) { c = new ATNConfig(config, t.target, pt.getPredicate()); } - } - // ignore actions; just exec one per rule upon accept - else if ( t.getClass() == ActionTransition.class ) { + else { + c = null; + } + + break; + + case Transition.ACTION: + // ignore actions; just exec one per rule upon accept c = new ATNConfig(config, t.target); c.lexerActionIndex = ((ActionTransition)t).actionIndex; - } - else if ( t.isEpsilon() ) { + break; + + case Transition.EPSILON: c = new ATNConfig(config, t.target); + break; + + default: + c = null; + break; } + return c; } 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 45be9b5cb..4dca8ed11 100755 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/ParserATNSimulator.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/ParserATNSimulator.java @@ -737,27 +737,49 @@ public class ParserATNSimulator extends ATNSimulator { @Nullable public ATNState getReachableTarget(@NotNull Transition trans, int ttype) { - if ( trans instanceof AtomTransition ) { + switch (trans.getSerializationType()) { + case Transition.ATOM: AtomTransition at = (AtomTransition)trans; if ( at.label == ttype ) { return at.target; } - } - else if ( trans instanceof SetTransition ) { + + return null; + + case Transition.SET: SetTransition st = (SetTransition)trans; - boolean not = trans instanceof NotSetTransition; - if ( !not && st.set.contains(ttype) || not && !st.set.contains(ttype) ) { + if ( st.set.contains(ttype) ) { return st.target; } - } - else if ( trans instanceof RangeTransition ) { // TODO: can't happen in parser, right? remove + + 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; + 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; } - else if ( trans instanceof WildcardTransition && ttype!=Token.EOF ) { - return trans.target; - } - return null; } /** collect and set D's semantic context */ @@ -1023,19 +1045,22 @@ public class ParserATNSimulator extends ATNSimulator { @Nullable public ATNConfig getEpsilonTarget(@NotNull ATNConfig config, @NotNull Transition t, boolean collectPredicates, boolean inContext) { - if ( t instanceof RuleTransition ) { + switch (t.getSerializationType()) { + case Transition.RULE: return ruleTransition(config, t); - } - else if ( t instanceof PredicateTransition ) { + + case Transition.PREDICATE: return predTransition(config, (PredicateTransition)t, collectPredicates, inContext); - } - else if ( t instanceof ActionTransition ) { + + case Transition.ACTION: return actionTransition(config, (ActionTransition)t); - } - else if ( t.isEpsilon() ) { + + case Transition.EPSILON: return new ATNConfig(config, t.target); + + default: + return null; } - return null; } @NotNull