Можно ли создать компилятор без AST?
Качественный нельзя.
В однопроходном компиляторе этапы синтаксического и семантического анализа могут быть объединены. AST становится виртуальной, существующей в памяти разборщика в момент его работы в виде стека контекстов и другой служебной информации, в явном виде (как в ANTLR) не создается . Предположительно именно так были реализованы классические компиляторы Turbo Pascal и Delphi.

Результатом работы такого разборщика становится промежуточное представление, уже не являющееся AST — семантический граф, промежуточный (трехадресный) код со служебной информацией, либо же какой-то свой тип. В своем проекте, скажем, я буду генерить обратимый код, поддерживающий отекстовку в сильно вариативный синтаксис.

Короче, причиной выбора подобной архитектуры компилятора должен быть особый случай, обусловленный особенностями проекта и описанный в его концепциях. Если вопрос был в том, можно ли написать разбор входного языка вручную, без использования генераторов синтаксических деревьев, — ответ «да», так пишут. Это хороший опыт.