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); }
private async Task <List <ParsedInput> > ParseInput(string inputText, IRequestContext context, CancellationToken cancellationToken) { var parsedInputs = new List <ParsedInput>(); var processedInputText = inputText; var textPreprocessors = TextPreprocessors.ToList().OrderBy(p => p.Priority); foreach (var preprocessor in textPreprocessors) { cancellationToken.ThrowIfCancellationRequested(); processedInputText = await preprocessor.ProcessTextAsync(processedInputText, context, cancellationToken) .ConfigureAwait(false); } var textCursor = new TextCursor(processedInputText, context); 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(); Expression expression; if (SyntaxParser.TryParse(textCursor, syntax, context, out expression)) { var commandParsedQuery = new ParsedInput(expression, commandProcessor); parsedInputs.Add(commandParsedQuery); break; } } } return(parsedInputs); }