public static Predicate <TokenMarker> Keyword(TokenMarker currentMarker) { return(x => { return IsKeyword(x.Token); }); }
/// <summary> Reads the body of a lambda expression. </summary> /// /// <remarks> Vasko, 25-Dec-17. </remarks> /// /// <returns> The lambda. </returns> public LambdaExpression ReadLambda(Predicate <TokenMarker> predicate = null) { var parameters = new List <ParameterExpression>(); var crToken = Reader.Current; TokenMarker marker = null; bool hasParenthesis = false; if (crToken.TokenType == TokenType.OpenParenthesis) { hasParenthesis = true; Reader.DiscardToken(TokenType.OpenParenthesis); marker = Reader.Marker.Clone(); var fnEndPredicate = DonutSyntaxReader.Filters.FunctionCallEnd(marker); while (!Reader.IsComplete && !fnEndPredicate(Reader.Marker)) { ParameterExpression fnParameter = ReadFunctionParameter(); parameters.Add(fnParameter); if (Reader.Current.TokenType == TokenType.Comma) { Reader.DiscardToken(); } } } if (hasParenthesis && Reader.Current.TokenType == TokenType.CloseParenthesis) { Reader.DiscardToken(TokenType.CloseParenthesis); } Reader.DiscardToken(TokenType.Lambda); var fBody = ReadExpressions(predicate); var lambda = new LambdaExpression(fBody); lambda.Parameters = parameters; return(lambda); }
public TokenMarker Clone() { var c = new TokenMarker(); c.Depth = Depth; c.Token = Token; return(c); }
public static Predicate <TokenMarker> BlockEnd(TokenMarker marker) { return(x => { return x.Depth == marker.Depth && x.Token != null && (x.Token.TokenType == TokenType.CloseCurlyBracket); }); }
public static Predicate <TokenMarker> IndexParameterEnd(TokenMarker currentMarker) { return(x => { return x.Depth == currentMarker.Depth && x.Token != null && (x.Token.TokenType == TokenType.Comma || x.Token.TokenType == TokenType.CloseBracket); }); }
public static Predicate <TokenMarker> FunctionParameterEnd(TokenMarker currentMarker) { return(x => { return x.Depth == currentMarker.Depth && x.Token != null && (x.Token.TokenType == TokenType.Comma || x.Token.TokenType == TokenType.CloseParenthesis); }); }
public static Predicate <TokenMarker> ExpressionTermination(TokenMarker currentMarker) { return(x => { return x.Depth == currentMarker.Depth && (x.Token.TokenType == TokenType.Semicolon || x.Token.TokenType == TokenType.NewLine); }); }
/// <summary> Returns a predicate for a cursor with a token on the same level as the given one. </summary> /// /// <remarks> Vasko, 05-Dec-17. </remarks> /// /// <param name="currentMarker"> The current cursor. </param> /// <param name="tokenType"> Type of the token. </param> /// /// <returns> A Predicate<TokenCursor> </returns> public static Predicate <TokenMarker> SameLevel(TokenMarker currentMarker, TokenType tokenType) { return(x => { return x.Depth == currentMarker.Depth && x.Token != null && x.Token.TokenType == tokenType; }); }
/// <summary> /// Seeks untill a predicate matches. /// </summary> /// <param name="filter"></param> /// <returns></returns> public TokenMarker SeekTo(Predicate <TokenMarker> filter) { if (Marker.Token != null && filter(Marker)) { return(Marker.Clone()); } TokenMarker matchingMarker = null; foreach (var item in this.AsEnumerable()) { if (filter(item)) { return(item); } } return(matchingMarker); }
public TokenReader(IEnumerable <DslToken> tokens) { Marker = new TokenMarker(); Load(tokens); }