Спасибо
за интересную статью. Сейчас как раз занимаюсь точно такой же задачей. Но с несколько иным подходом. В связи с этим хотелось бы уточнить пару моментов. Первый момент, это введени правоассоциативных операций, таких как возведение в степень. Если этого не учитывать на начальных этапах проектирования, то после придется вносить изменения непосредственно в код, даже в такой красивый как Ваш.
Второй момент уже более труден, нужно как-то ввести поддержку контроля передаваемых параметров в функции, иначе возможна ситуация, когда при неправильном количестве параметров возникнет ошибка. Но возникнет она уже после вызова функции и интерпретатор не сможет правильно идентифицировать причину ошибки. Понятно, что нужно как-то уметь отличать в стэке параметры функций от простых чисел и переменных.
Ну, и малость портит впечатление таблица приоритетов. Все-таки, можно эту проблему решить по другому. Как Вы правильно заметили, токен
’)’ выбивается из остальных своей спецификой. Учтем так же, что нам необходимо распознавать унарные операции. Их распознать легко, они могут следовать только за открывающей скобкой, либо сразу после другой операции, либо в самом начале строки. Таким образом при "расфасовке" необходимо распознавать следующие ситуации:
’(’ - выставляем флаг возможной унарной операции
’)’ - раскрутка стэка и сброс флага унарной операции
op - любая операция, выставляем флаг унарной возможной операции
symb - это все, что не относится к предыдущим категориям, сбрасываем флаг унарной операции.
То есть, здесь меньший уровень абстрагирования от типа данных, нежели чем у Вас, но, тем не менее, такой код тоже не потребует никакой переделки при добавлении новых команд и функций.
PS: Еще раз спасибо за статью, хотя бы убедился, что не только я люблю оставлять задел "на будущее" :)