Как определить схемную функцию для инфиксного калькулятора?

Например, когда я ввожу (infix '(2 + 3)), он должен оценивать 5

Если я введу (infix '(7 - 3), он должен оценить 4

-6
Algorisum 11 Сен 2018 в 22:17

1 ответ

Лучший ответ

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

Для правильного преобразования инфикса в префикс (именно так вы рассчитываете свой результат в схеме) обычно требуется проанализировать весь ввод в дерево синтаксического анализа, и, как только это будет сделано правильно, остальное, на самом деле, будет тривиально (узлы дерева - это операции, а листья - числа).

Если вы поддерживаете только выражения двух операндов, это легко, просто используйте cadr, чтобы узнать, какой оператор у вас есть, и примените (возможно, используя eval [1] ) эту операцию к операндам


[1] Если вы используете eval, обратите внимание на комментарий Алекса Кнаута ниже.

0
Neowizard 2 Окт 2018 в 06:50