Открыть сервис

Контекстно-свободная грамматика

Контекстно-свободная грамматика (КС-грамматика, бесконтекстная грамматика) — это формальная грамматика, в которой правила вывода имеют вид \( A \to \gamma \), где \( A \) — нетерминальный символ, а \( \gamma \) — строка, состоящая из терминальных и нетерминальных символов (возможно, пустая). КС-грамматики являются одним из основных классов формальных грамматик в иерархии Хомского и порождают контекстно-свободные языки. Они широко используются в теории языков программирования, компиляторах, обработке естественного языка и биоинформатике.

Определение и формальное описание

Формально контекстно-свободная грамматика задаётся четвёркой \( G = (N, \Sigma, P, S) \), где:

  • \( N \) — конечное множество нетерминальных символов (переменных);
  • \( \Sigma \) — конечное множество терминальных символов (алфавит), причём \( N \cap \Sigma = \varnothing \);
  • \( P \) — конечное множество правил вывода (продукций) вида \( A \to \alpha \), где \( A \in N \), \( \alpha \in (N \cup \Sigma)^* \);
  • \( S \in N \) — начальный нетерминал (аксиома).

Вывод (деривация) строки из терминалов начинается с \( S \) и последовательно заменяет нетерминалы согласно правилам. Язык, порождаемый грамматикой \( G \), обозначается \( L(G) \) и состоит из всех строк \( w \in \Sigma^* \), которые можно вывести из \( S \).

Пример

Рассмотрим грамматику \( G = (\{S\}, \{a, b\}, P, S) \) с правилами:

  • \( S \to aSb \)
  • \( S \to \varepsilon \) (пустая строка)

Эта грамматика порождает язык \( \{ a^n b^n \mid n \ge 0 \} \), состоящий из строк вида «ab», «aabb», «aaabbb» и т.д. Вывод строки «aabb»: \( S \Rightarrow aSb \Rightarrow aaSbb \Rightarrow aabb \).

Свойства контекстно-свободных грамматик

Иерархия Хомского

КС-грамматики занимают второй уровень в иерархии Хомского (тип 2). Они менее мощны, чем контекстно-зависимые грамматики (тип 1), но мощнее, чем регулярные грамматики (тип 3). Регулярные языки являются подмножеством контекстно-свободных, однако существуют языки, не являющиеся контекстно-свободными (например, \( \{ a^n b^n c^n \mid n \ge 0 \} \)).

Замкнутость и неразрешимость

Класс контекстно-свободных языков замкнут относительно следующих операций:

  • объединение;
  • конкатенация;
  • итерация (звезда Клини);
  • пересечение с регулярным языком;
  • гомоморфизм.

Однако он не замкнут относительно пересечения и дополнения. Например, пересечение двух КС-языков \( \{ a^n b^n c^m \mid n, m \ge 0 \} \) и \( \{ a^m b^n c^n \mid n, m \ge 0 \} \) даёт язык \( \{ a^n b^n c^n \mid n \ge 0 \} \), который не является контекстно-свободным.

Для КС-грамматик неразрешимы следующие проблемы:

  • эквивалентность двух грамматик;
  • однозначность грамматики;
  • пустота пересечения двух языков;
  • принадлежность строки языку, порождённому произвольной грамматикой (хотя для конкретных грамматик это разрешимо).

Деревья вывода и однозначность

Каждому выводу строки в КС-грамматике соответствует дерево вывода (дерево разбора), где внутренние узлы помечены нетерминалами, а листья — терминалами. Если для некоторой строки существует более одного дерева вывода, грамматика называется неоднозначной. Например, грамматика для арифметических выражений:

  • \( E \to E + E \mid E * E \mid (E) \mid id \)

является неоднозначной, так как строка «id + id * id» может быть выведена двумя способами, соответствующими разным приоритетам операций. Для устранения неоднозначности вводят дополнительные нетерминалы или правила.

Классификация и виды

По форме правил

  • Нормальная форма Хомского (Chomsky Normal Form, CNF): все правила имеют вид \( A \to BC \) или \( A \to a \), где \( A, B, C \in N \), \( a \in \Sigma \). Исключение составляет правило \( S \to \varepsilon \), если пустая строка принадлежит языку. Любая КС-грамматика может быть преобразована в CNF.
  • Нормальная форма Грейбах (Greibach Normal Form, GNF): все правила имеют вид \( A \to a\alpha \), где \( a \in \Sigma \), \( \alpha \in N^* \). В GNF каждый шаг вывода добавляет один терминал, что удобно для синтаксического анализа.

