diff --git a/runtime/Java/src/org/antlr/v4/runtime/atn/ATNConfigSet.java b/runtime/Java/src/org/antlr/v4/runtime/atn/ATNConfigSet.java index 504d95faf..503a045f2 100755 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/ATNConfigSet.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/ATNConfigSet.java @@ -42,6 +42,106 @@ import java.util.Set; /** Specialized OrderedHashSet that can track info about the set. * Might be able to optimize later w/o affecting code that uses this set. + + histogram of lexer DFA configset size: + + 206 30 <- 206 sets with size 30 + 47 1 + 17 31 + 12 2 + 10 3 + 7 32 + 4 4 + 3 35 + 2 9 + 2 6 + 2 5 + 2 34 + 1 7 + 1 33 + 1 29 + 1 12 + 1 119 <- max size + + 322 set size for SLL parser java.* + + 888 1 + 411 54 + 365 88 + 304 56 + 206 80 + 182 16 + 167 86 + 166 78 + 158 84 + 131 2 + 121 20 + 120 8 + 119 112 + 82 10 + 73 6 + 53 174 + 47 90 + 45 4 + 39 12 + 38 122 + 37 89 + 37 62 + 34 3 + 34 18 + 32 81 + 31 87 + 28 45 + 27 144 + 25 41 + 24 132 + 22 91 + 22 7 + 21 82 + 21 28 + 21 27 + 17 9 + 16 29 + 16 155 + 15 51 + 15 118 + 14 146 + 14 114 + 13 5 + 13 38 + 12 48 + 11 64 + 11 50 + 11 22 + 11 134 + 11 131 + 10 79 + 10 76 + 10 59 + 10 58 + 10 55 + 10 39 + 10 116 + 9 74 + 9 47 + 9 310 + ... + + javalr, java.* configs with # preds histogram: + + 4569 0 + 57 1 + 27 27 + 5 76 + 4 28 + 3 72 + 3 38 + 3 30 + 2 6 + 2 32 + 1 9 + 1 2 + */ public class ATNConfigSet implements Set { // TODO: convert to long like Sam? use list and map from config to ctx? @@ -88,7 +188,12 @@ public class ATNConfigSet implements Set { } } - /** Once we add to DFAState, set readonly so DFA never changes */ + /** Indicates that the set of configurations is read-only. Do not + * allow any code to manipulate the set; DFA states will point at + * the sets and they must not change. This does not protect the other + * fields; in particular, conflictingAlts is set after + * we've made this readonly. + */ protected boolean readonly = false; /** Track every config we add */ @@ -101,7 +206,7 @@ public class ATNConfigSet implements Set { // TODO: these fields make me pretty uncomfortable but nice to pack up info together, saves recomputation // TODO: can we track conflicts as they are added to save scanning configs later? public int uniqueAlt; - public IntervalSet conflictingAlts; + protected IntervalSet conflictingAlts; // Used in parser and lexer. In lexer, it indicates we hit a pred // while computing a closure operation. Don't make a DFA state from this. public boolean hasSemanticContext; @@ -178,6 +283,16 @@ public class ATNConfigSet implements Set { return states; } + public List getPredicates() { + List preds = new ArrayList(); + for (ATNConfig c : configToContext.values()) { + if ( c.semanticContext!=SemanticContext.NONE ) { + preds.add(c.semanticContext); + } + } + return preds; + } + // TODO: very expensive, used in lexer to kill after wildcard config public ATNConfig get(int i) { int j = 0; @@ -270,6 +385,10 @@ public class ATNConfigSet implements Set { configToContext.clear(); } + public void setReadonly(boolean readonly) { + this.readonly = readonly; + } + @Override public String toString() { StringBuilder buf = new StringBuilder(); 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 396cf4c10..e4afb552a 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/LexerATNSimulator.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/LexerATNSimulator.java @@ -734,7 +734,7 @@ public class LexerATNSimulator extends ATNSimulator { } newState.stateNumber = dfa[mode].states.size(); - configs.readonly = true; + configs.setReadonly(true); newState.configs = configs; dfa[mode].states.put(newState, newState); return newState; 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 4946ac60f..850b0115d 100755 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/ParserATNSimulator.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/ParserATNSimulator.java @@ -651,6 +651,9 @@ public class ParserATNSimulator extends ATNSimulator { } if ( reach.size()==0 ) return null; + +// reach.setConflictingAlts(getConflictingAlts(reach, false)); +// return reach; } @@ -1394,7 +1397,10 @@ public class ParserATNSimulator extends ATNSimulator { configs.optimizeConfigs(this); // System.out.println("After opt, cache size = " + sharedContextCache.size()); - configs.readonly = true; +// System.out.println(configs.size()); +// if ( configs.hasSemanticContext ) System.out.println(configs.getPredicates().size()); +// System.out.println(configs.getPredicates().size()); + configs.setReadonly(true); newState.configs = configs; dfa.states.put(newState, newState); if ( debug ) System.out.println("adding new DFA state: "+newState); @@ -1447,7 +1453,7 @@ public class ParserATNSimulator extends ATNSimulator { ", input="+parser.getTokenStream().getText(interval)); } if ( parser!=null ) parser.getErrorListenerDispatch().reportAmbiguity(parser, dfa, startIndex, stopIndex, - ambigAlts, configs); + ambigAlts, configs); } public void setSLL(boolean SLL) {