- •Глава 12 Классы кс-языков
- •Алгоритм разбора по методу рекурсивного спуска
- •Пример реализации метода рекурсивного спуска
- •Расширенное применение распознавателей на основе метода рекурсивного спуска
- •Определение ll(k)-грамматики
- •Принципы построения распознавателей для ll(к)-грамматик
- •Алгоритм разбора для ll(1)-грамматик
- •Алгоритм построения множества first(1,a)
- •Алгоритм построения множества follow(1,a)
- •Пример построения распознавателя для ll(1)-грамматики
- •Принципы построения распознавателей для lr(k)-грамматик
- •Распознаватель для lr(0)-грамматики
- •Распознаватель для lr(1)-грамматики
- •Грамматики предшествования (основные принципы)
- •Грамматики простого предшествования
- •Алгоритм «сдвиг-свертка» для грамматики простого предшествования
- •Пример распознавателя для грамматики простого предшествования
- •Грамматики операторного предшествования
- •2. Различные порождающие правила имеют разные правые части, λ-правила отсутствуют.
- •Алгоритм «сдвиг-свертка» для грамматики операторного предшествования
- •Отношения между классами кс-грамматик
- •Отношения между классами кс-языков
Отношения между классами кс-грамматик
В данном учебном пособии было рассмотрено несколько основных классов КС-грамматик, для которых существуют линейные распознаватели, — это LL-грамматики, LR-грамматики и грамматики предшествования. Не все они были рассмотрены достаточно подробно, к тому же этими классами далеко не исчерпывается список всех известных КС-грамматик такого рода.
Можно еще, например, упомянуть класс грамматик ограниченного правого контекста (m,n) — ОПК(т,п). Это грамматики, допускающие построение распознавателя, основанного на алгоритме «сдвиг-свертка», в котором однозначный выбор между сдвигом и сверткой делается исходя из анализа m символов, находящихся на верхушке стека, и п текущих символов входной цепочки, считая от положения считывающей головки расширенного МП-автомата [6, т. 1]. Все ОПК(т,п)-грамматики для всех значений тип составляют класс ОПК-грамматик. Простейшим вариантом грамматик такого класса являются ОПК(1,1)-грамматики. Интересно, что с помощью этих грамматик, как и с помощью LR-грамматик, можно определить любой детерминированный КС-язык.
Далее в этом пункте будут рассмотрены различные классы КС-грамматик и существующие между ними нетривиальные соотношения.
В общем случае можно выделить правоанализируемые и левоанализируемые КС-грамматики. Об этих двух принципиально разных классах грамматик уже говорилось выше: первые предполагают построение левостороннего (восходящего) распознавателя, вторые — правостороннего (нисходящего). Это вовсе не значит, что для КС-языка, заданного, например, некоторой левоанализируемой грамматикой, невозможно построить расширенный МП-автомат, который порождает правосторонний вывод. Указанное разделение грамматик относится только к построению на их основе детерминированных МП-автоматов и детерминированных расширенных МП-автоматов. Только эти типы автоматов представляют интерес при создании компиляторов и анализе входных цепочек языков программирования. Недетерминированные автоматы, порождающие как левосторонние, так и правосторонние выводы, можно построить в любом случае для языка заданного любой КС-грамматикой, но для создания компилятора такие автоматы интереса не представляют (см. раздел «Распознаватели КС-языков. Автоматы с магазинной памятью», глава 11).
На рис. 12.10 изображена условная схема, дающая представление о соотношении классов левоанализируемых и правоанализируемых КС-грамматик [5, 6, т. 2, 42, 65].
Интересно, что классы левоанализируемых и правоанализируемых грамматик являются несопоставимыми. То есть существуют левоанализируемые КС-грамматики, на основе которых нельзя построить детерминированный расширенный МП-автомат, порождающий правосторонний вывод; и наоборот — существуют правоанализируемые КС-грамматики, не допускающие построение МП-автомата, порождающего левосторонний вывод. Конечно, существуют грамматики, подпадающие под оба класса и допускающие построение детерминированных автоматов как с правосторонним, так и с левосторонним выводом.
Следует помнить также, что все упомянутые классы КС-грамматик — это счетные, но бесконечные множества. Нельзя построить и рассмотреть все возможные левоанализируемые грамматики или даже все возможные LL( ^-грамматики. Сопоставление классов КС-грамматик производится исключительно на основе анализа структуры их правил. Только на основании такого рода анализа произвольная КС-грамматика может быть отнесена в тот или иной класс (или несколько классов).
Все это тем более интересно, если вспомнить, что рассмотренный в данном пособии класс левоанализируемых LL-грамматик является собственным подмножеством класса LR-грамматик: любая LL-грамматика является LR-грамматикой, но не наоборот — существуют LR-грамматики, которые не являются LL-грамматиками. Этот факт также нашел свое отражение в схеме на рис. 12.10. Значит, любая LL-грамматика является правоанализируемой, но существуют также и другие левоанализируемые грамматики, не попадающие в класс правоанализируемых грамматик.
Для LL(k)-rpaMMaTHK, составляющих класс LL-грамматик, интересна еще одна особенность: доказано, что всегда существует язык, который может быть задан LL(k)-грамматикой для некоторого k > 0, но не может быть задан LL(k)-грамматикой. Таким образом, все LL(k)-грамматики для всех k представляют определенный интерес (другое дело, что распознаватели для них при больших значениях k будут слишком сложны). Интересно, что проблема эквивалентности для двух LL(k)- грамматикой разрешима.
С другой стороны, для LR(k)- грамматикой, составляющих класс LR-грамматик, доказано, что любой язык, заданный LR(k)- грамматикой с k > 1, может быть задан LR(l)- грамматикой. То есть LR(k)-грамматики с k > 1 интереса не представляют. Однако доказательство существования LR(l)- грамматикой вовсе не означает, что такая грамматика всегда может быть построена (проблема преобразования КС-грамматик неразрешима).
На рис. 12.11 условно показана связь между некоторыми классами КС-грамматик, упомянутых в данном пособии. Из этой схемы видно, например, что любая ОПК-грамматика является LR-грамматикой, а также любая LL-грамматика является LR-грамматикой, но не всякая LL-грамматика является LR(l)- грамматикой.
Если вспомнить, что любой детерминированный КС-язык может быть задан, например, LR( 1 )-грамматикой (или ОПК(1,1)-грамматикой), но в то же время, классы левоанализируемых и правоанализируемых грамматик несопоставимы, то напрашивается вывод: один и тот же детерминированный КС-язык может быть задан двумя или более несопоставимыми между собой грамматиками. Таким образом, можно вернуться к мысли о том, что проблема преобразования КС-грамматик неразрешима (на самом деле, конечно, наоборот: из неразрешимости проблемы преобразования КС-грамматик следует возможность задать один и тот же КС-язык двумя несопоставимыми грамматиками). Это, наверное, самый интересный вывод, который можно сделать из сопоставления разных классов КС-грамматик.
