Это может стать действительно сложным довольно быстро. Рассмотрим (1 - 2 * 3)
.
Если ваш калькулятор поддерживает только сложение и отрицание, это все еще не тривиально. Рассмотрим (5 - 5 - 5)
. Если вы считаете входные данные левоассоциативными, вы получите правильный -5, но если вы прочитаете их как правые ассоциативные (что является обычной ошибкой, если вы анализируете выражение с помощью некоторого парсера LL), вы получите 0.
Для правильного преобразования из инфикса в префикс (именно так вы будете вычислять свой результат в Схеме) обычно вам нужно проанализировать весь ввод в дерево разбора, и как только это будет сделано правильно, остальное на самом деле, тривиально (узлы дерева - это операции, а листья - числа).
Если вы поддерживаете только выражения двух операндов, это просто, просто используйте cadr
, чтобы узнать, какой оператор вы получили, и примените (возможно, используя eval
[1] ) эту операцию к операнды
[1] Если вы используете eval
, обратите внимание на комментарий Алекса Кнаута ниже.