Парсер простых математических выражений - 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);
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д