/// <summary> /// Попытка извлечь незначимый токен (пробел, конец строки, ...) /// </summary> /// <param name="formula">формула</param> /// <param name="currentTokenPosition">позиция в формуле, с которой нужно начинать парсить токен</param> /// <returns>информация о токене, null - токен не обнаружен</returns> public static ICalcToken TryToExtract(string formula, int currentTokenPosition) { var token = new CalcTokenFormatter(currentTokenPosition); for (var i = currentTokenPosition; i < formula.Length; i++) { switch (formula[i]) { case ' ': token.Formatter = CalcFormatterType.Space; token.TokenText += formula[i]; break; case '\t': token.Formatter = CalcFormatterType.Tab; token.TokenText += formula[i]; break; case '\n': case '\r': token.Formatter = CalcFormatterType.NewLine; token.TokenText += formula[i]; break; default: return(string.IsNullOrEmpty(token.TokenText) ? null : token); } } return(string.IsNullOrEmpty(token.TokenText) ? null : token); }
/// <summary> /// Общий метод извлечения очередного токена. Вызывает метод TryToExtract в классах токенов /// </summary> /// <param name="formula">текст формулы</param> /// <param name="previousToken">предыдущий токен. Null, если это первый токен</param> /// <returns>null - формула разобрана, иначе токен</returns> private ICalcToken TryToExtract(string formula, ICalcToken previousToken) { ICalcToken token; var position = previousToken == null ? 0 : previousToken.GetNextTokenPosition(); if (formula.Length == position) { return(null); // Формула распаршена } if ((token = CalcTokenIfStatement.TryToExtract(formula, position)) != null) { return(token); } if ((token = CalcTokenFormulaSeparator.TryToExtract(formula, position)) != null) { return(token); } if ((token = CalcTokenNumber.TryToExtract(formula, previousToken, position)) != null) { return(token); } if ((token = CalcTokenFormatter.TryToExtract(formula, position)) != null) { return(token); } if ((token = CalcTokenBracket.TryToExtract(formula, position)) != null) { return(token); } if ((token = CalcTokenLogicOperation.TryToExtract(formula, position)) != null) { return(token); } if ((token = CalcTokenMathOperation.TryToExtract(formula, previousToken, position)) != null) { return(token); } if (_tokenizers.Any(tokenizer => (token = tokenizer(formula, position)) != null)) { return(token); } return(new CalcTokenUnknown(position) { Error = FormulaError.UnexpectedSymbols, TokenText = formula[position].ToString(CultureInfo.InvariantCulture) }); }