示例#1
0
		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 ());
			}
		}
示例#2
0
 public CalcumalateResult(CalcumalateError error)
 {
     if (error != CalcumalateError.None)
     {
         this.Success = false;
         this.Error   = error;
     }
 }
示例#3
0
        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());
            }
        }
示例#4
0
        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);
        }
示例#5
0
		public CalcumalateResult (CalcumalateError error) {
			if (error != CalcumalateError.None) {
				this.Success = false;
				this.Error = error;
			}
		}
示例#6
0
        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
            });
        }