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); } } } }
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); }
public IEnumerable <TToken> transform(IEnumerable <TToken> tokens, ILexicalMatchResult <TToken, TNode, TModel> match, Scope scope) { return(_functor(tokens, match, scope)); }