Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора — различия между версиями
Gaporf (обсуждение | вклад) м (→Однозначные грамматики) |
Gaporf (обсуждение | вклад) (→Лево- и правосторонний вывод слова) |
||
Строка 20: | Строка 20: | ||
Рассмотрим грамматику, выводящую все правильные скобочные последовательности. | Рассмотрим грамматику, выводящую все правильные скобочные последовательности. | ||
− | :<tex> | + | :<tex>(</tex> и <tex>)</tex> {{---}} терминальные символы |
:<tex>S</tex> {{---}} стартовый нетерминал | :<tex>S</tex> {{---}} стартовый нетерминал | ||
Строка 28: | Строка 28: | ||
#<tex>S\rightarrow \varepsilon</tex> | #<tex>S\rightarrow \varepsilon</tex> | ||
− | Выведем слово <tex> | + | Выведем слово <tex>(()(()))()</tex>: |
<tex>\boldsymbol{S}\Rightarrow (S)\boldsymbol{S} \Rightarrow (S)(\boldsymbol{S})S\Rightarrow(S)()\boldsymbol{S}\Rightarrow(\boldsymbol{S})()\Rightarrow(\boldsymbol{S}(S))()\Rightarrow(S(S)(\boldsymbol{S}))()\Rightarrow(S(S)(\boldsymbol{S}(S)))()\Rightarrow (S(\boldsymbol{S})((S)))()\Rightarrow(\boldsymbol{S}()((S)))()\Rightarrow(()((\boldsymbol{S})))()\Rightarrow(()(()))()</tex> | <tex>\boldsymbol{S}\Rightarrow (S)\boldsymbol{S} \Rightarrow (S)(\boldsymbol{S})S\Rightarrow(S)()\boldsymbol{S}\Rightarrow(\boldsymbol{S})()\Rightarrow(\boldsymbol{S}(S))()\Rightarrow(S(S)(\boldsymbol{S}))()\Rightarrow(S(S)(\boldsymbol{S}(S)))()\Rightarrow (S(\boldsymbol{S})((S)))()\Rightarrow(\boldsymbol{S}()((S)))()\Rightarrow(()((\boldsymbol{S})))()\Rightarrow(()(()))()</tex> |
Версия 22:50, 14 мая 2019
Содержание
Основные определения
Определение: |
Контекстно-свободной грамматикой (англ. сontext-free grammar) называется грамматика, у которой в левых частях всех правил стоят только одиночные нетерминалы. |
Определение: |
Контекстно-свободный язык (англ. context-free language) — язык, задаваемый контекстно-свободной грамматикой. |
Лево- и правосторонний вывод слова
Определение: |
Выводом слова (англ. derivation of a word) | называется последовательность строк, состоящих из терминалов и нетерминалов. Первая строка последовательности состоит из одного стартового нетерминала. Каждая последующая строка получена из предыдущей путем замены любого нетерминала по одному (любому) из правил, а последней строкой в последовательности является слово .
Пример:
Рассмотрим грамматику, выводящую все правильные скобочные последовательности.
- и — терминальные символы
- — стартовый нетерминал
Правила:
Выведем слово
:
Определение: |
Левосторонним выводом слова (англ. leftmost derivation) | называется такой вывод слова , в котором каждая последующая строка получена из предыдущей путем замены по одному из правил самого левого встречающегося в строке нетерминала.
Определение: |
Правосторонним выводом слова (англ. rightmost derivation) | называется такой вывод слова , в котором каждая последующая строка получена из предыдущей путем замены по одному из правил самого правого встречающегося в строке нетерминала.
Рассмотрим левосторонний вывод скобочной последовательности из примера:
Дерево разбора
Определение: |
Деревом разбора грамматики (англ. parse tree) называется дерево, в вершинах которого записаны терминалы или нетерминалы. Все вершины, помеченные терминалами, являются листьями. Все вершины, помеченные нетерминалами, имеют детей. Дети вершины, в которой записан нетерминал, соответствуют раскрытию нетерминала по одному любому правилу (в левой части которого стоит этот нетерминал) и упорядочены так же, как в правой части этого правила. |
Определение: |
Крона дерева разбора (англ. leaves of the parse tree) — множество терминальных символов, упорядоченное в соответствии с номерами их достижения при обходе дерева в глубину из корня. Крона дерева разбора представляет из себя слово языка, которое выводит это дерево. |
Построим дерево разбора скобочной последовательности из примера.
Теорема: |
Пусть — КС-грамматика. Предположим, что существует дерево разбора с корнем, отмеченным , и кроной , где . Тогда в грамматике существует левое порождение |
Доказательство: |
Используем индукцию по высоте дерева. База: Базисом является высота , наименьшая из возможных для дерева разбора с терминальной кроной.
Индукционный переход: Существует корень с отметкой и сыновьями, отмеченными слева направо . Символы могут быть как терминалами, так и переменными.
Заметим, что . Построим левое порождение цепочки следующим образом:
Данное доказательство использует в действительности еще одну индукцию, на этот раз по . Для базиса мы уже знаем, что .Для индукции предположим, что существует следующее порождение:
Результатом является порождение Когда . , результат представляет собой левое порождение из . |
Теорема: |
Для каждой грамматики и из цепочка имеет два разных дерева разбора тогда и только тогда, когда имеет два разных левых порождения из . |
Доказательство: |
|
Однозначные грамматики
Определение: |
Грамматика называется однозначной (англ. unambiguous grammar), если у каждого слова имеется не более одного дерева разбора в этой грамматике. |
Лемма: |
Пусть — однозначная грамматика. Тогда существует ровно один левосторонний (правосторонний) вывод. |
Доказательство: |
Очевидно, что по дереву разбора однозначно восстанавливается левосторонний(правосторонний) вывод. Поскольку каждое слово из языка выводится только одним деревом разбора, то существует только один левосторонний(правосторонний) вывод этого слова. |
Утверждение: |
Грамматика из примера не является однозначной. |
Выше уже было построено дерево разбора для слова . Построим еще одно дерево разбора для данного слова.Например, оно будет выглядеть так: Таким образом, существует слово, у которого есть более одного дерева разбора в данной грамматике эта грамматика не является однозначной. |
Утверждение: |
Существуют языки, которые можно задать одновременно как однозначными, так и неоднозначными грамматиками. |
Для доказательства достаточно привести однозначную грамматику для языка правильных скобочных последовательностей (неоднозначной грамматикой для данного языка является грамматика из примера выше). Рассмотрим грамматику:
Правила: Покажем, что эта грамматика однозначна. Для этого, используя индукцию, докажем, что для любого слова , являющегося правильной скобочной последовательностью, в данной грамматике существует только одно дерево разбора.База: Если , то оно выводится только по второму правилу для него существует единственное дерево разбора.Индукционный переход: Пусть и : и — правильная скобочная последовательность, у которой дерево разбора.
|
Однако, есть КС-языки, для которых не существует однозначных КС-грамматик. Такие языки и грамматики их порождающие называют существенно неоднозначными.
См. также
- Формальные грамматики
- Иерархия Хомского формальных грамматик
- Замкнутость КС-языков относительно различных операций
- Существенно неоднозначные языки
Источники информации
- Wikipedia — Context-free grammar
- Википедия — Контекстно-свободная грамматика
- Хопкрофт Д., Мотвани Р., Ульман Д. — Введение в теорию автоматов, языков и вычислений, 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528 с. : ISBN 5-8459-0261-4 (рус.)