Merge pull request #2418 from ericvergnaud/fix-#1955-javascript
Fix #1955 javascript
This commit is contained in:
commit
eaa7e32001
|
@ -1272,10 +1272,6 @@ ParserATNSimulator.prototype.closure_ = function(config, configs, closureBusy, c
|
||||||
var continueCollecting = collectPredicates && !(t instanceof ActionTransition);
|
var continueCollecting = collectPredicates && !(t instanceof ActionTransition);
|
||||||
var c = this.getEpsilonTarget(config, t, continueCollecting, depth === 0, fullCtx, treatEofAsEpsilon);
|
var c = this.getEpsilonTarget(config, t, continueCollecting, depth === 0, fullCtx, treatEofAsEpsilon);
|
||||||
if (c!==null) {
|
if (c!==null) {
|
||||||
if (!t.isEpsilon && closureBusy.add(c)!==c){
|
|
||||||
// avoid infinite recursion for EOF* and EOF+
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
var newDepth = depth;
|
var newDepth = depth;
|
||||||
if ( config.state instanceof RuleStopState) {
|
if ( config.state instanceof RuleStopState) {
|
||||||
// target fell off end of rule; mark resulting c as having dipped into outer context
|
// target fell off end of rule; mark resulting c as having dipped into outer context
|
||||||
|
@ -1283,12 +1279,6 @@ ParserATNSimulator.prototype.closure_ = function(config, configs, closureBusy, c
|
||||||
// track how far we dip into outer context. Might
|
// track how far we dip into outer context. Might
|
||||||
// come in handy and we avoid evaluating context dependent
|
// come in handy and we avoid evaluating context dependent
|
||||||
// preds if this is > 0.
|
// preds if this is > 0.
|
||||||
|
|
||||||
if (closureBusy.add(c)!==c) {
|
|
||||||
// avoid infinite recursion for right-recursive rules
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._dfa !== null && this._dfa.precedenceDfa) {
|
if (this._dfa !== null && this._dfa.precedenceDfa) {
|
||||||
if (t.outermostPrecedenceReturn === this._dfa.atnStartState.ruleIndex) {
|
if (t.outermostPrecedenceReturn === this._dfa.atnStartState.ruleIndex) {
|
||||||
c.precedenceFilterSuppressed = true;
|
c.precedenceFilterSuppressed = true;
|
||||||
|
@ -1296,15 +1286,25 @@ ParserATNSimulator.prototype.closure_ = function(config, configs, closureBusy, c
|
||||||
}
|
}
|
||||||
|
|
||||||
c.reachesIntoOuterContext += 1;
|
c.reachesIntoOuterContext += 1;
|
||||||
|
if (closureBusy.add(c)!==c) {
|
||||||
|
// avoid infinite recursion for right-recursive rules
|
||||||
|
continue;
|
||||||
|
}
|
||||||
configs.dipsIntoOuterContext = true; // TODO: can remove? only care when we add to set per middle of this method
|
configs.dipsIntoOuterContext = true; // TODO: can remove? only care when we add to set per middle of this method
|
||||||
newDepth -= 1;
|
newDepth -= 1;
|
||||||
if (this.debug) {
|
if (this.debug) {
|
||||||
console.log("dips into outer ctx: " + c);
|
console.log("dips into outer ctx: " + c);
|
||||||
}
|
}
|
||||||
} else if (t instanceof RuleTransition) {
|
} else {
|
||||||
// latch when newDepth goes negative - once we step out of the entry context we can't return
|
if (!t.isEpsilon && closureBusy.add(c)!==c){
|
||||||
if (newDepth >= 0) {
|
// avoid infinite recursion for EOF* and EOF+
|
||||||
newDepth += 1;
|
continue;
|
||||||
|
}
|
||||||
|
if (t instanceof RuleTransition) {
|
||||||
|
// latch when newDepth goes negative - once we step out of the entry context we can't return
|
||||||
|
if (newDepth >= 0) {
|
||||||
|
newDepth += 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.closureCheckingStopState(c, configs, closureBusy, continueCollecting, fullCtx, newDepth, treatEofAsEpsilon);
|
this.closureCheckingStopState(c, configs, closureBusy, continueCollecting, fullCtx, newDepth, treatEofAsEpsilon);
|
||||||
|
|
Loading…
Reference in New Issue