示例#1
0
        public IEnumerable <TToken> transform(IEnumerable <TToken> tokens, ILexicalMatchResult <TToken, TNode, TModel> match, Scope scope)
        {
            var sorted    = _transformers.OrderBy(t => t.Priority);
            var compiler  = scope.GetService <TToken, TNode, TModel>();
            var needsMark = _syntactical != null;
            int id        = -1;

            foreach (var item in match.Items)
            {
                IEnumerable <TToken> result = match.GetTokens(tokens, item.Span);
                foreach (var transformer in sorted)
                {
                    if (transformer.Item == item.Identifier)
                    {
                        result = transformer.Handler(result, scope);
                    }
                }

                if (_refToken != null)
                {
                    needsMark = item.Identifier == _refToken;
                }

                foreach (var token in result)
                {
                    if (needsMark)
                    {
                        TToken marked;
                        if (id < 0)
                        {
                            var document = scope.GetDocument <TToken, TNode, TModel>();
                            if (_syntactical != null)
                            {
                                marked = document.change(token, _syntactical);
                            }
                            else
                            {
                                Debug.Assert(_semantical != null);
                                marked = document.change(token, _semantical);
                            }

                            id = compiler.GetExcessId(marked);
                        }
                        else
                        {
                            marked = compiler.InitToken(token, id);
                        }

                        yield return(marked);
                    }
                    else
                    {
                        yield return(token);
                    }
                }
            }
        }
示例#2
0
        private IEnumerable <TToken> TransformSpan(TToken[] tokens, TokenSpan span, Scope scope)
        {
            var builders = new List <MatchInfo>();

            int currentToken = 0;

            while (currentToken < span.Length)
            {
                var remaining = Range(tokens, span.Start + currentToken, span.Length - currentToken);

                ILexicalMatchResult <TToken, TNode, TModel> result = null;
                foreach (var matcher in _matchers)
                {
                    result = matcher.match(remaining, scope, currentToken == 0);
                    if (result != null)
                    {
                        break;
                    }
                }

                if (result != null)
                {
                    builders.Add(new MatchInfo {
                        Span = new TokenSpan(span.Start + currentToken, result.Consumed), Match = result
                    });
                    currentToken += result.Consumed;
                }
                else
                {
                    currentToken++;
                }
            }

            var returnValue = TransformBuilders(tokens, span, builders, scope);

            return(returnValue);
        }
示例#3
0
 public IEnumerable <TToken> transform(IEnumerable <TToken> tokens, ILexicalMatchResult <TToken, TNode, TModel> match, Scope scope)
 {
     return(_functor(tokens, match, scope));
 }