using System.Linq.Expressions;
public static void Main()
string s = "3*x^2+2/5*x+4";
Expression<Func<double, double>> expr = MathExpressionGenerator.GetExpression(s);
var del = expr.Compile();
Console.WriteLine(del(10));
internal static class MathExpressionGenerator
public const string SupportedOps = "+-*/^";
private static readonly ParameterExpression Parameter = Expression.Parameter(typeof (double), "x");
public static Expression<Func<double, double>> GetExpression(string s)
ParameterExpression parameterExpression = Expression.Parameter(typeof (double), "x");
Expression result = GetExpressionInternal(s);
return Expression.Lambda<Func<double, double>>(result, Parameter);
private static Expression GetExpressionInternal(string s)
if (double.TryParse(s, out constant))
return Expression.Constant(constant, typeof (double));
foreach (char op in SupportedOps)
var split = s.Split(new[] {op}, StringSplitOptions.RemoveEmptyEntries);
var expression = GetExpressionInternal(split[0]);
for (int i = 1; i < split.Length; i++)
expression = RunOp(expression, GetExpressionInternal(split[i]), op);
throw new NotImplementedException("never throws");
private static Expression RunOp(Expression a, Expression b, char op)
return Expression.Add(a, b);
return Expression.Subtract(a, b);
return Expression.Divide(a, b);
return Expression.Multiply(a, b);
return Expression.Power(a, b);
throw new NotSupportedException();