Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора — различия между версиями
Martoon (обсуждение | вклад) м |
Maryann (обсуждение | вклад) |
||
| Строка 2: | Строка 2: | ||
|id=csgrammar | |id=csgrammar | ||
|definition= | |definition= | ||
| − | '''Контекстно-свободной грамматикой''' называется грамматика, у которой в левых частях всех правил стоят только одиночные нетерминалы. | + | '''Контекстно-свободной грамматикой''' (англ. ''сontext-free grammar'') называется грамматика, у которой в левых частях всех правил стоят только одиночные нетерминалы. |
| − | + | }} | |
| + | {{Определение | ||
| + | |definition= | ||
| + | '''Контекстно-свободный язык''' (англ. ''context-free language'') {{---}} язык, задаваемый контекстно-свободной грамматикой. | ||
}} | }} | ||
{{Определение | {{Определение | ||
|definition= | |definition= | ||
| − | '''Выводом слова''' <tex>\alpha</tex> называется последовательность строк, состоящих из терминалов и нетерминалов | + | '''Выводом слова''' <tex>\alpha</tex> называется последовательность строк, состоящих из терминалов и нетерминалов. Первая строка последовательности состоит из одного стартового нетерминала. Каждая последующая строка получена из предыдущей путем замены любого нетерминала по одному (любому) из правил, а последней строкой в последовательности является слово <tex>\alpha</tex>. |
}} | }} | ||
| − | Рассмотрим на примере грамматики, выводящей все правильные скобочные последовательности. Терминальные символы "(" и ")" | + | Рассмотрим на примере грамматики, выводящей все правильные скобочные последовательности. |
| + | |||
| + | Терминальные символы {{---}} <tex>"("</tex> и <tex>")"</tex>; | ||
| + | |||
| + | <tex>S</tex> {{---}} стартовый нетерминал; | ||
| + | |||
| + | Правила:<br> | ||
<tex>S\rightarrow (S)S</tex><br> | <tex>S\rightarrow (S)S</tex><br> | ||
<tex>S\rightarrow S(S)</tex><br> | <tex>S\rightarrow S(S)</tex><br> | ||
<tex>S\rightarrow \varepsilon</tex><br> | <tex>S\rightarrow \varepsilon</tex><br> | ||
| − | Выведем слово "(()(()))()":<br> | + | Выведем слово <tex>"(()(()))()"</tex>:<br> |
| − | <tex>\boldsymbol{S}\ | + | <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> |
| + | |||
| + | {{Определение | ||
| + | |definition= | ||
| + | '''Левосторонним выводом слова <tex>\alpha</tex>''' называется такой его вывод, что каждая последующая строка получена из предыдущей путем замены по одному из правил самого левого встречающегося в строке нетерминала. | ||
| + | }} | ||
{{Определение | {{Определение | ||
|definition= | |definition= | ||
| − | ''' | + | '''Правосторонним выводом слова <tex>\alpha</tex>''' называется такой его вывод, что каждая последующая строка получена из предыдущей путем замены по одному из правил самого правого встречающегося в строке нетерминала. |
}} | }} | ||
| − | |||
<br> | <br> | ||
Рассмотрим левосторонний вывод нашей скобочной последовательности:<br> | Рассмотрим левосторонний вывод нашей скобочной последовательности:<br> | ||
| − | <tex>\boldsymbol{S}\ | + | <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> |
{{Определение | {{Определение | ||
|definition= | |definition= | ||
| − | '''Деревом разбора грамматики''' называется дерево, в вершинах которого записаны терминалы или нетерминалы, а дети вершины, в которой записан нетерминал, соответствуют раскрытию нетерминала по одному любому правилу, в левой части которого стоит этот нетерминал, и упорядочены так же, как в правой части этого правила. Все вершины, помеченные терминалами, являются листьями. Все вершины, помеченные нетерминалами, имеют детей. | + | '''Деревом разбора грамматики''' (англ. ''parse tree'') называется дерево, в вершинах которого записаны терминалы или нетерминалы, а дети вершины, в которой записан нетерминал, соответствуют раскрытию нетерминала по одному любому правилу, в левой части которого стоит этот нетерминал, и упорядочены так же, как в правой части этого правила. Все вершины, помеченные терминалами, являются листьями. Все вершины, помеченные нетерминалами, имеют детей. |
}} | }} | ||
{{Определение | {{Определение | ||
|definition= | |definition= | ||
| − | ''' | + | '''Крона''' дерева разбора {{---}} множество терминальных символов, упорядоченное в соответствии с номерами их достижения при обходе дерева в глубину из корня. |
}} | }} | ||
Крона дерева разбора представляет из себя слово языка, которое выводит это дерево.<br> | Крона дерева разбора представляет из себя слово языка, которое выводит это дерево.<br> | ||
| Строка 40: | Строка 53: | ||
{{Определение | {{Определение | ||
|definition= | |definition= | ||
| − | Грамматика называется '''однозначной''', если у каждого слова имеется не более одного дерева разбора в этой грамматике. | + | Грамматика называется '''однозначной''' (англ. ''unambiguous grammar''), если у каждого слова имеется не более одного дерева разбора в этой грамматике. |
}} | }} | ||
| + | |||
{{Лемма | {{Лемма | ||
|id=lemma- | |id=lemma- | ||
|statement= | |statement= | ||
| − | Пусть <tex>\Gamma</tex> {{---}} однозначная грамматика. Тогда <tex>\forall \omega \in \mathbb{L}(\Gamma)</tex> | + | Пусть <tex>\Gamma</tex> {{---}} однозначная грамматика. Тогда <tex>\forall \omega \in \mathbb{L}(\Gamma)</tex> существует ровно один левосторонний (правосторонний) вывод <tex>\omega</tex>. |
|proof= | |proof= | ||
Очевидно, что по дереву разбора однозначно восстанавливается левосторонний вывод. Поскольку каждое слова из языка выводится только одним деревом разбора, то существует только один левосторонний вывод этого слова. | Очевидно, что по дереву разбора однозначно восстанавливается левосторонний вывод. Поскольку каждое слова из языка выводится только одним деревом разбора, то существует только один левосторонний вывод этого слова. | ||
}} | }} | ||
| + | |||
== Литература == | == Литература == | ||
* Джон Хопкрофт, Раджив Мотвани, Джеффри Ульман. Введение в теорию автоматов, языков и вычислений. | * Джон Хопкрофт, Раджив Мотвани, Джеффри Ульман. Введение в теорию автоматов, языков и вычислений. | ||
Версия 15:05, 24 ноября 2014
| Определение: |
| Контекстно-свободной грамматикой (англ. сontext-free grammar) называется грамматика, у которой в левых частях всех правил стоят только одиночные нетерминалы. |
| Определение: |
| Контекстно-свободный язык (англ. context-free language) — язык, задаваемый контекстно-свободной грамматикой. |
| Определение: |
| Выводом слова называется последовательность строк, состоящих из терминалов и нетерминалов. Первая строка последовательности состоит из одного стартового нетерминала. Каждая последующая строка получена из предыдущей путем замены любого нетерминала по одному (любому) из правил, а последней строкой в последовательности является слово . |
Рассмотрим на примере грамматики, выводящей все правильные скобочные последовательности.
Терминальные символы — и ;
— стартовый нетерминал;
Правила:
Выведем слово :
| Определение: |
| Левосторонним выводом слова называется такой его вывод, что каждая последующая строка получена из предыдущей путем замены по одному из правил самого левого встречающегося в строке нетерминала. |
| Определение: |
| Правосторонним выводом слова называется такой его вывод, что каждая последующая строка получена из предыдущей путем замены по одному из правил самого правого встречающегося в строке нетерминала. |
Рассмотрим левосторонний вывод нашей скобочной последовательности:
| Определение: |
| Деревом разбора грамматики (англ. parse tree) называется дерево, в вершинах которого записаны терминалы или нетерминалы, а дети вершины, в которой записан нетерминал, соответствуют раскрытию нетерминала по одному любому правилу, в левой части которого стоит этот нетерминал, и упорядочены так же, как в правой части этого правила. Все вершины, помеченные терминалами, являются листьями. Все вершины, помеченные нетерминалами, имеют детей. |
| Определение: |
| Крона дерева разбора — множество терминальных символов, упорядоченное в соответствии с номерами их достижения при обходе дерева в глубину из корня. |
Крона дерева разбора представляет из себя слово языка, которое выводит это дерево.
Рассмотрим, как будет выглядеть дерево разбора нашей скобочной последовательности.
| Определение: |
| Грамматика называется однозначной (англ. unambiguous grammar), если у каждого слова имеется не более одного дерева разбора в этой грамматике. |
| Лемма: |
Пусть — однозначная грамматика. Тогда существует ровно один левосторонний (правосторонний) вывод . |
| Доказательство: |
| Очевидно, что по дереву разбора однозначно восстанавливается левосторонний вывод. Поскольку каждое слова из языка выводится только одним деревом разбора, то существует только один левосторонний вывод этого слова. |
Литература
- Джон Хопкрофт, Раджив Мотвани, Джеффри Ульман. Введение в теорию автоматов, языков и вычислений.