tokenize - функция-токенизатор, разбивает входную строку на токены
parse + ast - формируют абстрактное синтаксическое дерево
reduce - рекурсивно проходится по дереву и вычисляет значение
eval - принимает на вход строку (пример - "(1-25.6)*(2+((1-2)*(2+8)))") и вычисляет
Всё
В компиляторах всё это есть только гораздо сложнее, конечно же.
А алгоритм формирования аст-дерева я вообще сама придумала