static void Main(string[] args) { Parser parser = new Parser(); Stack stack = new Stack(); Dictionary <char, int> constants = new Dictionary <char, int>(); // initialize Evaluator HERE Evaluate evaluate = new Evaluate(); int counter = 0; List <string> Escape = new List <string>() { "quit", "exit", "escape", "stop" }; // exit commands string lastq = "lastq"; string lastanswer = "last"; // ask the user for a basic mathematical equation Console.WriteLine("Please type a basic expression you would like me to find the answer to."); Console.WriteLine("Include one of the following operators: + - * / %."); Console.WriteLine("Get your last answer by typing last"); Console.WriteLine("Get your last question by typing lastq"); Console.WriteLine("You can also define constants to use in your expressions. ( x = 1 )"); Console.WriteLine("Get a list of constants by typing constants"); Console.WriteLine("Exit at anytime by typing exit / quit / escape / stop"); while (true) { string userInput = ConsoleReadLineWithDefault($"[{counter}]> "); counter++; if (Escape.Contains(userInput)) { Console.WriteLine("Bye!!"); System.Threading.Thread.Sleep(1000); Environment.Exit(0); } else if (userInput.Equals(lastq)) { // lastq from stack Console.WriteLine(stack.LastQuery); } else if (userInput.Equals(lastanswer)) { // calls lastanswer from stack Console.WriteLine(stack.LastAnswer); } else if (userInput.Equals("constants")) { foreach (KeyValuePair <char, int> kvp in constants) { Console.WriteLine("Constant = {0}, Value = {1}", kvp.Key, kvp.Value); } } else { //evaluate input try { // send user input to parser function= stack.LastQuery = userInput; parser.ParseInput(userInput); int firstTerm = 0; int secondTerm = 0; if (parser.Operator.Equals('=')) { int n; bool isNumeric = int.TryParse(parser.FirstTerm, out n); if (isNumeric == false) { try { constants.Add(char.Parse(parser.FirstTerm.ToLower()), int.Parse(parser.SecondTerm)); } catch (ArgumentException) { Console.WriteLine($"A constant with key \"{parser.FirstTerm}\" already exists."); } } else { Console.WriteLine($"Invalid constant! Please use lowercase letters for constants."); } } else { if (parser.FirstTerm.Length > 1) { if (parser.SecondTerm.Length > 1) { firstTerm = int.Parse(parser.FirstTerm); secondTerm = int.Parse(parser.SecondTerm); } else { firstTerm = int.Parse(parser.FirstTerm); if (constants.ContainsKey(char.Parse(parser.SecondTerm))) { secondTerm = constants[char.Parse(parser.SecondTerm)]; } else { secondTerm = int.Parse(parser.SecondTerm); } } } else if (parser.SecondTerm.Length > 1 && parser.FirstTerm.Length == 1) { if (constants.ContainsKey(char.Parse(parser.FirstTerm))) { firstTerm = constants[char.Parse(parser.FirstTerm)]; } else { firstTerm = int.Parse(parser.FirstTerm); } secondTerm = int.Parse(parser.SecondTerm); } else if (constants.ContainsKey(char.Parse(parser.FirstTerm.ToLower())) && constants.ContainsKey(char.Parse(parser.SecondTerm))) { firstTerm = constants[char.Parse(parser.FirstTerm.ToLower())]; secondTerm = constants[char.Parse(parser.SecondTerm)]; } else if (constants.ContainsKey(char.Parse(parser.FirstTerm.ToLower()))) { firstTerm = constants[char.Parse(parser.FirstTerm.ToLower())]; secondTerm = int.Parse(parser.SecondTerm); } else if (constants.ContainsKey(char.Parse(parser.SecondTerm))) { firstTerm = int.Parse(parser.FirstTerm); secondTerm = constants[char.Parse(parser.SecondTerm.ToLower())]; } else { firstTerm = int.Parse(parser.FirstTerm); secondTerm = int.Parse(parser.SecondTerm); } int calculatedResult = evaluate.Calculate(firstTerm, secondTerm, parser.Operator); //test code -- fix when parser updated stack.LastAnswer = calculatedResult; Console.WriteLine($" = {calculatedResult}"); } } catch (Exception) { Console.WriteLine($"Sorry, { userInput } is not a valid request."); Console.WriteLine("Try again, something more simple like: 2 + 1. Take it easy on me"); } } } }