Парсер простых математических выражений - 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);
}
}