Exemplo n.º 1
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 (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);
            }

            return(NumberParser.Parse(source, ref pos));
        }
Exemplo n.º 2
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);
        }
Exemplo n.º 3
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 = FactorParser.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 (!TermParser.IsApplicable(source, pos))
                {
                    throw new ParserException("Invalid term at " + pos);
                }

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

                switch (op)
                {
                case '*': return(new MultiplyOperation(left, right));

                case '/': return(new DivideOperation(left, right));
                }

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

            return(left);
        }
Exemplo n.º 4
0
        /// <summary>
        /// Метод преобразует строку, переданную в конструктор,
        /// в дерево операндов и возвращает указатель на корневой
        /// элемент.
        /// </summary>
        /// <returns>корневой элемент дерева операндов</returns>
        /// <see cref="Parser(string)"/>
        public IExpression Parse()
        {
            int pos = 0;

            ParserImpl.SkipSpaces(_source, ref pos);
            if (!ExprParser.IsApplicable(_source, pos))
            {
                throw new ParserException("Not a valid expression");
            }

            IExpression result = ExprParser.Parse(_source, ref pos);

            ParserImpl.SkipSpaces(_source, ref pos);
            if (pos != _source.Length)
            {
                throw new ParserException("Unexpected symbol at the end of expression after " + pos);
            }

            return(result);
        }