Вы прибили проблему: у вас должна быть дополнительная информация помимо необработанных данных, входящих в AST.
Вы можете связать всю эту дополнительную информацию только с отдельными узлами дерева: если вы сделаете это, вы в конечном итоге создадите так называемое атрибутивное дерево. Теоретически (и если вы работаете), вы заставляете эту идею работать полностью. Вашему посетителю может потребоваться проверить / обновить информацию, связанную не только с узлом AST, который он посещает, но и с ключевыми детьми и родителями.
На практике полезно создавать вспомогательные структуры данных (например, таблицы символов), к которым может обращаться посетитель (и обновлять) по мере его прохождения по дереву. В результате вы получаете вид вырожденного атрибутивного дерева: вы связываете фрагменты таблицы символов с узлами AST, которые образуют области.
Вы искусственно запретили посетителю возвращать любое значение; если вы этого не сделаете, дочерний посетитель может передать полезные значения родительскому посетителю, что позволит родителю делать меньше специальных действий, достигая дерева.
В своем заявлении о проблеме вы не ограничивали своего посетителя от передачи значений дочерним элементам, поэтому вы можете передавать полезные значения. Чрезвычайно полезное значение для передачи - это таблица символов, связанная с окружающей областью видимости, так что детям-посетителям не нужно подниматься вверх по дереву, чтобы найти узел области видимости, и связанную таблицу символов.