LL(1) | это... Что такое LL(1)? (original) (raw)

Question book-4.svg В этой статье не хватает ссылок на источники информации. Информация должна быть проверяема, иначе она может быть поставлена под сомнение и удалена.Вы можете отредактировать эту статью, добавив ссылки на авторитетные источники.Эта отметка установлена 12 мая 2011.

Нисходящий алгоритм синтаксического разбора.

Прост в написании вручную без использования автоматических генераторов. Используется для разбора ряда языков программирования, таких, как Pascal (по некоторым сведениям, язык разработан с умыслом сделать его разбираемым по LL(1)).

Очень быстр в исполнении, и имеет характерное сообщение об ошибке вида "ожидался такой-то символ".

Понятие "направляющие символы правила"

Для каждого нетерминала A в грамматике генерируется множество терминалов First(A), определенное следующим образом:

Для каждого правила генерируется множество направляющих символов, определенное следующим образом:

(возможны обобщения этих определений для случая наличия правил вида A -> null)

Понятно, что First(A) есть объединение множеств направляющих символов для всех правил с A в левой части.

Грамматика разбираема по LL(1), если для любой пары правил с одинаковой левой частью множества направляющих символов не пересекаются.

Описание анализатора

Используется стек, где находятся номера терминалов и нетерминалов, входной (терминалы) и выходной (номера правил) потоки.

Вначале в стек заносится E - начало грамматики.

Далее для каждого нового символа из входного потока, пока он не закончился: