Парсер простых математических выражений - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток, люди помогите перелопатил весь нет не могу решить одну задачку. Вот задание: Разработать анализатор : строка вводимого интерпетуется программой , которая выполняет нужные действия , заданные пользователем в строке . Реализовать простые арифметические операции ( / * - + ) . Например, в textBox1 вводим строку « 2 плюс 5 » или «2+5», нажимаем button1 результат выводится на textBox2 программы должно быть - «7». Застрял на том как производить арифметические операции словами "плюс" "+" и т.д , или хотя бы подскажите в каком направлении искать, может я не там искал. Заранее спасибо.

Решение задачи: «Парсер простых математических выражений»

textual
Листинг программы
        enum opType
        {
            add, sub, mul, div, pow
        }
 
        static Parser<opType> Operator(string op, opType type)
        {
            return Parse.String(op).Token().Return(type);
        }
 
        static double binaryApply(opType op, double a, double b)
        {
            switch (op)
            {
                case opType.add:
                    return a + b;
                case opType.sub:
                    return a - b;
                case opType.div:
                    return a / b;
                case opType.mul:
                    return a * b;
                case opType.pow:
                    return Math.Pow(a, b);
                default: throw new ParseException();
            }
        }
 
        static readonly Parser<double> constant = Parse.Decimal.Select(x => double.Parse(x)).Named("number");
 
        static readonly Parser<opType> add = Operator("+", opType.add);
        static readonly Parser<opType> sub = Operator("-", opType.sub);
        static readonly Parser<opType> div = Operator("/", opType.div);
        static readonly Parser<opType> mul = Operator("*", opType.mul);
        static readonly Parser<opType> pow = Operator("^", opType.pow);
 
        static readonly Parser<double> factor = (from lparen in Parse.Char('(')
                                                 from ex in Parse.Ref(() => expr)
                                                 from rparen in Parse.Char(')')
                                                 select ex).XOr(constant);
 
        static readonly Parser<double> operand = ((from sign in Parse.Char('-')
                                                   from fact in factor
                                                   select -fact).XOr(factor)).Token();
 
        static readonly Parser<double> innerTerm = Parse.ChainOperator(pow, operand, binaryApply);
        static readonly Parser<double> term = Parse.ChainOperator(mul.Or(div), innerTerm, binaryApply);
        static readonly Parser<double> expr = Parse.ChainOperator(add.Or(sub), term, binaryApply);
 
        public static void Main2(string[] args)
        {
            while (true)
            {
                Console.Write(">> ");
                var s = Console.ReadLine();
                var r = expr.Parse(s);
                Console.WriteLine("\t{0}", r);
            }
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.25 из 5
Похожие ответы