Сочетание лексера со многими парсерами - PullRequest
1 голос
/ 22 февраля 2011

Мне известна типичная конфигурация лексера и парсера, где лексер читает исходный код и генерирует токены, которые затем направляются на парсер, и парсер использует их в качестве терминальных символов в своих грамматических произведениях.В типичном парсере с рекурсивным спуском вы начинаете с вызова некоторой функции верхнего уровня, представляющей начальный нетерминал, и эта функция вызывает другие и читает токен токеном из лексера.

Но что, если мне понадобится два разных парсера поверх одного и того же лексера?

Я имею в виду, они оба читают из одного места, потому что я не хочу читать один и тот же источник несколько раз, то есть несколько проходов не допускаются , чтобы избежать ненужной дублирующей работы в лексере.Я просто хочу, чтобы, когда только что был сгенерирован следующий токен в последовательности, оба парсера использовали его одновременно.

Но я могу вызвать только одну функцию верхнего уровня в один из этих парсеров;не может вызвать оба одновременно: /

Есть ли способ запустить эти парсеры в каком-то шаговом режиме ?То есть, когда у меня есть новый токен, я хочу передать его обоим парсерам один за другим, но только для того, чтобы продвигать их по одному токену, обновлять их внутренние состояния и структуры данных, насколько это возможно, и немедленно возвращать ихждать другого токена.

Я никогда не видел подобной конфигурации.Можно ли вообще так построить парсер?Существуют ли материалы о том, как этот вид парсера может быть структурирован в коде?У него есть какое-нибудь имя?

РЕДАКТИРОВАТЬ 1: Я не хочу использовать какой-либо инструмент генератора синтаксического анализатора, но сам пишу код, потому что я хочу узнать, как этот тип вещей работает внутри..

1 Ответ

2 голосов
/ 23 февраля 2011

Вы описали типичный поток парсера. Он вызывается один раз и принимает управление, пока все его входные данные не будут полностью проанализированы. Парсер сам вызывает lexer для получения следующего токена. С другой стороны, push-парсер вызывается каждый раз, когда становится доступным новый токен. Таким образом, вы можете вызывать несколько парсеров для каждого нового токена. Классический Зубр может использоваться в режиме толчка (подробности там ). Lemon генератор парсера генерирует парсеры push.

...