diff --git a/runtime/Java/src/org/antlr/v4/runtime/dfa/DFA.java b/runtime/Java/src/org/antlr/v4/runtime/dfa/DFA.java index 195565646..2da700af4 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/dfa/DFA.java +++ b/runtime/Java/src/org/antlr/v4/runtime/dfa/DFA.java @@ -38,8 +38,10 @@ import org.antlr.v4.runtime.misc.NotNull; import org.antlr.v4.runtime.misc.Nullable; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; import java.util.HashSet; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -49,7 +51,7 @@ public class DFA { * ({@link Set} only allows you to see if it's there). */ @NotNull - public final Map states = new LinkedHashMap(); + public final Map states = new HashMap(); @Nullable public DFAState s0; @@ -73,6 +75,22 @@ public class DFA { this.decision = decision; } + /** + * Return a list of all states in this DFA, ordered by state number. + */ + @NotNull + public List getStates() { + List result = new ArrayList(states.keySet()); + Collections.sort(result, new Comparator() { + @Override + public int compare(DFAState o1, DFAState o2) { + return o1.stateNumber - o2.stateNumber; + } + }); + + return result; + } + public List> getATNStatesAlongPath(ParserATNSimulator atn, List dfaStates, TokenStream input, int start, int stop) diff --git a/runtime/Java/src/org/antlr/v4/runtime/dfa/DFASerializer.java b/runtime/Java/src/org/antlr/v4/runtime/dfa/DFASerializer.java index 81ab62d6a..4c2fe7c5b 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/dfa/DFASerializer.java +++ b/runtime/Java/src/org/antlr/v4/runtime/dfa/DFASerializer.java @@ -34,7 +34,7 @@ import org.antlr.v4.runtime.misc.NotNull; import org.antlr.v4.runtime.misc.Nullable; import java.util.Arrays; -import java.util.Map; +import java.util.List; /** A DFA walker that knows how to dump them to serialized strings. */ public class DFASerializer { @@ -52,21 +52,20 @@ public class DFASerializer { public String toString() { if ( dfa.s0==null ) return null; StringBuilder buf = new StringBuilder(); - Map states = dfa.states; - if ( states!=null ) { - for (DFAState s : states.values()) { - int n = 0; - if ( s.edges!=null ) n = s.edges.length; - for (int i=0; i").append(getStateString(t)).append('\n'); - } + List states = dfa.getStates(); + for (DFAState s : states) { + int n = 0; + if ( s.edges!=null ) n = s.edges.length; + for (int i=0; i").append(getStateString(t)).append('\n'); } } } + String output = buf.toString(); //return Utils.sortLinesInString(output); return output;