Потому что, когда интерфейс для Lex и Yacc был определен много-много лет назад, использование глобальных переменных было гораздо более распространенным явлением. Reentrancy меняет интерфейс, и повторно входящие интерфейсы никогда не были формально стандартизированы (что, вероятно, так же хорошо, учитывая состояние игры). В то время многопоточность была не очень распространена, главным образом потому, что на типичном компьютере едва хватало ресурсов для одной компиляции (а иногда даже этого; для проходов компиляции также было довольно распространенным образом загружать исполняемые файлы).
Таким образом, по умолчанию остается не входящий, стандартизированный интерфейс. И, вероятно, так и останется, нравится нам это или нет.