示例#1
0
        public QilNode BuildMatcher(QilIterator it, IList <XslNode> actualArgs, QilNode otherwise)
        {
            QilNode matcher = f.Int32(NoMatch);

            matcher = MatchPatterns(it, T.PI, piPatterns, matcher);
            matcher = MatchPatterns(it, T.Comment, commentPatterns, matcher);
            matcher = MatchPatterns(it, T.Document, documentPatterns, matcher);
            matcher = MatchPatterns(it, T.Text, textPatterns, matcher);
            matcher = MatchPatterns(it, T.Attribute, attributePatterns, matcher);
            matcher = MatchPatterns(it, T.Element, elementPatterns, matcher);

            matcher = MatchPatternsWhosePriorityGreater(it, heterogenousPatterns, matcher);

            if (IsNoMatch(matcher))
            {
                return(otherwise);
            }

            QilNode[] branches = new QilNode[this.priority + 2];
            int       priority = -1;

            foreach (List <TemplateMatch> list in allMatches)
            {
                foreach (TemplateMatch match in list)
                {
                    branches[++priority] = invkGen.GenerateInvoke(match.TemplateFunction, actualArgs);
                }
            }

            branches[++priority] = otherwise;
            Debug.Assert(priority == branches.Length - 1);
            return(f.Choice(matcher, f.BranchList(branches)));
        }
示例#2
0
        public QilNode BuildMatcher(QilIterator it, IList <XslNode> actualArgs, QilNode otherwise)
        {
            QilNode matcher = _f.Int32(NoMatch);

            matcher = MatchPatterns(it, T.PI, _piPatterns, matcher);
            matcher = MatchPatterns(it, T.Comment, _commentPatterns, matcher);
            matcher = MatchPatterns(it, T.Document, _documentPatterns, matcher);
            matcher = MatchPatterns(it, T.Text, _textPatterns, matcher);
            matcher = MatchPatterns(it, T.Attribute, _attributePatterns, matcher);
            matcher = MatchPatterns(it, T.Element, _elementPatterns, matcher);

            matcher = MatchPatternsWhosePriorityGreater(it, _heterogenousPatterns, matcher);

            if (IsNoMatch(matcher))
            {
                return(otherwise);
            }

#if !DISABLE_SWITCH
            QilNode[] branches = new QilNode[_priority + 2];
            int       priority = -1;

            foreach (List <TemplateMatch> list in _allMatches)
            {
                foreach (TemplateMatch match in list)
                {
                    branches[++priority] = _invkGen.GenerateInvoke(match.TemplateFunction !, actualArgs);
                }
            }

            branches[++priority] = otherwise;
            Debug.Assert(priority == branches.Length - 1);
            return(_f.Choice(matcher, _f.BranchList(branches)));
#else
            QilIterator p        = f.Let(matcher);
            QilNode     result   = otherwise;
            int         priority = 0;

            foreach (List <TemplateMatch> list in allMatches)
            {
                foreach (TemplateMatch match in list)
                {
                    result = f.Conditional(f.Eq(p, f.Int32(priority++)),
                                           invkGen.GenerateInvoke(match.TemplateFunction, actualArgs),
                                           result
                                           );
                }
            }

            return(f.Loop(p, result));
#endif
        }