in src/extensions/template_extension/ExpressionCalculator.cs [465:535]
private dynamic Factor()
{
dynamic value;
if (_tokenType == TokenType.Number)
{
value = double.Parse(_token);
NextToken();
}
else if (_tokenType == TokenType.String)
{
value = _token;
NextToken();
}
else if (_tokenType == TokenType.Bool)
{
value = bool.Parse(_token);
NextToken();
}
else if (_tokenType == TokenType.Identifier)
{
Function? function;
Constant? constant;
Variable? variable;
if ((function = FunctionFromString(_token)) != null)
{
NextToken();
value = function.Delegate();
if (value is double)
{
value = Exact(value);
}
}
else if ((constant = ConstantFromString(_token)) != null)
{
NextToken();
value = constant.Value;
if (value is double)
{
value = Exact(value);
}
}
else if ((variable = VariableFromString(_token)) != null)
{
NextToken();
value = variable.Value;
if (value is double)
{
value = Exact(value);
}
}
else
{
throw new CalcException("Undefined symbol", _position);
}
}
else if (_tokenType == TokenType.OpenParen)
{
NextToken();
value = Expression();
if (_tokenType != TokenType.CloseParen)
{
throw new CalcException("Expected close parenthesis", _position);
}
NextToken();
}
else
{
throw new CalcException("Expected number, function, or constant", _position);
}
return value;
}