Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора — различия между версиями
Maryann (обсуждение | вклад) |
Maryann (обсуждение | вклад) |
||
| Строка 10: | Строка 10: | ||
}} | }} | ||
| − | == | + | ==Лево- и правосторонний вывод слова== |
{{Определение | {{Определение | ||
| Строка 16: | Строка 16: | ||
'''Выводом слова''' (англ. ''derivation of a word'') <tex>\alpha</tex> называется последовательность строк, состоящих из терминалов и нетерминалов. Первая строка последовательности состоит из одного стартового нетерминала. Каждая последующая строка получена из предыдущей путем замены любого нетерминала по одному (любому) из правил, а последней строкой в последовательности является слово <tex>\alpha</tex>. | '''Выводом слова''' (англ. ''derivation of a word'') <tex>\alpha</tex> называется последовательность строк, состоящих из терминалов и нетерминалов. Первая строка последовательности состоит из одного стартового нетерминала. Каждая последующая строка получена из предыдущей путем замены любого нетерминала по одному (любому) из правил, а последней строкой в последовательности является слово <tex>\alpha</tex>. | ||
}} | }} | ||
| − | |||
'''Пример:''' | '''Пример:''' | ||
| Строка 41: | Строка 40: | ||
'''Правосторонним выводом слова''' (англ. '' rightmost derivation'') <tex>\alpha</tex> {{---}} вывод, где каждая последующая строка получена из предыдущей путем замены по одному из правил самого правого встречающегося в строке нетерминала. | '''Правосторонним выводом слова''' (англ. '' rightmost derivation'') <tex>\alpha</tex> {{---}} вывод, где каждая последующая строка получена из предыдущей путем замены по одному из правил самого правого встречающегося в строке нетерминала. | ||
}} | }} | ||
| − | |||
Рассмотрим левосторонний вывод скобочной последовательности из примера:<br> | Рассмотрим левосторонний вывод скобочной последовательности из примера:<br> | ||
<tex>\boldsymbol{S}\Rightarrow (\boldsymbol{S})S \Rightarrow ((\boldsymbol{S})S)S\Rightarrow (()\boldsymbol{S})S\Rightarrow(()\boldsymbol{S}(S))S\Rightarrow(()(\boldsymbol{S}))S\Rightarrow(()(\boldsymbol{S}(S)))S\Rightarrow(()((\boldsymbol{S})))S\Rightarrow(()(()))\boldsymbol{S}\Rightarrow(()(()))(\boldsymbol{S})S\Rightarrow(()(()))()\boldsymbol{S}\Rightarrow(()(()))()</tex> | <tex>\boldsymbol{S}\Rightarrow (\boldsymbol{S})S \Rightarrow ((\boldsymbol{S})S)S\Rightarrow (()\boldsymbol{S})S\Rightarrow(()\boldsymbol{S}(S))S\Rightarrow(()(\boldsymbol{S}))S\Rightarrow(()(\boldsymbol{S}(S)))S\Rightarrow(()((\boldsymbol{S})))S\Rightarrow(()(()))\boldsymbol{S}\Rightarrow(()(()))(\boldsymbol{S})S\Rightarrow(()(()))()\boldsymbol{S}\Rightarrow(()(()))()</tex> | ||
| + | |||
| + | ==Дерево разбора== | ||
{{Определение | {{Определение | ||
| Строка 58: | Строка 58: | ||
==Однозначные грамматики== | ==Однозначные грамматики== | ||
| + | |||
{{Определение | {{Определение | ||
|definition= | |definition= | ||
| Строка 63: | Строка 64: | ||
}} | }} | ||
| + | {{Лемма | ||
| + | |id=lemma- | ||
| + | |statement= | ||
| + | Пусть <tex>\Gamma</tex> {{---}} однозначная грамматика. Тогда <tex>\forall \omega \in \mathbb{L}(\Gamma)</tex> существует ровно один левосторонний (правосторонний) вывод. | ||
| + | |proof= | ||
| + | Очевидно, что по дереву разбора однозначно восстанавливается левосторонний(правосторонний) вывод. Поскольку каждое слово из языка выводится только одним деревом разбора, то существует только один левосторонний(правосторонний) вывод этого слова. | ||
| + | }} | ||
| + | <br> | ||
{{Утверждение | {{Утверждение | ||
|statement = Грамматика из примера не является однозначной. | |statement = Грамматика из примера не является однозначной. | ||
| Строка 73: | Строка 82: | ||
Таким образом, существует слово, у которого есть более одного дерева разбора в данной грамматике <tex>\Rightarrow</tex> эта грамматика не является однозначной. | Таким образом, существует слово, у которого есть более одного дерева разбора в данной грамматике <tex>\Rightarrow</tex> эта грамматика не является однозначной. | ||
}} | }} | ||
| − | + | <br> | |
Для одного и того же языка может существовать как однозначная, так и неоднозначная грамматика. | Для одного и того же языка может существовать как однозначная, так и неоднозначная грамматика. | ||
Например, у языка правильных скобочных последовательностей существует однозначная грамматика. | Например, у языка правильных скобочных последовательностей существует однозначная грамматика. | ||
| − | + | <tex>"("</tex> и <tex>")"</tex> {{---}} терминальные символы; | |
| + | |||
| + | <tex>S</tex> {{---}} стартовый нетерминал; | ||
| − | + | Правила:<br> | |
| − | + | <tex>S\rightarrow (S)S</tex><br> | |
| − | + | <tex>S\rightarrow \varepsilon</tex><br> | |
| − | + | {{Утверждение | |
| − | |proof= | + | |statement = Грамматика, заданная таким образом является однозначной. |
| − | + | |proof = | |
| + | Как-то очевидно :( | ||
}} | }} | ||
| + | <br> | ||
| + | Однако, есть КС-языки, для которых не существует однозначных КС-грамматик. Такие языки и грамматики их порождающие называют [[Существенно неоднозначные языки|''существенно неоднозначными'']]. | ||
==См. также== | ==См. также== | ||
Версия 03:43, 25 ноября 2014
Содержание
Основные определения
| Определение: |
| Контекстно-свободной грамматикой (англ. сontext-free grammar) называется грамматика, у которой в левых частях всех правил стоят только одиночные нетерминалы. |
| Определение: |
| Контекстно-свободный язык (англ. context-free language) — язык, задаваемый контекстно-свободной грамматикой. |
Лево- и правосторонний вывод слова
| Определение: |
| Выводом слова (англ. derivation of a word) называется последовательность строк, состоящих из терминалов и нетерминалов. Первая строка последовательности состоит из одного стартового нетерминала. Каждая последующая строка получена из предыдущей путем замены любого нетерминала по одному (любому) из правил, а последней строкой в последовательности является слово . |
Пример:
Рассмотрим грамматику, выводящую все правильные скобочные последовательности.
и — терминальные символы;
— стартовый нетерминал;
Правила:
Выведем слово :
| Определение: |
| Левосторонний вывод слова (англ. leftmost derivation) — вывод, где каждая последующая строка получена из предыдущей путем замены по одному из правил самого левого встречающегося в строке нетерминала. |
| Определение: |
| Правосторонним выводом слова (англ. rightmost derivation) — вывод, где каждая последующая строка получена из предыдущей путем замены по одному из правил самого правого встречающегося в строке нетерминала. |
Рассмотрим левосторонний вывод скобочной последовательности из примера:
Дерево разбора
| Определение: |
| Деревом разбора грамматики (англ. parse tree) называется дерево, в вершинах которого записаны терминалы или нетерминалы. Все вершины, помеченные терминалами, являются листьями. Все вершины, помеченные нетерминалами, имеют детей. Дети вершины, в которой записан нетерминал, соответствуют раскрытию нетерминала по одному любому правилу (в левой части которого стоит этот нетерминал) и упорядочены так же, как в правой части этого правила. |
| Определение: |
| Крона дерева разбора — множество терминальных символов, упорядоченное в соответствии с номерами их достижения при обходе дерева в глубину из корня. Крона дерева разбора представляет из себя слово языка, которое выводит это дерево. |
Построим дерево разбора скобочной последовательности из примера.
Однозначные грамматики
| Определение: |
| Грамматика называется однозначной (англ. unambiguous grammar), если у каждого слова имеется не более одного дерева разбора в этой грамматике. |
| Лемма: |
Пусть — однозначная грамматика. Тогда существует ровно один левосторонний (правосторонний) вывод. |
| Доказательство: |
| Очевидно, что по дереву разбора однозначно восстанавливается левосторонний(правосторонний) вывод. Поскольку каждое слово из языка выводится только одним деревом разбора, то существует только один левосторонний(правосторонний) вывод этого слова. |
| Утверждение: |
Грамматика из примера не является однозначной. |
|
Выше уже было построено дерево разбора для слова . Построим еще одно дерево разбора для данного слова. Например, оно будет выглядеть так: Таким образом, существует слово, у которого есть более одного дерева разбора в данной грамматике эта грамматика не является однозначной. |
Для одного и того же языка может существовать как однозначная, так и неоднозначная грамматика.
Например, у языка правильных скобочных последовательностей существует однозначная грамматика.
и — терминальные символы;
— стартовый нетерминал;
Правила:
| Утверждение: |
Грамматика, заданная таким образом является однозначной. |
| Как-то очевидно :( |
Однако, есть КС-языки, для которых не существует однозначных КС-грамматик. Такие языки и грамматики их порождающие называют существенно неоднозначными.
См. также
- Формальные грамматики
- Иерархия Хомского формальных грамматик
- Замкнутость КС-языков относительно различных операций
- Существенно неоднозначные языки
Литература
- Wikipedia — Context-free grammar
- Википедия — Контекстно-свободная грамматика
- Хопкрофт Д., Мотвани Р., Ульман Д. — Введение в теорию автоматов, языков и вычислений, 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528 с. : ISBN 5-8459-0261-4 (рус.)