Esempio n. 1
0
        /// <summary>
        /// Возвращает уже инициализированный парсер, в котором уже есть большинство стандартных функций,
        /// избавлят от необходимости инициализировать самостоятельно.
        /// </summary>
        /// <returns></returns>
        public static RPNParser Default()
        {
            var rpnParser = new RPNParser();

            rpnParser.AddBinaryOperation(new BinaryOperationToken('-', (a, b) => a - b, 0, Associativity.Left));
            rpnParser.AddBinaryOperation(new BinaryOperationToken('+', (a, b) => a + b, 0, Associativity.Left));
            rpnParser.AddBinaryOperation(new BinaryOperationToken('*', (a, b) => a * b, 1, Associativity.Left));
            rpnParser.AddBinaryOperation(new BinaryOperationToken('/', (a, b) => a / b, 1, Associativity.Left));
            rpnParser.AddBinaryOperation(new BinaryOperationToken('%', (a, b) => a % b, 1, Associativity.Left));
            rpnParser.AddBinaryOperation(new BinaryOperationToken('^', (a, b) => Math.Pow(a, b), 2, Associativity.Right));

            rpnParser.AddFunction(new FunctionToken("!", (x) =>
            {
                if (x < 0 || x - (int)x > Double.Epsilon)
                {
                    throw new Exception("Факториал определен для целых положительных чисел");
                }

                double result = 1;
                for (int i = 2; i != (int)x + 1; i++)
                {
                    result *= i;
                }
                return(result);
            }, FunctionType.Postfix));

            rpnParser.AddFunction(new FunctionToken("sin", (x) => Math.Sin(x), FunctionType.Prefix));
            rpnParser.AddFunction(new FunctionToken("cos", (x) => Math.Cos(x), FunctionType.Prefix));
            rpnParser.AddFunction(new FunctionToken("tan", (x) => Math.Tan(x), FunctionType.Prefix));
            rpnParser.AddFunction(new FunctionToken("sqrt", (x) => Math.Sqrt(x), FunctionType.Prefix));
            rpnParser.AddFunction(new FunctionToken("abs", (x) => Math.Abs(x), FunctionType.Prefix));
            rpnParser.AddFunction(new FunctionToken("log", (x) => Math.Log(x), FunctionType.Prefix));
            rpnParser.AddFunction(new FunctionToken("log10", (x) => Math.Log10(x), FunctionType.Prefix));
            rpnParser.AddFunction(new FunctionToken("round", (x) => Math.Round(x), FunctionType.Prefix));
            rpnParser.AddFunction(new FunctionToken("truncate", (x) => Math.Truncate(x), FunctionType.Prefix));
            rpnParser.AddFunction(new FunctionToken("arccosine", (x) => Math.Acos(x), FunctionType.Prefix));
            rpnParser.AddFunction(new FunctionToken("arcsine", (x) => Math.Asin(x), FunctionType.Prefix));
            rpnParser.AddFunction(new FunctionToken("arctan", (x) => Math.Atan(x), FunctionType.Prefix));

            return(rpnParser);
        }