Я знаю типичную конфигурацию лексера и синтаксического анализатора, где лексер читает исходный код и генерирует токены, которые затем направляются синтаксическому анализатору, а синтаксический анализатор использует их в качестве терминальных символов в своей грамматической продукции. В типичном синтаксическом анализаторе с рекурсивным спуском вы начинаете с вызова некоторой функции верхнего уровня, представляющей начальный нетерминал, а эта функция вызывает другие и считывает токен за токеном из лексера.
Но что, если мне нужны два разных парсера поверх одного и того же лексера?
Я имею в виду, что оба они читают из одного и того же места, потому что я не хочу читать один и тот же источник несколько раз, то есть множественные проходы запрещены, чтобы избежать ненужного дублирования работы в лексере. Я просто хочу, чтобы, когда следующий токен в последовательности только что был сгенерирован, оба синтаксических анализатора потребляли его одновременно.
Но я могу вызвать только одну функцию верхнего уровня в одном из этих парсеров; не могу вызвать оба одновременно :/
Есть ли способ запустить эти парсеры в каком-то пошаговом режиме? То есть, когда у меня есть новый токен, я хочу передать его обоим парсерам один за другим, но только для того, чтобы продвинуть их на этот один токен, обновить их внутренние состояния и структуры данных, насколько они могут, и немедленно вернуться ждать другого токена.
Я никогда раньше не видел такой конфигурации. Можно ли вообще построить парсер таким образом? Есть какие-то материалы о том, как такой парсер можно структурировать в коде? У него есть какое-то имя?
РЕДАКТИРОВАТЬ 1: я не хочу использовать какой-либо генератор синтаксических анализаторов, а пишу код сам, потому что я хочу узнать, как такие вещи работают внутри.