From f6537bf4ac8617a732a5f384bd1535ed0b85f303 Mon Sep 17 00:00:00 2001 From: Eric Vergnaud Date: Sun, 18 Nov 2018 19:31:47 +0800 Subject: [PATCH] fix #1955 for Chsarp --- .../Antlr4.Runtime/Atn/ParserATNSimulator.cs | 35 ++++++++++--------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/runtime/CSharp/runtime/CSharp/Antlr4.Runtime/Atn/ParserATNSimulator.cs b/runtime/CSharp/runtime/CSharp/Antlr4.Runtime/Atn/ParserATNSimulator.cs index ccc1b502d..a7d914a71 100644 --- a/runtime/CSharp/runtime/CSharp/Antlr4.Runtime/Atn/ParserATNSimulator.cs +++ b/runtime/CSharp/runtime/CSharp/Antlr4.Runtime/Atn/ParserATNSimulator.cs @@ -1622,12 +1622,6 @@ namespace Antlr4.Runtime.Atn depth == 0, fullCtx, treatEofAsEpsilon); if (c != null) { - if (!t.IsEpsilon && !closureBusy.Add(c)) - { - // avoid infinite recursion for EOF* and EOF+ - continue; - } - int newDepth = depth; if (config.state is RuleStopState) { @@ -1637,12 +1631,6 @@ namespace Antlr4.Runtime.Atn // come in handy and we avoid evaluating context dependent // preds if this is > 0. - if (!closureBusy.Add(c)) - { - // avoid infinite recursion for right-recursive rules - continue; - } - if (thisDfa != null && thisDfa.IsPrecedenceDfa) { int outermostPrecedenceReturn = ((EpsilonTransition)t).OutermostPrecedenceReturn; @@ -1653,17 +1641,32 @@ namespace Antlr4.Runtime.Atn } c.reachesIntoOuterContext++; + if (!closureBusy.Add(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 newDepth--; if (debug) ConsoleWriteLine("dips into outer ctx: " + c); } - else if (t is RuleTransition) + else { - // latch when newDepth goes negative - once we step out of the entry context we can't return - if (newDepth >= 0) + + if (!t.IsEpsilon && !closureBusy.Add(c)) { - newDepth++; + // avoid infinite recursion for EOF* and EOF+ + continue; + } + if (t is RuleTransition) + { + // latch when newDepth goes negative - once we step out of the entry context we can't return + if (newDepth >= 0) + { + newDepth++; + } } }