Skip to content

Commit e2be51c

Browse files
authored
Fix: Left-recursive rule fails to grow when it occupies a non-final field of an enclosing sequence (#150)
2 parents 93d0e3d + c2ee866 commit e2be51c

2 files changed

Lines changed: 31 additions & 0 deletions

File tree

‎AnyText/AnyText.Core/Matcher.cs‎

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,11 @@ internal MatchOrMatchProcessor MatchOrCreateMatchProcessor(Rule rule, ParseConte
205205
recursionContext = new RecursionContext(position, rule.Continuations);
206206
createdRecursion = recursionContext;
207207
}
208+
else if (!AllContinuationsPresent(recursionContext, rule.Continuations))
209+
{
210+
recursionContext = new RecursionContext(position, MergeContinuations(recursionContext.Continuations, rule.Continuations));
211+
createdRecursion = recursionContext;
212+
}
208213
var cycleDetector = new FailedRuleApplication(rule, new ParsePositionDelta(1, 0), "Recursive");
209214
cycleDetector.AddToColumn(column);
210215
var processor = rule.NextMatchProcessor(context, recursionContext, ref position);
@@ -322,6 +327,31 @@ public override MatchOrMatchProcessor NextMatchProcessor(ParseContext context, R
322327
}
323328
}
324329

330+
private static bool AllContinuationsPresent(RecursionContext recursionContext, IReadOnlyCollection<RecursiveContinuation> continuations)
331+
{
332+
foreach (var continuation in continuations)
333+
{
334+
if (!recursionContext.Continuations.Contains(continuation))
335+
{
336+
return false;
337+
}
338+
}
339+
return true;
340+
}
341+
342+
private static List<RecursiveContinuation> MergeContinuations(IReadOnlyCollection<RecursiveContinuation> existing, IReadOnlyCollection<RecursiveContinuation> additional)
343+
{
344+
var merged = new List<RecursiveContinuation>(existing);
345+
foreach (var continuation in additional)
346+
{
347+
if (!merged.Contains(continuation))
348+
{
349+
merged.Add(continuation);
350+
}
351+
}
352+
return merged;
353+
}
354+
325355
private static void ExtendContinuations(RecursionContext recursionContext, MemoColumn column, ParseContext context, ref ParsePosition position, ref RuleApplication ruleApplication)
326356
{
327357
var headRule = ruleApplication.Rule;

‎AnyText/AnyText.history‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,4 @@ patch: update StreamJsonRpc version, improve error reporting
5353
patch: update dependencies
5454
patch: fix stack overflow in ChoiceRule synthesis for self-referential choices with a parantheses alternative
5555
patch: fix TextEdit.ApplyReconstructArray clobbering preceding text when an edit's end points past the last line
56+
patch: fix left-recursive rules losing their growing continuations when they start matching at a position already claimed by an unrelated left-recursive rule

0 commit comments

Comments
 (0)