public static void BadAssert (string input, CalcumalateError output) { CalcumalateResult result = Calcumalator.Calcumalate (input); if (result.Error != output) { Debug.WriteLine (input + " = " + output.ToString () + ", GOT " + result.Error.ToString ()); } }
public CalcumalateResult(CalcumalateError error) { if (error != CalcumalateError.None) { this.Success = false; this.Error = error; } }
public static void BadAssert(string input, CalcumalateError output) { CalcumalateResult result = Calcumalator.Calcumalate(input); if (result.Error != output) { Debug.WriteLine(input + " = " + output.ToString() + ", GOT " + result.Error.ToString()); } }
private static CalcumalateError PrecheckErrors(string input) { CalcumalateError bracketError = MissingBracket(input); if (bracketError != CalcumalateError.None) { return(bracketError); } MatchCollection matches = Regex.Matches(input, @"[+\-*/^]"); if (matches.Count > 1) { for (int i = 0; i < matches.Count - 1; i++) { Match m1 = matches [i]; Match m2 = matches [i + 1]; if (m2.Index - m1.Index <= 1) { if (m2.Value != "-") { return(CalcumalateError.SyntaxError); } } } } if (matches.Count > 0) { if (matches [matches.Count - 1].Index == input.Length - 1) { return(CalcumalateError.SyntaxError); } } //check for numbers with more than one decimal point if (Regex.IsMatch(input, @"\.\d+\.\d+")) { return(CalcumalateError.SyntaxError); } return(CalcumalateError.None); }
public CalcumalateResult (CalcumalateError error) { if (error != CalcumalateError.None) { this.Success = false; this.Error = error; } }
public static CalcumalateResult Calcumalate(string input) { string rawInput = input; input = input.Replace(" ", "").ToLower(); if (input [0] == '+') { input = input.Substring(1); } CalcumalateError precheckError = PrecheckErrors(input); if (precheckError != CalcumalateError.None) { return(new CalcumalateResult(precheckError)); } List <List <string> > lists = new List <List <string> > (); lists.Add(new List <string> ()); List <string> currentList = lists [0]; string previousOperator = null; string previousToken = null; while (input.Length > 0) { string token = GetNextToken(input); input = ReplaceFirst(input, token, ""); if (token == "") { return(new CalcumalateResult(CalcumalateError.UnknownOperator)); } if (IsOperator(token)) { if (OperatorIsHigher(previousOperator, token) && currentList.Count > 0) { lists.Add(new List <string> ()); currentList = lists [lists.Count - 1]; } if (token == "-") { if (previousToken == null || IsOperator(previousToken)) { token = "neg"; if (currentList.Count > 0) { lists.Add(new List <string> ()); currentList = lists [lists.Count - 1]; } } } previousOperator = token; } else if (IsConstant(token)) { token = Solve(token).ToString(); } else if (token == "(") { if (currentList.Count > 0) { lists.Add(new List <string> ()); currentList = lists [lists.Count - 1]; } continue; } else if (token == ")") { CalcumalateResult res = SolveList(lists); if (res.Error != CalcumalateError.None) { return(new CalcumalateResult(res.Error)); } else { token = res.Result.ToString(); } if (lists.Count <= 0) { lists.Add(new List <string> ()); } currentList = lists [lists.Count - 1]; } currentList.Add(token); previousToken = token; } double result = 0; while (lists.Count > 0) { CalcumalateResult res = SolveList(lists); if (res.Error != CalcumalateError.None) { return(new CalcumalateResult(res.Error)); } else { result = res.Result; } if (lists.Count > 0) { lists [lists.Count - 1].Add(result.ToString()); } } previousAnswer = result; return(new CalcumalateResult { Result = result }); }