По типу порождаемого языка

  • Детерминированные контекстно-свободные языки: порождаются грамматиками, которые могут быть распознаны детерминированным автоматом с магазинной памятью (ДМП-автоматом). Например, язык \( \{ a^n b^n \mid n \ge 0 \} \) является детерминированным.
  • Недетерминированные: требуют недетерминированного МП-автомата. Например, язык палиндромов \( \{ ww^R \mid w \in \{a, b\}^* \} \).

По приложениям

  • LL(k)-грамматики: допускают нисходящий синтаксический анализ с просмотром \( k \) символов вперёд. Используются в компиляторах (например, ANTLR).
  • LR(k)-грамматики: допускают восходящий анализ. Являются более мощными, чем LL(k). Используются в генераторах парсеров (Yacc, Bison).
  • LALR(1): подмножество LR(1), наиболее распространённое на практике.

Применение

Языки программирования

Синтаксис большинства языков программирования (C, Java, Python, JavaScript) описывается с помощью КС-грамматик. Например, грамматика языка C (ANSI C) содержит около 200 правил. Компиляторы используют синтаксические анализаторы, построенные на основе КС-грамматик, для проверки корректности программы и построения абстрактного синтаксического дерева (AST).

Обработка естественного языка

В лингвистике КС-грамматики применяются для моделирования синтаксической структуры предложений. Например, грамматика фразовых структур (Phrase Structure Grammar) описывает предложения через составляющие: \( S \to NP \, VP \), \( NP \to Det \, N \), \( VP \to V \, NP \). Однако для полного описания естественных языков требуются более мощные формализмы (например, трансформационные грамматики).

Биоинформатика

КС-грамматики используются для моделирования вторичной структуры РНК. Например, грамматика:

  • \( S \to aSu \mid uSa \mid cSg \mid gSc \mid \varepsilon \)

описывает шпильки и петли, характерные для РНК. Также применяются стохастические КС-грамматики для предсказания структуры.

Теория формальных языков

КС-грамматики служат основой для изучения свойств языков, разрешимости и сложности. Они связаны с автоматами с магазинной памятью (МП-автоматами), которые являются распознавателями для КС-языков.

Алгоритмы синтаксического анализа

Нисходящий анализ (Top-Down)

  • Рекурсивный спуск: рекурсивная реализация правил грамматики. Требует отсутствия левой рекурсии.
  • LL-анализ: использует таблицу предсказаний. Работает для LL(k)-грамматик.
  • Алгоритм Кока-Янгера-Касами (CYK): работает для грамматик в нормальной форме Хомского. Сложность \( O(n^3) \), где \( n \) — длина строки.

Восходящий анализ (Bottom-Up)

  • LR-анализ: использует автомат с состояниями и таблицу действий. Для LR(1) сложность \( O(n) \).
  • Алгоритм Эрли: работает для произвольных КС-грамматик, сложность \( O(n^3) \) в худшем случае, но для детерминированных грамматик — \( O(n) \).

Интересные факты

  • Понятие контекстно-свободной грамматики ввёл Ноам Хомский в 1956 году в рамках иерархии формальных грамматик.
  • Язык \( \{ a^n b^n c^n \mid n \ge 0 \} \) является классическим примером неконтекстно-свободного языка. Его можно доказать с помощью леммы о накачке (pumping lemma) для КС-языков.
  • В 1960-х годах Джон Бэкус и Питер Наур разработали форму Бэкуса-Наура (BNF) для описания синтаксиса Алгола-60, которая является нотацией для КС-грамматик.
  • Существуют грамматики, порождающие все строки над алфавитом (например, \( S \to aS \mid bS \mid \varepsilon \)), но они не являются контекстно-свободными, так как требуют контекстной зависимости.

Критика и ограничения

  • КС-грамматики не могут описывать все синтаксические конструкции естественных языков (например, согласование по роду и числу, перекрёстные зависимости).
  • Для языков программирования КС-грамматики часто дополняются контекстными условиями (например, проверка типов, объявление переменных до использования), которые не могут быть выражены в рамках КС-формализма.
  • Неоднозначность грамматик может приводить к проблемам при синтаксическом анализе, требуя дополнительных правил разрешения конфликтов.

Источники

  • Хомский Н. «Синтаксические структуры» (1957).
  • Хопкрофт Дж., Мотвани Р., Ульман Дж. «Введение в теорию автоматов, языков и вычислений» (3-е издание, 2006).
  • Ахо А., Лам М., Сети Р., Ульман Дж. «Компиляторы: принципы, технологии и инструменты» (2-е издание, 2008).
  • Гинзбург С. «Математическая теория контекстно-свободных языков» (1966).
  • Лемма о накачке для контекстно-свободных языков (Бар-Гилель, 1961).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →