private void WrapChilds(RuleAlternativeInfo info) { var lst = new List <ParsingTreeNode.ParsedNode>(); for (var n = _currChild; n != null; n = n.Next) { lst.Add(n); } var callExpressions = info.AlternativesInfo.Alternatives.Select(a => new { alternative = a, expr = new RuleExpression.RuleUsage(a.Rule.Name) }).ToArray(); var parentAlternatives = new ParserNode.Alternatives( info.RootRule, new RuleExpression.Or(callExpressions.Select(a => a.expr).ToArray()), callExpressions.Select(a => new ParserNode.RuleCall(a.alternative.Rule, a.expr, new ParserNode.FsmParserNode(null, null, null))).ToArray() ); var parentCall = new ParserNode.RuleCall(_currChild.Rule, new RuleExpression.RuleUsage(info.RootRule.Name), parentAlternatives); ParsingTreeNode.ParsedNode next = null; for (int i = lst.Count - 1; i >= 0; i--) { var curr = lst[i]; if (i % 2 != 0) { next = new ParsingTreeNode.Group(curr.GrammarNode.Parent, curr.Location, next, curr.UpdateNext(null) ); } else { next = new ParsingTreeNode.Group(parentCall, curr.Location, next, new ParsingTreeNode.Group(parentAlternatives, curr.Location, null, new ParsingTreeNode.Group(new ParserNode.RuleCall(parentAlternatives.Rule, new RuleExpression.RuleUsage(curr.Rule.Name), new ParserNode.FsmParserNode(null, null, null)), curr.Location, null, curr.UpdateNext(null) ) ) ); } } _currChild = next; }
private RecursionRewritingCompensator(ParsingTreeNode.Group node, RuleSetAlternativesInfo alternatives) { _node = node; _alternativesInfo = alternatives; }