Exemple #1
0
 /// <summary>
 /// Метод проверяет применим ли символ <factor> к текущей позиции
 /// </summary>
 /// <param name="source">строка с исходным математическим выражением</param>
 /// <param name="pos">текущая позиция</param>
 /// <returns>истина, если применим, ложь -- в обратном случае</returns>
 public static bool IsApplicable(string source, int pos)
 {
     if (pos >= source.Length)
     {
         return(false);
     }
     return(source[pos] == '(' || NumberParser.IsApplicable(source, pos) || VariableParser.IsApplicable(source, pos) || source[pos] == 's' || source[pos] == 'c' || source[pos] == 'p' || source[pos] == 'e');
 }
Exemple #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));
        }