В основном из-за старой литературы и доступных инструментов.Экспериментируя с обоими методами, вы легко обнаружите, что обход AST создает очень медленный и запутанный код.Более того, код, отделенный от непосредственного синтаксиса, больше не похож на него.Это очень похоже на поддержку двух синхронизированных баз кода, что всегда является плохой идеей.Отладка, обслуживание становятся трудными.
Конечно, также может быть трудно обрабатывать семантику на узлах, если у вас нет хорошо спроектированного конечного автомата.На самом деле вы никогда не бывает хуже, чем обходить AST после факта, потому что это только один частный случай обработки семантики на узлах.
Часто можно услышать, что обход AST позволяет реализовать несколько семантик для одного и того же синтаксиса,На самом деле вы этого никогда не захотите, не только потому, что это требуется редко, но и по соображениям производительности.И, честно говоря, нетрудно написать отдельный синтаксис для другой семантики.Результаты всегда были лучше, когда оба спроектированы вместе.
И, наконец, в каждой нетривиальной задаче синтаксический синтаксический анализ - это самая легкая часть, правильная семантика и быстрое выполнение действий - сложная задача.Сосредоточение внимания на AST приближает задачу назад.