Метод рекурсивного спуска
Метод рекурсивного спуска или нисходящий разбор — это один из методов определения принадлежности входной строки к некоторому формальному языку, описанному LL(k) контекстно-свободной грамматикой. Это класс алгоритмов грамматического анализа, где правила формальной грамматики раскрываются, начиная со стартового символа, до получения требуемой последовательности токенов.
Идея метода
Для каждого нетерминального символа K строится функция, которая для любого входного слова x делает 2 вещи:
- Находит наибольшее начало z слова x, способное быть началом выводимого из K слова
- Определяет, является ли начало z выводимым из K
Такая функция должна удовлетворять следующим критериям:
- считывать из еще необработанного входного потока максимальное начало A, являющегося началом некоторого слова, выводимого из K
- определять является ли A выводимым из K или просто невыводимым началом выводимого из K слова
В случае, если такое начало считать не удается (и корректность функции для нетерминала K доказана), то входные данные не соответствуют языку, и следует остановить разбор.
Разбор заключается в вызове описанных выше функций. Если для считанного нетерминала есть составное правило, то при его разборе будут вызваны другие функции для разбора входящих в него терминалов. Дерево вызовов, начиная с самой «верхней» функции эквивалентно дереву разбора.
Наиболее простой и «человечный» вариант создания анализатора, использующего метод рекурсивного спуска, — это непосредственное программирование по каждому правилу вывода для нетерминалов грамматики.
Условия применения
Пусть в данной формальной грамматике N — это конечное множество нетерминальных символов; Σ — конечное множество терминальных символов, тогда метод рекурсивного спуска применим только, если каждое правило этой грамматики имеет следующий вид:
- или <math>A \rightarrow \alpha</math>, где <math>\alpha \subset (\Sigma \cup N)*</math>, и это единственное правило вывода для этого нетерминала
- или <math>A \rightarrow a_1\alpha_1|a_2\alpha_2|...|a_n\alpha_n</math> для всех <math>i=1,2...n; a_i \ne a_j, i \ne j; \alpha \subset (\Sigma \cup N)*</math>
Алгоритмы нисходящего разбора
- Рекурсивный нисходящий парсер (en:Recursive descent parser)
- LL-парсер (en:LL parser)
- Парсер старьёвщика (en:Packrat parser)
Литература
- А. Шень. Программирование: теоремы и задачи. 2-е изд., М.: МЦНМО, 2004
- Альфред В. Ахо, Моника С. Лам, Рави Сети, Джеффри Д. Ульман. Компиляторы: принципы, технологии и инструментарий = Compilers: Principles, Techniques, and Tools. — 2-е изд. — М.: Вильямс, 2008. — ISBN 978-5-8459-1349-4
- Робин Хантер Основные концепции компиляторов = The Essence of Compilers. — М.: «Вильямс», 2002. — С. 256. — ISBN 5-8459-0360-2
Программирование | Это незавершённая статья о программировании. Вы можете помочь проекту, исправив и дополнив её. |
ПО | Это незавершённая статья о программном обеспечении. Вы можете помочь проекту, исправив и дополнив её. |
en:Top-down parsing hr:Parsiranje od vrha prema dnu ja:トップダウン構文解析 ko:하향식 파싱 pl:Analiza zstępująca ro:Parsare top-down sr:Анализа наниже uk:Метод рекурсивного спуску
Если вам нравится SbUP.com Сайт, вы можете поддержать его - BTC: bc1qppjcl3c2cyjazy6lepmrv3fh6ke9mxs7zpfky0 , TRC20 и ещё....