Предположим, у вас есть функция ...
def func(args)
#stuff
return func(otherargs)
затем обратите внимание, что в AST будет что-то вроде return -> func -> otherargs, с некоторыми аннотациями о типах и других типах. Когда вы обойдете его и заметите, что существует возврат F, где F - текущий функциональный фрейм, вы можете преобразовать его в PUSH ARGS, GOTO F вместо полного формирования стекового фрейма и так далее. Вам придется самостоятельно возиться с возвращаемыми значениями.
Также обратите внимание, что это будет значительно сложнее, если вы захотите ходить и выполнять вместо многопроходной системы. Мой инстинкт подсказывает, что ходьба и выполнение потребуют оглядки.
И, нет, я не думаю, что бизон сделает это для вас без цепочки парсеров. Вы анализируете семантику контекстно-зависимым способом.