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