Ejemplo n.º 1
0
        /// <summary>
        /// Метод выполянет разбор исходной строки, начиная с указанной позиции
        /// и заканчивая концом выражения
        /// </summary>
        /// <param name="source">строка с исходным математическим выражением</param>
        /// <param name="pos">текущая позиция (изменяется)</param>
        /// <returns>экземпляр Expression</returns>
        /// <exception cref="ParserException" />
        /// <exception cref="InvalidOperationException" />
        public static IExpression Parse(string source, ref int pos)
        {
            IExpression left = TermParser.Parse(source, ref pos);

            ParserImpl.SkipSpaces(source, ref pos);
            if (pos == source.Length)
            {
                return(left);
            }

            if (source[pos] == '+' || source[pos] == '-')
            {
                char op = source[pos];
                pos++;
                ParserImpl.SkipSpaces(source, ref pos);
                if (!ExprParser.IsApplicable(source, pos))
                {
                    throw new ParserException("Invalid expression at " + pos);
                }

                IExpression right = ExprParser.Parse(source, ref pos);

                switch (op)
                {
                case '+': return(new AddOperation(left, right));

                case '-': return(new SubtractOperation(left, right));
                }

                throw new InvalidOperationException("Invalid parser state");
            }

            return(left);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Метод выполянет разбор исходной строки, начиная с указанной позиции
        /// и заканчивая концом выражения
        /// </summary>
        /// <param name="source">строка с исходным математическим выражением</param>
        /// <param name="pos">текущая позиция (изменяется)</param>
        /// <returns>экземпляр Expression</returns>
        /// <exception cref="ParserException" />
        public static IExpression Parse(string source, ref int pos)
        {
            if (pos + 1 < source.Length && source[pos] == 'p' && source[pos + 1] == 'i')
            {
                pos += 2;
                return(new NumberExpr(3.141));
            }
            if (source[pos] == 'e')
            {
                pos++;
                return(new NumberExpr(2.718));
            }
            if (source[pos] == '(')
            {
                pos++;
                ParserImpl.SkipSpaces(source, ref pos);
                if (!ExprParser.IsApplicable(source, pos))
                {
                    throw new ParserException("Invalid expression at " + pos);
                }

                IExpression expr = ExprParser.Parse(source, ref pos);

                ParserImpl.SkipSpaces(source, ref pos);
                if (pos == source.Length || source[pos] != ')')
                {
                    throw new ParserException("Expected ) at " + pos);
                }

                pos++;
                return(expr);
            }
            if (pos < source.Length - 3 && source[pos] == 's' && source[pos + 1] == 'i' && source[pos + 2] == 'n' && source[pos + 3] == '(')
            {
                pos += 4;
                ParserImpl.SkipSpaces(source, ref pos);
                if (!ExprParser.IsApplicable(source, pos))
                {
                    throw new ParserException("Invalid expression at " + pos);
                }

                IExpression expr = ExprParser.Parse(source, ref pos);

                ParserImpl.SkipSpaces(source, ref pos);
                if (source[pos] != ')')
                {
                    throw new ParserException("Invalid expression at " + pos);
                }
                pos++;
                return(new SinFunction(expr));
            }
            if (pos < source.Length - 3 && source[pos] == 'c' && source[pos + 1] == 'o' && source[pos + 2] == 's' && source[pos + 3] == '(')
            {
                pos += 4;
                ParserImpl.SkipSpaces(source, ref pos);
                if (!ExprParser.IsApplicable(source, pos))
                {
                    throw new ParserException("Invalid expression at " + pos);
                }

                IExpression expr = ExprParser.Parse(source, ref pos);

                ParserImpl.SkipSpaces(source, ref pos);
                if (source[pos] != ')')
                {
                    throw new ParserException("Invalid expression at " + pos);
                }
                pos++;
                return(new CosFunction(expr));
            }
            if (NumberParser.IsApplicable(source, pos))
            {
                return(NumberParser.Parse(source, ref pos));
            }


            return(VariableParser.Parse(source, ref pos));
        }