예제 #1
0
        public void WhenWrongOperatorExpressionIsPassed_Then_ExceptionShouldBeThrown()
        {
            var sut = new OperatorTermParser();

            Assert.Throws <InvalidOperationException>(() =>
            {
                var result = sut.Parse("&", 0);
            });
        }
예제 #2
0
        public void WhenExpressionIsPassed_Then_ItShoulBeOperator(string expression)
        {
            var sut = new OperatorTermParser();

            var result = sut.Parse(expression, 0);

            Assert.True(result.TermType == TermType.Operator);
            Assert.True(result.Term == expression);
        }
예제 #3
0
        public List <MathParserTermResult> Parse(string expression, bool allowParameters = false)
        {
            var terms = new List <MathParserTermResult>();

            if (String.IsNullOrWhiteSpace(expression))
            {
                throw new ArgumentNullException("Expression cannot be empty!");
            }

            var i = 0;

            while (i < expression.Length)
            {
                MathParserTermResult term = null;

                if (Char.IsDigit(expression[i]))
                {
                    term = new NumberTermParser().Parse(expression, i);
                }
                else
                if (OperatorTermParser.IsOperator(expression[i]))
                {
                    term = new OperatorTermParser().Parse(expression, i);
                }
                else
                if (Char.IsLetter(expression[i]))
                {
                    term = new FunctionOrConstTermParser().Parse(expression, i);
                }
                else
                if (SubExpressionTermParser.IsOpenParenthesis(expression[i]))
                {
                    term = new SubExpressionTermParser().Parse(expression, i);
                }
                else
                if (allowParameters && expression[i] == ',')
                {
                    i++;
                    continue;
                }

                if (term != null)
                {
                    i = term.EndPos;

                    terms.Add(term);
                }
                else
                {
                    throw new InvalidOperationException($"Wrong character '{expression[i]}' at [{i}]!");
                }
            }

            return(terms);
        }