diff --git a/tool/src/org/antlr/v4/automata/ATNOptimizer.java b/tool/src/org/antlr/v4/automata/ATNOptimizer.java index acbf7149c..6f453c3a4 100644 --- a/tool/src/org/antlr/v4/automata/ATNOptimizer.java +++ b/tool/src/org/antlr/v4/automata/ATNOptimizer.java @@ -31,9 +31,12 @@ package org.antlr.v4.automata; import org.antlr.v4.runtime.atn.ATN; +import org.antlr.v4.runtime.atn.ATNState; import org.antlr.v4.runtime.misc.NotNull; import org.antlr.v4.tool.Grammar; +import java.util.List; + /** * * @author Sam Harwell @@ -41,6 +44,30 @@ import org.antlr.v4.tool.Grammar; public class ATNOptimizer { public static void optimize(@NotNull Grammar g, @NotNull ATN atn) { + optimizeStates(atn); + } + + private static void optimizeStates(ATN atn) { + List states = atn.states; + + int current = 0; + for (int i = 0; i < states.size(); i++) { + ATNState state = states.get(i); + if (state == null) { + continue; + } + + if (i != current) { + state.stateNumber = current; + states.set(current, state); + states.set(i, null); + } + + current++; + } + + System.out.println("ATN optimizer removed " + (states.size() - current) + " null states."); + states.subList(current, states.size()).clear(); } private ATNOptimizer() {