Иногда семантику можно проверять по ходу разбора (т.е. построения дерева), иногда можно, но сложно,
а иногда просто нельзя. Если нельзя или сложно, то можно устроить отдельный рекурсивный обход по дереву
только для семантики.
На самом деле, никто не мешает обходить и по нескольку раз, на ходу это
дерево слегка, или как следует, трансформируя само дерево. Например, javac так и устроен.
Достоинство такого подхода в том, что отдельные фазы трансляции отделяются друг от друга.
Это особенно важно, если анализируемый язык сложный.
Недостаток --- потеря производительности и увеличение общего объема текста.
(Даже если использовать нечто вроде паттерна Visitor).