Ожидаемо, я ж алгоритм не выложил)
На входе у нас список токенов
Заводим для начала стек и временный список
Начинаем итерироваться по токенам
Берём временный список и спускаемся по его элементам до "текущего" узла дерева (в начале список пуст, так что текущим узлом будет рут).
Если текущий узел - лист то выбираем всё из временного списка и заливаем в параметры инстанса AST (или стека, как хочешь). Иначе берём тип текущего токена и проверяем есть ли такой тип в детях текущего узла. Если есть - бросаем в временный список. Если нет - бросаем исключение о хуёвом коде.