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