add chk for null contextCache.

This commit is contained in:
Terence Parr 2012-07-25 10:58:04 -07:00
parent 3774c5752b
commit 05de714987
2 changed files with 7 additions and 11 deletions

View File

@ -982,8 +982,6 @@ public class ParserATNSimulator<Symbol extends Token> extends ATNSimulator {
boolean collectPredicates, boolean collectPredicates,
boolean greedy, boolean loopsSimulateTailRecursion) boolean greedy, boolean loopsSimulateTailRecursion)
{ {
// System.out.println(PredictionContext.toDOTString(config.context));
final int initialDepth = 0; final int initialDepth = 0;
closureCheckingStopStateAndLoopRecursion(config, configs, closureBusy, collectPredicates, greedy, closureCheckingStopStateAndLoopRecursion(config, configs, closureBusy, collectPredicates, greedy,
loopsSimulateTailRecursion, initialDepth); loopsSimulateTailRecursion, initialDepth);
@ -1492,6 +1490,7 @@ public class ParserATNSimulator<Symbol extends Token> extends ATNSimulator {
newState.stateNumber = dfa.states.size(); newState.stateNumber = dfa.states.size();
// System.out.println("Before opt, cache size = "+ sharedContextCache.size()); // System.out.println("Before opt, cache size = "+ sharedContextCache.size());
configs.optimizeConfigs(this); configs.optimizeConfigs(this);
// System.out.println("After opt, cache size = " + sharedContextCache.size()); // System.out.println("After opt, cache size = " + sharedContextCache.size());
newState.configs = new ATNConfigSet(configs, contextCache); newState.configs = new ATNConfigSet(configs, contextCache);

View File

@ -169,7 +169,7 @@ public abstract class PredictionContext implements Iterable<SingletonPredictionC
// of those graphs. dup a, a' points at merged array // of those graphs. dup a, a' points at merged array
// new joined parent so create new singleton pointing to it, a' // new joined parent so create new singleton pointing to it, a'
PredictionContext a_ = new SingletonPredictionContext(parent, a.invokingState); PredictionContext a_ = new SingletonPredictionContext(parent, a.invokingState);
a_ = contextCache.add(a_); if ( contextCache!=null ) a_ = contextCache.add(a_);
return a_; return a_;
} }
else { // a != b payloads differ else { // a != b payloads differ
@ -191,7 +191,7 @@ public abstract class PredictionContext implements Iterable<SingletonPredictionC
} }
PredictionContext[] parents = {singleParent, singleParent}; PredictionContext[] parents = {singleParent, singleParent};
PredictionContext a_ = new ArrayPredictionContext(parents, payloads); PredictionContext a_ = new ArrayPredictionContext(parents, payloads);
a_ = contextCache.add(a_); if ( contextCache!=null ) a_ = contextCache.add(a_);
return a_; return a_;
} }
// parents differ and can't merge them. Just pack together // parents differ and can't merge them. Just pack together
@ -205,7 +205,7 @@ public abstract class PredictionContext implements Iterable<SingletonPredictionC
parents = new PredictionContext[] {b.parent, a.parent}; parents = new PredictionContext[] {b.parent, a.parent};
} }
PredictionContext a_ = new ArrayPredictionContext(parents, payloads); PredictionContext a_ = new ArrayPredictionContext(parents, payloads);
a_ = contextCache.add(a_); if ( contextCache!=null ) a_ = contextCache.add(a_);
return a_; return a_;
} }
} }
@ -229,7 +229,7 @@ public abstract class PredictionContext implements Iterable<SingletonPredictionC
PredictionContext[] parents = {null, b.parent}; PredictionContext[] parents = {null, b.parent};
PredictionContext joined = PredictionContext joined =
new ArrayPredictionContext(parents, payloads); new ArrayPredictionContext(parents, payloads);
joined = contextCache.add(joined); if ( contextCache!=null ) joined = contextCache.add(joined);
return joined; return joined;
} }
if ( b == EMPTY ) { // x + $ = [$,x] ($ is always first if present) if ( b == EMPTY ) { // x + $ = [$,x] ($ is always first if present)
@ -237,7 +237,7 @@ public abstract class PredictionContext implements Iterable<SingletonPredictionC
PredictionContext[] parents = {null, a.parent}; PredictionContext[] parents = {null, a.parent};
PredictionContext joined = PredictionContext joined =
new ArrayPredictionContext(parents, payloads); new ArrayPredictionContext(parents, payloads);
joined = contextCache.add(joined); if ( contextCache!=null ) joined = contextCache.add(joined);
return joined; return joined;
} }
} }
@ -335,10 +335,7 @@ public abstract class PredictionContext implements Iterable<SingletonPredictionC
PredictionContext M = PredictionContext M =
new ArrayPredictionContext(mergedParents, mergedInvokingStates); new ArrayPredictionContext(mergedParents, mergedInvokingStates);
if ( contextCache==null ) { if ( contextCache!=null ) M = contextCache.add(M);
System.err.println("foooooo");
}
M = contextCache.add(M);
// if we created same array as a or b, return that instead // if we created same array as a or b, return that instead
// TODO: track whether this is possible above during merge sort for speed // TODO: track whether this is possible above during merge sort for speed