IEnumerable <Expression> ParseInput(ITextCursor textCursor, CancellationToken cancellationToken, bool stop_on_first) { IRequestContext context = textCursor.Context; var res = new List <Expression>(); foreach (var commandProcessor in CommandProcessors.ToList()) { // Gets all the syntaxes that are of the same culture of the context or are culture invariant var syntaxes = commandProcessor.Syntaxes.Where( s => s.Culture.Equals(context.Culture) || s.Culture.Equals(CultureInfo.InvariantCulture)); foreach (var syntax in syntaxes) { cancellationToken.ThrowIfCancellationRequested(); textCursor.RightToLeftParsing = syntax.RightToLeftParsing; textCursor.Reset(); if (SyntaxParser.TryParse(textCursor, syntax, context, out Expression expression)) { res.Add(expression); if (stop_on_first) { return(res); } } } } return(res); }
public override bool TryGetTokenFromInput(ITextCursor textCursor, out T token) { var match = false; token = default(T); var word = textCursor.Next(); T parsedWord; if (!string.IsNullOrEmpty(word) && TryParseWord(word, out parsedWord)) { var validValues = GetValidValues(textCursor.Context); if (validValues != null) { match = HasMatch(parsedWord, textCursor.Context, out token); } else { token = parsedWord; match = true; } } return(match); }
public override bool TryGetTokenFromInput(ITextCursor textCursor, out string token) { var tokenText = textCursor.All(); var match = TryParse(tokenText, out token) && Expression != null && Expression.IsMatch(tokenText); return(match); }
//public bool TryDetect(ITextCursor textCursor, out IEnumerable<Expression> parsedExprs, CancellationToken cancellationToken) //{ // if (textCursor == null) // throw new ArgumentNullException(nameof(textCursor)); // parsedExprs = ParseInput(textCursor, cancellationToken, stop_on_first: false); // return parsedExprs.Any(); //} public bool TryDetect(ITextCursor textCursor, out Expression parsedExpr, CancellationToken cancellationToken) { if (textCursor == null) { throw new ArgumentNullException(nameof(textCursor)); } var exprs = ParseInput(textCursor, cancellationToken, stop_on_first: true); parsedExpr = exprs.FirstOrDefault(); return(parsedExpr != null); }
public override bool TryGetTokenFromInput(ITextCursor textCursor, out string token) { var match = false; token = null; if (ValidValues != null && ValidValues.Length > 0) { string matchText = null; var queryText = string.Empty; while (string.IsNullOrEmpty(matchText) && ValidValues.Any(v => v.Length >= queryText.Length)) { var tokenPeek = textCursor.Next(); if (string.IsNullOrWhiteSpace(tokenPeek)) { break; } queryText = textCursor.RightToLeftParsing ? $"{tokenPeek} {queryText}" : $"{queryText} {tokenPeek}"; matchText = TryGetMatchText(ValidValues, queryText.Trim()); } if (!string.IsNullOrEmpty(matchText)) { token = matchText; match = true; } } else { var queryText = textCursor.All(); if (!string.IsNullOrEmpty(queryText)) { token = queryText; match = true; } } return(match); }
public bool TryGetTokenFromInput(ITextCursor textCursor, out object token) { var result = false; var genericToken = default(T); if (!textCursor.IsEmpty) { result = TryGetTokenFromInput(textCursor, out genericToken); } if (result) { token = genericToken; } else { token = null; } return(result); }
public override bool TryGetTokenFromInput(ITextCursor textCursor, out string token) { var match = false; token = null; if (ValidValues != null && ValidValues.Length > 0) { string matchText = null; var queryText = string.Empty; while (true) { var tokenPeek = textCursor.Peek(); if (string.IsNullOrWhiteSpace(tokenPeek)) { break; } if (textCursor.RightToLeftParsing) { queryText = $"{tokenPeek} {queryText}"; } else { queryText = $"{queryText} {tokenPeek}"; } queryText = queryText.Trim(); string[] matchTexts; if (textCursor.RightToLeftParsing) { matchTexts = ValidValues .Where(t => t.EndsWith(queryText, StringComparison.InvariantCultureIgnoreCase)) .OrderByDescending(t => t.Length) .ToArray(); } else { matchTexts = ValidValues .Where(t => t.StartsWith(queryText, StringComparison.InvariantCultureIgnoreCase)) .OrderByDescending(t => t.Length) .ToArray(); } if (matchTexts.Length >= 1) { // Avança o cursor textCursor.Next(); if (matchTexts.Any(t => t.Equals(queryText, StringComparison.InvariantCultureIgnoreCase))) { matchText = queryText; } } else { break; } } if (!string.IsNullOrEmpty(matchText)) { token = matchText; match = true; } } else { var queryText = textCursor.All(); if (!string.IsNullOrEmpty(queryText)) { token = queryText; match = true; } } return(match); }
public bool TryParse(ITextCursor textCursor, Syntax syntax, IRequestContext context, out Expression expression) { var queryMatch = true; var tokens = new Token[syntax.TokenTypes.Length]; var leftPos = 0; var rightPos = syntax.TokenTypes.Length - 1; while (leftPos <= rightPos) { var pos = textCursor.RightToLeftParsing ? rightPos : leftPos; var tokenType = syntax.TokenTypes[pos]; if (tokenType != null) { textCursor.SavePosition(); object queryToken; if (tokenType.TryGetTokenFromInput(textCursor, out queryToken)) { tokens[pos] = new Token(queryToken, TokenSource.Input, tokenType); } else if (context != null && tokenType.TryGetTokenFromContext(context, out queryToken)) { textCursor.RollbackPosition(); tokens[pos] = new Token(queryToken, TokenSource.Context, tokenType); } else if (!tokenType.IsOptional) { queryMatch = false; break; } else { textCursor.RollbackPosition(); } } if (textCursor.RightToLeftParsing) { rightPos--; } else { leftPos++; } if (tokenType != null && tokenType.InvertParsing) { textCursor.InvertParsing(); } } var remainingText = textCursor.All(); if (queryMatch && (!syntax.PerfectMatchOnly || string.IsNullOrEmpty(remainingText))) { expression = new Expression(tokens, syntax, context, remainingText); } else { queryMatch = false; expression = null; } return queryMatch; }
public abstract bool TryGetTokenFromInput(ITextCursor textCursor, out T token);
public bool TryParse(ITextCursor textCursor, Syntax syntax, IRequestContext context, out Expression expression) { var queryMatch = true; var tokens = new Token[syntax.TokenTypes.Length]; var leftPos = 0; var rightPos = syntax.TokenTypes.Length - 1; while (leftPos <= rightPos) { var pos = textCursor.RightToLeftParsing ? rightPos : leftPos; var tokenType = syntax.TokenTypes[pos]; if (tokenType != null) { textCursor.SavePosition(); object queryToken; if (tokenType.TryGetTokenFromInput(textCursor, out queryToken)) { tokens[pos] = new Token(queryToken, TokenSource.Input, tokenType); } else if (context != null && tokenType.TryGetTokenFromContext(context, out queryToken)) { textCursor.RollbackPosition(); tokens[pos] = new Token(queryToken, TokenSource.Context, tokenType); } else if (!tokenType.IsOptional) { queryMatch = false; break; } else { textCursor.RollbackPosition(); } } if (textCursor.RightToLeftParsing) { rightPos--; } else { leftPos++; } if (tokenType != null && tokenType.InvertParsing) { textCursor.InvertParsing(); } } var remainingText = textCursor.All(); if (queryMatch && (!syntax.PerfectMatchOnly || string.IsNullOrEmpty(remainingText))) { expression = new Expression(tokens, syntax, context, remainingText); } else { queryMatch = false; expression = null; } return(queryMatch); }