как выполнить строковое логическое выражение?
прекрастно работает. я получу результат чему равно 12 И 5
Но что если мне неизвестно заранее логическое действие? или выражение конструируется на этапе выполнения?
int d=Convert.ToInt32("12 &15");
вот так выполнить - выдает ошибку! как можно решить эту проблему?
Запугал, кажись :D Но это единственный разумный подход, если неизвестно кол-во операторов, значений и т.д.
Ну или можно в лоб парсером, если формат выражения один и тот же.
Atarion, какой сложности выражения будут? Для простых легко свой парсер написать, для сложных есть разные подходы.
Нужно либо писать свое нечто, либо искать нечто уже существующее и разбираться в нем.
В конечном итоге использование может выглядеть примерно так:
p.variable("A", 12);
p.variable("B", 15);
int res = p.calculate("A & B");
[ATTACH]5167[/ATTACH]
Реализация на C++. Пример использования - в файле main.cpp.
Краткое описание.
Парсер арифметических и битовых выражений со скобками. Поддерживаются следующие операторы:
- +, -, *, /
- &, ^, |, ~
- >>, <<
- %
Адская жесть. И не лень было столько совершенно ненужного кода ваять? Вот реализация на PEG. На комбинаторах было бы еще короче.
P.S. "Ненужный код", по сути, в вашем варианте заключен вот здесь:
grammar
{
any = ['\u0000'..'\uFFFF'];
s : void = ' '*;
num : int = ['0'..'9']+ s;
parenthesesExpr : int = "("s expr ")"s;
unaryExpr : int = (("-" / "+")s)* (num / parenthesesExpr);
multiplicationExpr : int = unaryExpr ( ("*" / "/")s unaryExpr)*;
additionExpr : int = multiplicationExpr ( ("+" / "-")s multiplicationExpr)*;
expr : int = additionExpr;
start : int = s expr !any;
})]
А по сути ведь все сохранено. Если этот блок расписать, как раз мой вариант и получится.
А каков смысл отказываться от инструмента, который идеально подходит под задачу? (Для C# я использовал бы Coco/R, в C++ - boost::spirit). Тем более что этот PegGrammar - не магия компилятора, а всего лишь макрос.
P.S. "Ненужный код", по сути, в вашем варианте заключен вот здесь:
Приведенный код - необходимый минимум. Ты же не будешь спорить что, использовать ассемблер для программирования в ООП стиле вряд ли стоит, если под рукой есть компилятор ООП языка?
Вот только нафига писать руками код который вполне может изготовить машина?
Всего лишь с целью показать ТС-у суть работы парсера изнутри. Разумеется, если бы я писал конечный продукт для себя, я бы использовал другие инструменты, из перечисленных выше.