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" />
        /// <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);
        }
Ejemplo n.º 3
0
 /// <summary>
 /// Метод проверяет применим ли символ <expr> к текущей позиции
 /// </summary>
 /// <param name="source">строка с исходным математическим выражением</param>
 /// <param name="pos">текущая позиция</param>
 /// <returns>истина, если применим, ложь -- в обратном случае</returns>
 public static bool IsApplicable(string source, int pos)
 {
     return(TermParser.IsApplicable(source, pos));
 }