В отличие от алгоритма предыдущего раздела (представляющего чисто теоретический интерес), алгоритмы на основе рекурсивного спуска часто используются на практике. Этот метод применим, однако, далеко не ко всем грамматикам. Мы обсудим необходимые ограничения позднее.
Идея метода рекурсивного спуска такова. Для каждого нетерминала K мы строим процедуру ReadK, которая -- в применении к любому входному слову x -- делает две вещи:
Прежде чем описывать этот метод более подробно, договоримся о том, как процедуры получают сведения о входном слове и как сообщают о результатах своей работы. Мы предполагаем, что буквы входного слова поступают к ним по одной, т.е. имеется граница, отделяющая << прочитанную>> часть от << непрочитанной>>. Будем считать, что есть функция (без параметров)
Теперь мы можем сформулировать наши требования к процедуре ReadK. Они состоят в следующем:
Для удобства введем такую терминологию: выводимое из K слово будем называть K-словом, а любое начало любого выводимого из K слова -- K-началом. Два сформулированных требования вместе будем выражать словами <<ReadK корректна для