private IEnumerable<IFormulaToken> InterpretFunctions(IEnumerable<IFormulaToken> tokens)
{
foreach (var context in tokens.WithContext())
{
if (IsCancellationRequested) yield break;
var previousToken = context[0];
var token = context[1];
// attach argument to function
if (previousToken is IFormulaFunction)
{
if (!(token is FormulaTokenParameter))
{
SetParsingError(
source: Range.Empty(GetOrigin(previousToken).End),
message: AppResourcesHelper.Get("FormulaInterpreter_Function_Empty"));
yield break;
}
var unaryFunctionToken = previousToken as FormulaNodeUnaryFunction;
if (unaryFunctionToken != null)
{
var unaryParameterToken = (FormulaTokenUnaryParameter) token;
unaryFunctionToken.Child = unaryParameterToken.Parameter;
}
var binaryFunctionToken = previousToken as FormulaNodeBinaryFunction;
if (binaryFunctionToken != null)
{
var binaryParameterToken = (FormulaTokenBinaryParameter) token;
binaryFunctionToken.FirstChild = binaryParameterToken.FirstParameter;
binaryFunctionToken.SecondChild = binaryParameterToken.SecondParameter;
}
SetOrigin(previousToken, new[] { previousToken, token });
yield return previousToken;
continue;
}
// yield any other token
if (token != null && !(token is IFormulaFunction))
{
yield return token;
}
}
}