Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
м
м
Строка 8: Строка 8:
 
'''Выводом слова''' <tex>\alpha</tex> называется последовательность строк, состоящих из терминалов и нетерминалов, где первой идет строка, состоящая из одного стартового нетерминала, а каждая последующая строка получена из предыдущей путем замены любого нетерминала по одному (любому) из правил, и последней строкой в последовательности является слово <tex>\alpha</tex>.  
 
'''Выводом слова''' <tex>\alpha</tex> называется последовательность строк, состоящих из терминалов и нетерминалов, где первой идет строка, состоящая из одного стартового нетерминала, а каждая последующая строка получена из предыдущей путем замены любого нетерминала по одному (любому) из правил, и последней строкой в последовательности является слово <tex>\alpha</tex>.  
 
}}
 
}}
 +
 +
Рассмотрим на примере грамматики, выводящей все правильные скобочные последовательности. Терминальные символы "(" и ")", нетерминал <tex>S</tex>, он же стартовый нетерминал, правила:<br>
 +
<tex>S\rightarrow (S)S</tex><br>
 +
<tex>S\rightarrow S(S)</tex><br>
 +
<tex>S\rightarrow \varepsilon</tex><br>
 +
Выведем слово "(()(()))()":<br>
 +
<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>
  
 
{{Определение
 
{{Определение
Строка 14: Строка 21:
 
}}
 
}}
 
Аналогичным образом определяется ''правосторонний вывод''.
 
Аналогичным образом определяется ''правосторонний вывод''.
 +
<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>
 +
 
{{Определение
 
{{Определение
 
|definition=
 
|definition=
Строка 22: Строка 33:
 
'''Кроной''' дерева разбора называется множество терминальных символов, упорядоченное в соответствии с номерами их достижения при обходе дерева из в глубину корня.
 
'''Кроной''' дерева разбора называется множество терминальных символов, упорядоченное в соответствии с номерами их достижения при обходе дерева из в глубину корня.
 
}}
 
}}
Крона дерева разбора представляет из себя слово языка, которое выводит это дерево.
+
Крона дерева разбора представляет из себя слово языка, которое выводит это дерево.<br>
 
+
Рассмотрим, как будет выглядеть дерево разбора нашей скобочной последовательности.<br>
 +
[[Файл:[[Файл:Example.jpg]]]]
 
{{Определение
 
{{Определение
 
|definition=
 
|definition=

Версия 01:03, 15 октября 2010

Определение:
Контекстно-свободной грамматикой называется грамматика, у которой в левых частях всех правил стоят только одиночные нетерминалы.

Язык, задаваемый контекстно-свободной грамматикой называется контекстно-свободным языком.

Определение:
Выводом слова [math]\alpha[/math] называется последовательность строк, состоящих из терминалов и нетерминалов, где первой идет строка, состоящая из одного стартового нетерминала, а каждая последующая строка получена из предыдущей путем замены любого нетерминала по одному (любому) из правил, и последней строкой в последовательности является слово [math]\alpha[/math].


Рассмотрим на примере грамматики, выводящей все правильные скобочные последовательности. Терминальные символы "(" и ")", нетерминал [math]S[/math], он же стартовый нетерминал, правила:
[math]S\rightarrow (S)S[/math]
[math]S\rightarrow S(S)[/math]
[math]S\rightarrow \varepsilon[/math]
Выведем слово "(()(()))()":
[math]\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(()(()))()[/math]


Определение:
Левосторонним выводом слова [math]\alpha[/math] называется его вывод такой, что каждая последующая строка получена из предыдущей путем замены самого левого встречающегося в строке нетерминала по одному из правил.

Аналогичным образом определяется правосторонний вывод.
Рассмотрим левосторонний вывод нашей скобочной последовательности:
[math]\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(()(()))()[/math]


Определение:
Деревом разбора называется дерево, на вершинах которого записаны терминалы или нетерминалы, а дети вершины, на которой записан нетерминал, соответствуют раскрытию нетерминала по одному любому правилу, в левой части которого стоит этот нетерминал, и упорядочены так же, как в правой части этого правила. Все вершины, помеченные терминалами, являются листьями. Все вершины, помеченные нетерминалами имеют детей.


Определение:
Кроной дерева разбора называется множество терминальных символов, упорядоченное в соответствии с номерами их достижения при обходе дерева из в глубину корня.

Крона дерева разбора представляет из себя слово языка, которое выводит это дерево.
Рассмотрим, как будет выглядеть дерево разбора нашей скобочной последовательности.
[[Файл:Example.jpg]]

Определение:
Грамматика называется однозначной, если у каждого слова имеется не более одного дерева разбора в этой грамматкие.
Утверждение:
Пусть [math]\Gamma[/math] - однозначная грамматика. Тогда [math]\forall \omega \in \mathbb{L}(\Gamma)[/math] у [math]\omega[/math] существует ровно один левосторонний (правосторонний) вывод.
[math]\triangleright[/math]
Очевидно, что по дереву разбора однозначно восстанавливается левосторонний вывод. Поскольку каждое слова из языка выводится только одним деревом разбора, то и левосторонний вывод, выводящий это слово, существует только один
[math]\triangleleft[/math]