Catrobat.IDE.Core.Formulas.FormulaInterpreter.InterpretNumbers C# (CSharp) Method

InterpretNumbers() private method

Merges IFormulaNumber to FormulaTreeFactory.CreateNumberNode.
private InterpretNumbers ( IEnumerable tokens, IEnumerable lookAhead ) : IEnumerable
tokens IEnumerable
lookAhead IEnumerable
return IEnumerable
        private IEnumerable<IFormulaToken> InterpretNumbers(IEnumerable<IFormulaToken> tokens, IEnumerable<IFormulaToken> lookAhead)
        {
            var decimalSeparator = CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator;
            var numberTokens = new List<IFormulaToken>();
            var sbValue = new StringBuilder();
            var containsDecimalSeparator = false;

            var lookAhead2 = lookAhead.GetEnumerator();
            foreach (var token in tokens)
            {
                // yield any non-number token
                var numberToken = token as IFormulaNumber;
                if (numberToken == null)
                {
                    yield return token;
                    continue;
                }

                // append digit
                var digitToken = numberToken as FormulaNodeNumber;

                if (digitToken != null)
                {
                    numberTokens.Add(numberToken);
                    sbValue.Append(digitToken.Value.ToString("R", CultureInfo.InvariantCulture));
                }

                // append decimal separator
                var decimalSeparatorToken = numberToken as FormulaTokenDecimalSeparator;
                if (decimalSeparatorToken != null)
                {
                    if (containsDecimalSeparator)
                    {
                        SetParsingError(numberToken, AppResourcesHelper.Get("FormulaInterpreter_Number_DoubleDecimalSeparator"));
                        yield break;
                    }
                    numberTokens.Add(numberToken);
                    sbValue.Append(decimalSeparator);
                    containsDecimalSeparator = true;
                }

                // advance lookAhead parallel to tokens
                var newIndex = GetOrigin(numberToken).End;
                var nextToken = lookAhead2.FirstOrDefault(token2 => GetOrigin(token2).Start == newIndex);

                // yield common number of value tokens
                if (nextToken is IFormulaNumber) continue;
                FormulaTree commonToken;
                if (numberTokens.Count == 1)
                {
                    if (containsDecimalSeparator)
                    {
                        SetParsingError(numberTokens[0], AppResourcesHelper.Get("FormulaInterpreter_Number_SingleDecimalSeparator"));
                        yield break;
                    }
                    commonToken = (FormulaTree) numberTokens[0];
                }
                else
                {
                    // parse value
                    double value;
                    if (!double.TryParse(sbValue.ToString(), NumberStyles.Number, CultureInfo.InvariantCulture, out value))
                    {
                        SetParsingError(GetOrigin(numberTokens), AppResourcesHelper.Get("FormulaInterpreter_Number_Overflow"));
                        yield break;
                    }
                    commonToken = FormulaTreeFactory.CreateNumberNode(value);
                    SetOrigin(commonToken, GetOrigin(numberTokens));
                }
                yield return commonToken;
                numberTokens.Clear();
                sbValue.Clear();
                containsDecimalSeparator = false;
            }
        }