forked from jasder/antlr
play with atnconfigset fields
This commit is contained in:
parent
9445d1fdd6
commit
b83c90af2f
|
@ -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<ATNConfig> {
|
||||
// TODO: convert to long like Sam? use list and map from config to ctx?
|
||||
|
@ -88,7 +188,12 @@ public class ATNConfigSet implements Set<ATNConfig> {
|
|||
}
|
||||
}
|
||||
|
||||
/** 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<ATNConfig> {
|
|||
// 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<ATNConfig> {
|
|||
return states;
|
||||
}
|
||||
|
||||
public List<SemanticContext> getPredicates() {
|
||||
List<SemanticContext> preds = new ArrayList<SemanticContext>();
|
||||
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<ATNConfig> {
|
|||
configToContext.clear();
|
||||
}
|
||||
|
||||
public void setReadonly(boolean readonly) {
|
||||
this.readonly = readonly;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder buf = new StringBuilder();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -651,6 +651,9 @@ public class ParserATNSimulator<Symbol extends Token> extends ATNSimulator {
|
|||
}
|
||||
|
||||
if ( reach.size()==0 ) return null;
|
||||
|
||||
// reach.setConflictingAlts(getConflictingAlts(reach, false));
|
||||
//
|
||||
return reach;
|
||||
}
|
||||
|
||||
|
@ -1394,7 +1397,10 @@ public class ParserATNSimulator<Symbol extends Token> 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<Symbol extends Token> 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) {
|
||||
|
|
Loading…
Reference in New Issue