private IEnumerable<IFormulaToken> CompleteNumbers(IEnumerable<IFormulaToken> tokens)
{
var numberTokens = new List<IFormulaToken>();
var decimalSeparators = 0;
foreach (var token in tokens.WithContext().Select(context => context[1]))
{
// append digit
if (token is FormulaNodeNumber)
{
numberTokens.Add(token);
continue;
}
// append decimal separator
if (token is FormulaTokenDecimalSeparator)
{
if (decimalSeparators == 0)
{
numberTokens.Add(token);
decimalSeparators++;
continue;
}
decimalSeparators++;
}
// create common token of value
if (numberTokens.Count != 0)
{
IFormulaToken commonToken;
if (numberTokens.Count == 1)
{
if (decimalSeparators != 0) yield break;
commonToken = numberTokens[0];
}
else
{
commonToken = FormulaTreeFactory.CreateNumberNode(default(double));
SetOrigin(commonToken, GetOrigin(numberTokens));
}
yield return commonToken;
if (decimalSeparators > 1) yield break;
numberTokens.Clear();
decimalSeparators = 0;
}
// yield any non-number token
yield return token;
}
}