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

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

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

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

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

textual
Листинг программы
  1.         enum opType
  2.         {
  3.             add, sub, mul, div, pow
  4.         }
  5.  
  6.         static Parser<opType> Operator(string op, opType type)
  7.         {
  8.             return Parse.String(op).Token().Return(type);
  9.         }
  10.  
  11.         static double binaryApply(opType op, double a, double b)
  12.         {
  13.             switch (op)
  14.             {
  15.                 case opType.add:
  16.                     return a + b;
  17.                 case opType.sub:
  18.                     return a - b;
  19.                 case opType.div:
  20.                     return a / b;
  21.                 case opType.mul:
  22.                     return a * b;
  23.                 case opType.pow:
  24.                     return Math.Pow(a, b);
  25.                 default: throw new ParseException();
  26.             }
  27.         }
  28.  
  29.         static readonly Parser<double> constant = Parse.Decimal.Select(x => double.Parse(x)).Named("number");
  30.  
  31.         static readonly Parser<opType> add = Operator("+", opType.add);
  32.         static readonly Parser<opType> sub = Operator("-", opType.sub);
  33.         static readonly Parser<opType> div = Operator("/", opType.div);
  34.         static readonly Parser<opType> mul = Operator("*", opType.mul);
  35.         static readonly Parser<opType> pow = Operator("^", opType.pow);
  36.  
  37.         static readonly Parser<double> factor = (from lparen in Parse.Char('(')
  38.                                                  from ex in Parse.Ref(() => expr)
  39.                                                  from rparen in Parse.Char(')')
  40.                                                  select ex).XOr(constant);
  41.  
  42.         static readonly Parser<double> operand = ((from sign in Parse.Char('-')
  43.                                                    from fact in factor
  44.                                                    select -fact).XOr(factor)).Token();
  45.  
  46.         static readonly Parser<double> innerTerm = Parse.ChainOperator(pow, operand, binaryApply);
  47.         static readonly Parser<double> term = Parse.ChainOperator(mul.Or(div), innerTerm, binaryApply);
  48.         static readonly Parser<double> expr = Parse.ChainOperator(add.Or(sub), term, binaryApply);
  49.  
  50.         public static void Main2(string[] args)
  51.         {
  52.             while (true)
  53.             {
  54.                 Console.Write(">> ");
  55.                 var s = Console.ReadLine();
  56.                 var r = expr.Parse(s);
  57.                 Console.WriteLine("\t{0}", r);
  58.             }
  59.         }

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


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

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

8   голосов , оценка 4.25 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы