void IRuleExpressionVisitor.VisitSequence(RuleExpression.Sequence sequence) { if (_currContext.invocationCount < sequence.Childs.Count) { _currContext = _currContext.ForChildExpression(sequence.Childs[_currContext.invocationCount]); } else if (_currContext.invocationCount == sequence.Childs.Count) { var childs = _currContext.GetChildNodes(); if (childs.Length != sequence.Childs.Count) { throw new InvalidOperationException(); } _currContext = _currContext.ForParentExpression(new ParserNode.Sequence( _currContext.rule, _currContext.expression, childs )); } else { throw new InvalidOperationException(); } }
RuleExpression MakeExpandedRecursiveExpression(RuleExpression.RuleUsage[] alternatives, ExplicitRule curr, RuleExpression.Sequence seq) { var association = Association.Left; if (curr.GetAttributes().Any(a => a.Name.ToLower() == "left")) { association = Association.Left; } if (curr.GetAttributes().Any(a => a.Name.ToLower() == "right")) { association = Association.Right; } var restAltarnatives = alternatives.SkipWhile(e => e.RuleName != curr.Name).ToArray(); RuleExpression[] leftAlts, rightAlts; switch (association) { case Association.Left: { leftAlts = restAltarnatives; rightAlts = restAltarnatives.Skip(1).ToArray(); } break; case Association.Right: { leftAlts = restAltarnatives.Skip(1).ToArray(); rightAlts = restAltarnatives; } break; default: throw new NotImplementedException(""); } return(new RuleExpression.Sequence( new RuleExpression.Or(leftAlts), seq.Childs[1], new RuleExpression.Or(rightAlts) )); }
RuleExpression MakeRewrittenRecursiveExpression(RuleExpression.RuleUsage[] alternatives, ExplicitRule curr, RuleExpression.Sequence seq) { var restAltarnatives = alternatives.SkipWhile(e => e.RuleName != curr.Name).Skip(1).ToArray(); return(new RuleExpression.Sequence( new RuleExpression.Or(restAltarnatives), new RuleExpression.MatchNumber(1, int.MaxValue, new RuleExpression.Sequence( seq.Childs[1], new RuleExpression.Or(restAltarnatives) ) ) )); }