diff --git a/tool/src/main/antlr3/org/antlr/grammar/v3/CodeGenTreeWalker.g b/tool/src/main/antlr3/org/antlr/grammar/v3/CodeGenTreeWalker.g index 9c107b531..98d77582e 100644 --- a/tool/src/main/antlr3/org/antlr/grammar/v3/CodeGenTreeWalker.g +++ b/tool/src/main/antlr3/org/antlr/grammar/v3/CodeGenTreeWalker.g @@ -56,6 +56,7 @@ import org.antlr.codegen.*; import java.util.HashSet; import java.util.Set; import java.util.Collection; +import java.util.Collections; import org.antlr.runtime.BitSet; import org.antlr.runtime.DFA; import org.stringtemplate.v4.ST; @@ -284,6 +285,8 @@ protected final List getTokenTypesAsTargetLabels(Collection } labels.add( label ); } + // Ensure repeatable parser builds + Collections.sort( labels); return labels; } diff --git a/tool/src/main/java/org/antlr/tool/Grammar.java b/tool/src/main/java/org/antlr/tool/Grammar.java index 667ebb2dd..2ecd2ea80 100644 --- a/tool/src/main/java/org/antlr/tool/Grammar.java +++ b/tool/src/main/java/org/antlr/tool/Grammar.java @@ -85,6 +85,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.TreeSet; import java.util.Vector; /** Represents a grammar in memory. */ @@ -1885,7 +1886,8 @@ public void defineRuleListLabel(String ruleName, * Return a displayable token type name computed from the GrammarAST. */ public Set getLabels(Set rewriteElements, int labelType) { - Set labels = new HashSet(); + // Use a TreeSet so that parsers are generated repeatably + Set labels = new TreeSet<>(); for (GrammarAST el : rewriteElements) { if ( el.getType()==ANTLRParser.LABEL ) { String labelName = el.getText();