Вопрос
Ссылка на принятое решение в: SO: expression_evaluator
Кто-нибудь может предоставить версию, которая также работает с отрицанием? такие вещи, как
((!(0 or !1) and !((0 or 1 or 1) and !1))
тоже нужно работать.
Я сделал так, чтобы отрицание 0 или 1 было хорошо, но я не могу заставить его работать с отрицанием целых групп (! в начале скобок)
Я пытался отменить tmp после возвращения из eval в блоке * expr == '(' .. если! до его вызова видели, но это не сработало.
Решение
Код в этом ответе немного специальный. Синтаксический анализ - это хорошо понятная область, здесь нет необходимости изобретать. Один из других ответов там рекомендует изучать анализ рекурсивного спуска. Я поддерживаю эту рекомендацию.
Другие советы
Алгоритм, описанный здесь , может работать с унарными операторами (операторы, имеющие один операнд) , а также функции. Р>
Однажды я использовал его в качестве основы для полного оценщика выражений C с поддержкой символьных переменных для консоли командной строки во встроенной системе. Я не использовал прилагаемый пример кода, а написал его с нуля, чтобы удовлетворить свои цели.