Skip to content

Commit

Permalink
fix #1955 for Python
Browse files Browse the repository at this point in the history
  • Loading branch information
ericvergnaud committed Nov 18, 2018
1 parent f6537bf commit 43e529c
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 29 deletions.
28 changes: 14 additions & 14 deletions runtime/Python2/src/antlr4/atn/ParserATNSimulator.py
Original file line number Diff line number Diff line change
Expand Up @@ -1145,11 +1145,6 @@ def closure_(self, config, configs, closureBusy, collectPredicates, fullCtx, dep
continueCollecting = collectPredicates and not isinstance(t, ActionTransition)
c = self.getEpsilonTarget(config, t, continueCollecting, depth == 0, fullCtx, treatEofAsEpsilon)
if c is not None:
if not t.isEpsilon:
if c in closureBusy:
# avoid infinite recursion for EOF* and EOF+
continue
closureBusy.add(c)
newDepth = depth
if isinstance( config.state, RuleStopState):
# target fell off end of rule; mark resulting c as having dipped into outer context
Expand All @@ -1158,23 +1153,28 @@ def closure_(self, config, configs, closureBusy, collectPredicates, fullCtx, dep
# come in handy and we avoid evaluating context dependent
# preds if this is > 0.

if c in closureBusy:
# avoid infinite recursion for right-recursive rules
continue
closureBusy.add(c)

if self._dfa is not None and self._dfa.precedenceDfa:
if t.outermostPrecedenceReturn == self._dfa.atnStartState.ruleIndex:
c.precedenceFilterSuppressed = True
c.reachesIntoOuterContext += 1
if c in closureBusy:
# avoid infinite recursion for right-recursive rules
continue
closureBusy.add(c)
configs.dipsIntoOuterContext = True # TODO: can remove? only care when we add to set per middle of this method
newDepth -= 1
if ParserATNSimulator.debug:
print("dips into outer ctx: " + str(c))
elif isinstance(t, RuleTransition):
# latch when newDepth goes negative - once we step out of the entry context we can't return
if newDepth >= 0:
newDepth += 1
else:
if not t.isEpsilon:
if c in closureBusy:
# avoid infinite recursion for EOF* and EOF+
continue
closureBusy.add(c)
if isinstance(t, RuleTransition):
# latch when newDepth goes negative - once we step out of the entry context we can't return
if newDepth >= 0:
newDepth += 1

self.closureCheckingStopState(c, configs, closureBusy, continueCollecting, fullCtx, newDepth, treatEofAsEpsilon)

Expand Down
29 changes: 14 additions & 15 deletions runtime/Python3/src/antlr4/atn/ParserATNSimulator.py
Original file line number Diff line number Diff line change
Expand Up @@ -1150,36 +1150,35 @@ def closure_(self, config:ATNConfig, configs:ATNConfigSet, closureBusy:set, coll
continueCollecting = collectPredicates and not isinstance(t, ActionTransition)
c = self.getEpsilonTarget(config, t, continueCollecting, depth == 0, fullCtx, treatEofAsEpsilon)
if c is not None:
if not t.isEpsilon:
if c in closureBusy:
# avoid infinite recursion for EOF* and EOF+
continue
closureBusy.add(c)
newDepth = depth
if isinstance( config.state, RuleStopState):
# target fell off end of rule; mark resulting c as having dipped into outer context
# We can't get here if incoming config was rule stop and we had context
# track how far we dip into outer context. Might
# come in handy and we avoid evaluating context dependent
# preds if this is > 0.

if c in closureBusy:
# avoid infinite recursion for right-recursive rules
continue
closureBusy.add(c)

if self._dfa is not None and self._dfa.precedenceDfa:
if t.outermostPrecedenceReturn == self._dfa.atnStartState.ruleIndex:
c.precedenceFilterSuppressed = True
c.reachesIntoOuterContext += 1
if c in closureBusy:
# avoid infinite recursion for right-recursive rules
continue
closureBusy.add(c)
configs.dipsIntoOuterContext = True # TODO: can remove? only care when we add to set per middle of this method
newDepth -= 1
if ParserATNSimulator.debug:
print("dips into outer ctx: " + str(c))
elif isinstance(t, RuleTransition):
# latch when newDepth goes negative - once we step out of the entry context we can't return
if newDepth >= 0:
newDepth += 1
else:
if not t.isEpsilon:
if c in closureBusy:
# avoid infinite recursion for EOF* and EOF+
continue
closureBusy.add(c)
if isinstance(t, RuleTransition):
# latch when newDepth goes negative - once we step out of the entry context we can't return
if newDepth >= 0:
newDepth += 1

self.closureCheckingStopState(c, configs, closureBusy, continueCollecting, fullCtx, newDepth, treatEofAsEpsilon)

Expand Down

0 comments on commit 43e529c

Please sign in to comment.