Ошибка состояла вот в чем. Я начал с кода отдельных AST-nodes (потому что казалось, что "тут сразу понятно, что писать"), затем помучил некоторое время парсинг, и только потом формально записал грамматику. Нужно было начинать с грамматики, и прежде всего записать ее в максимально простом виде (на что и обратили мое внимание устно
_foreseer и
в комментарии _zeux). То, что получается при таком упрощении, не эквивалентно моей версии (даже количество типов вершин дерева разбора другое). Поэтому, имея в наличии готовый код вершин, я уже "не замечал" такой возможности. Но версия zeux'а на порядки проще парсится, и позволяет написать ровно ту же функциональность.
По итогам истории Зеуха добавил в друзья, а сам, надеюсь, впредь буду умнее.