コード例 #1
0
        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();
            }
        }
コード例 #2
0
        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)
                       ));
        }
コード例 #3
0
        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)
                                                          )
                                                      )
                       ));
        }