Сложно сказать, какой вопрос вы задаете. В Scheme (или Racket) вы почти наверняка написали бы такой «оценщик» напрямую, например:
- для E1 * E2, возврат (eval E1) раз (eval E2)
- для E1 + E2, возврат (eval E1) плюс (eval E2)
... так что оценщик будет буквально трехстрочным.
Обратите внимание, что в этом определении нет необходимости явно отслеживать стек (конечно, вы
может делать то же самое на любом другом языке - вы бы использовали явный стек, только если бы вы хотели написать
оценщик в виде цикла, и не хотел отделить шаг синтаксического анализа).
Чтобы разобрать выражение, вам нужно ... ну, вы, вероятно, хотите парсер. Если вы используете ракетку,
Вы можете взглянуть на пример калькулятора, который поставляется с Racket в collects/parser-tools/examples/calck.rkt
. Он обрабатывает все, что вы описываете. Я мог бы вставить все это сюда, но это, вероятно, излишне.