- •Глава 12 Классы кс-языков
- •Алгоритм разбора по методу рекурсивного спуска
- •Пример реализации метода рекурсивного спуска
- •Расширенное применение распознавателей на основе метода рекурсивного спуска
- •Определение ll(k)-грамматики
- •Принципы построения распознавателей для ll(к)-грамматик
- •Алгоритм разбора для ll(1)-грамматик
- •Алгоритм построения множества first(1,a)
- •Алгоритм построения множества follow(1,a)
- •Пример построения распознавателя для ll(1)-грамматики
- •Принципы построения распознавателей для lr(k)-грамматик
- •Распознаватель для lr(0)-грамматики
- •Распознаватель для lr(1)-грамматики
- •Грамматики предшествования (основные принципы)
- •Грамматики простого предшествования
- •Алгоритм «сдвиг-свертка» для грамматики простого предшествования
- •Пример распознавателя для грамматики простого предшествования
- •Грамматики операторного предшествования
- •2. Различные порождающие правила имеют разные правые части, λ-правила отсутствуют.
- •Алгоритм «сдвиг-свертка» для грамматики операторного предшествования
- •Отношения между классами кс-грамматик
- •Отношения между классами кс-языков
Распознаватель для lr(0)-грамматики
Простейшим случаем LR(k)-грамматик являются LR(0)-грамматики. При k = О распознающий расширенный МП-автомат совсем не принимает во внимание текущий символ, обозреваемый его считывающей головкой. Решение о выполняемом действии принимается только на основании содержимого стека автомата. При этом не должно возникать конфликтов между выполняемым действием (сдвиг или свертка), а также между различными вариантами при выполнении свертки. Управляющая таблица для LR(0)-грамматики строится на основании понятия «левых контекстов» для нетерминальных символов: очевидно, что после выполнения свертки для нетерминального символа А в стеке МП-автомата ниже этого символа будут располагаться только те символы, которые могут встречаться в цепочке вывода слева от А. Эти символы и составляют «левый контекст» для А. Поскольку выбор между сдвигом или сверткой, а также между типом свертки в LR(0)-грамматиках выполняется только на основании содержимого стека, то LR(0)-грамматика должна допускать однозначный выбор на основе левого контекста для каждого символа [5, 65, т. 1, 15, 65].
Рассмотрим простую КС-грамматику G((a,b}, {S}, {S-»aSS|b}, S). Пополненная грамматика для нее будет иметь вид G({a,b}. {S, S'}, {S'-»S, S -»aSS|b}, S'). Эта грамматика является ЬК(0)-грамматикой. Управляющая таблица для нее приведена в табл. 12.2.
Таблица 12.2. Пример управляющей таблицы для !_Я(0)-грамматики
Колонка «Стек», присутствующая в таблице, в принципе не нужна для распознавателя. Она введена исключительно для пояснения каждого состояния стека автомата. Пустые клетки в таблице соответствуют состоянию «ошибка». Правила в грамматике пронумерованы от 1 до 3 (при этом будем считать, что состоянию «успех» — свертке к нулевому символу — в пополненной грамматике всегда соответствует первое правило). Распознаватель работает, невзирая на текущий символ, обозреваемый считывающей головкой расширенного МП-автомата, поэтому колонка «Действие» в таблице имеет только один столбец, не помеченный никаким символом, — указанное в ней данное действие выполняется всегда для каждой строки таблицы.
Рассмотрим примеры распознавания цепочек этой грамматики. Работу распознавателя будем отображать по шагам. Конфигурацию расширенного МП-автомата будем отображать в виде трех компонентов: не прочитанная еще часть входной цепочки символов, содержимое стека МП-автомата, последовательность номеров примененных правил грамматики (поскольку автомат имеет только одно состояние, его можно не учитывать). В стеке МП-автомата вместе с помещенными туда символами показаны и номера строк управляющей таблицы, соответствующие этим символам в формате (символ, номер строки}. Разбор цепочки abababb.
Соответствующая цепочка вывода будет иметь вид (используется правосторон ний вывод): S1 => S => aSS => aSaSS => aSaSaSS => aSaSaSb => aSaSabb => aSababb = abababb.
Распознаватель для LR(0)-грамматики достаточно прост. Приведенный выше пример можно сравнить с методом рекурсивного спуска или с распознавателем для LR(1)-грамматики — оба эти метода применимы к описанной выше грамматике. По количеству шагов работы распознавателя эти методы сопоставимы, но по реализации нисходящие распознаватели в данном случае немного проще.
