public static void Main(string[] args) { var input = args.Length == 0 ? "(7*((x+5)*(x+5)))" : string.Join(" ", args); Console.WriteLine($"Parsing: {input}"); // Tokenize var tokens = from t in new[] { input } from t1 in t.Split(' ') from t2 in t1.SplitAndKeep('(') from t3 in t2.SplitAndKeep(')') from t4 in t3.SplitAndKeep('+') from t5 in t4.SplitAndKeep('*') from t6 in t5.SplitAndKeep('-') from t7 in t6.SplitAndKeep('^') select t7; var tokenArray = tokens.ToArray(); Console.WriteLine($"Input was tokenized to: [{string.Join(", ", tokenArray)}]"); var parser = ExpressionParser.GetExpressionParser(); var result = parser.Run(tokenArray); // Evaluate expression switch (result) { case Ok <IExpression <double> > ok: var printer = new PrettyPrint(); var str = printer.Eval(ok.Value); Console.WriteLine($"Parsed as: {str}"); var toDual = new EvaluateDual(); var dual = toDual.Eval(ok.Value); Console.WriteLine($"Evaluated to: {dual.Value} for x=1."); Console.WriteLine($"With derivative: {dual.Deriv} for x=1."); break; default: throw new ArgumentOutOfRangeException(nameof(result)); } }