Введение

Канонический LR-парсер (также называемый LR(1)-парсер) — это тип алгоритма синтаксического анализа снизу вверх, используемый в информатике для анализа и обработки языков программирования. Он основан на технике LR-парсинга, которая расшифровывается как "чтение слева направо, построение правостороннего вывода в обратном порядке". Формально, канонический LR-парсер является LR(k)-парсером для k=1, то есть с одним символом предварительного просмотра. Особенность этого парсера заключается в том, что любая LR(k)-грамматика с k>1 может быть преобразована в LR(1)-грамматику. Однако для уменьшения k требуются обратные подстановки, и по мере их увеличения грамматика может быстро стать большой, повторяющейся и сложной для понимания. LR(k) может обрабатывать все детерминированные контекстно-свободные языки. HYACC и LRSTAR.

История

В 1965 году Дональд Кнут изобрел LR(k)-парсер (парсер, выполняющий анализ слева направо с использованием правостороннего вывода), тип парсера сдвиг-сокращение, как обобщение существующих парсеров прецедентов. Этот парсер обладает потенциалом распознавания всех детерминированных контекстно-свободных языков и способен генерировать как левые, так и правые выводы выражений, встречающихся во входном файле. Кнут доказал, что максимальная мощность распознавания языка достигается при k=1, и предложил метод преобразования LR(k)-грамматик, где k > 1, в LR(1)-грамматики. LALR(1)-парсеры являются наиболее распространенной реализацией LR-парсера. Однако в 1977 году Дэвид Пейджер представил новый тип LR(1)-парсера, который некоторые называют "минимальным LR(1)-парсером", и показал, что LR(1)-парсеры могут быть созданы с требованиями к памяти, сопоставимыми с требованиями LALR(1)-парсеров. В последнее время некоторые генераторы парсеров предлагают минимальные LR(1)-парсеры, которые не только решают проблему с требованиями к памяти, но и устраняют проблему конфликтов, свойственную генераторам LALR(1)-парсеров. Кроме того, минимальные LR(1)-парсеры могут использовать действия сдвиг-сокращение, что делает их быстрее, чем канонические LR(1)-парсеры.

Создание таблиц анализа LR(1)

Таблицы разбора LR(1) строятся аналогично таблицам разбора LR(0), с той модификацией, что каждый элемент содержит символ предпросмотра (lookahead). Это означает, что в отличие от LR(0)-парсеров, может быть выполнено другое действие, если за обрабатываемым элементом следует другой терминальный символ.