Приведение грамматики к ослабленной нормальной форме Грейбах — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Приведение грамматики к ослабленной нормальной форме Грейбах)
Строка 19: Строка 19:
 
Рассмотрим контекстно-свободную грамматику <tex> \Gamma </tex>. Для приведения её к нормальной ослабленной форме Грейбах нужно выполнить три шага. На каждом шаге мы строим новую грамматику, допускающую тот же язык, что и <tex> \Gamma </tex>.
 
Рассмотрим контекстно-свободную грамматику <tex> \Gamma </tex>. Для приведения её к нормальной ослабленной форме Грейбах нужно выполнить три шага. На каждом шаге мы строим новую грамматику, допускающую тот же язык, что и <tex> \Gamma </tex>.
  
<ol>
+
#Избавимся от <tex> \varepsilon </tex>-правил. Для этого воспользуемся [[Удаление_eps-правил_из_грамматики | алгоритмом удаления <tex> \varepsilon </tex>-правил]].
<li> Избавимся от <tex> \varepsilon </tex>-правил.
+
#Воспользуемся [[Устранение_левой_рекурсии|алгоритмом устранения левой рекурсии]].Получим грамматику, все правила которой будут иметь следующий вид:
Для этого воспользуемся [[Удаление_eps-правил_из_грамматики | алгоритмом удаления <tex> \varepsilon </tex>-правил]].
+
#* <tex> A_i \rightarrow a \gamma </tex>,  
</li>
+
#* <tex> A_i \rightarrow A_j \gamma </tex>, где <tex> A_i </tex>, <tex> A_j </tex> {{---}} нетерминалы, <tex> a </tex> {{---}} терминал, <tex> \gamma </tex> {{---}} произвольная последовательность из терминалов и нетерминалов, <tex> i < j </tex>.
<li> Воспользуемся [[Устранение_левой_рекурсии|алгоритмом устранения левой рекурсии]].
+
#Воспользуемся следующей процедурой для придания грамматике нужного вида:
Получим грамматику, все правила которой будут иметь следующий вид:
+
  '''for''' i = n .. 1
<ul>
+
     '''for''' j = i + 1 .. n
<li> <tex> A_i \rightarrow a \gamma </tex>, </li>
 
<li> <tex> A_i \rightarrow A_j \gamma </tex>, </li>
 
</ul>
 
где <tex> A_i </tex>, <tex> A_j </tex> {{---}} нетерминалы, <tex> a </tex> {{---}} терминал, <tex> \gamma </tex> {{---}} произвольная последовательность из терминалов и нетерминалов, <tex> i < j </tex>.
 
</li>
 
<li>
 
Воспользуемся следующей процедурой для придания грамматике нужного вида:
 
<div>
 
  for i = n downto 1
 
     for j = i + 1 to n
 
 
       Для каждого правила вывода из <tex> A_j \rightarrow \delta_1 | \ldots | \delta_k </tex> заменить каждое правило <tex> A_i \rightarrow A_j \gamma </tex> на <tex> A_i \rightarrow \delta_1\gamma | \ldots | \delta_k\gamma </tex>.
 
       Для каждого правила вывода из <tex> A_j \rightarrow \delta_1 | \ldots | \delta_k </tex> заменить каждое правило <tex> A_i \rightarrow A_j \gamma </tex> на <tex> A_i \rightarrow \delta_1\gamma | \ldots | \delta_k\gamma </tex>.
</div>
 
  
 
После каждой итерации главного цикла все правила для <tex> A_k </tex> (где <tex>k \ge i</tex>) будут иметь вид <tex> A_k \rightarrow a \gamma </tex>.
 
После каждой итерации главного цикла все правила для <tex> A_k </tex> (где <tex>k \ge i</tex>) будут иметь вид <tex> A_k \rightarrow a \gamma </tex>.
 
Значит, после применения процедуры все правила грамматики будут иметь вид <tex> A \rightarrow a \gamma </tex>.
 
Значит, после применения процедуры все правила грамматики будут иметь вид <tex> A \rightarrow a \gamma </tex>.
</li>
 
</ol>
 
  
 
Таким образом, мы получили грамматику в ослабленной нормальной форме Грейбах, которая допускает тот же язык, что и исходная.
 
Таким образом, мы получили грамматику в ослабленной нормальной форме Грейбах, которая допускает тот же язык, что и исходная.

Версия 17:44, 6 декабря 2016

Определение:
Грамматикой в нормальной форме Грейбах (англ. Greibach normal form) называется контекстно-свободная грамматика, в которой могут содержаться только правила одного из следующих типов:
  • Aaγ,
  • Sε,
где a — терминал, A — нетерминал, S — стартовый нетерминал (причём он не должен встречаться в правых частях правил), ε — пустая строка, γ — строка из не более, чем двух нетерминалов.


Определение:
Грамматикой в ослабленной нормальной форме Грейбах (англ. Greibach weak normal form) называется контекстно-свободная грамматика, в которой могут содержаться только правила одного из следующих типов:
  • Aaγ,
  • Sε,
где a — терминал, A — нетерминал, S — стартовый нетерминал (причём он не должен встречаться в правых частях правил), ε — пустая строка, γ — строка из произвольного числа терминалов и нетерминалов.


Приведение грамматики к ослабленной нормальной форме Грейбах

Теорема:
Любую контекстно-свободную грамматику можно привести к ослабленной нормальной форме Грейбах.
Доказательство:

Рассмотрим контекстно-свободную грамматику Γ. Для приведения её к нормальной ослабленной форме Грейбах нужно выполнить три шага. На каждом шаге мы строим новую грамматику, допускающую тот же язык, что и Γ.

  1. Избавимся от ε-правил. Для этого воспользуемся алгоритмом удаления ε-правил.
  2. Воспользуемся алгоритмом устранения левой рекурсии.Получим грамматику, все правила которой будут иметь следующий вид:
    • Aiaγ,
    • AiAjγ, где Ai, Aj — нетерминалы, a — терминал, γ — произвольная последовательность из терминалов и нетерминалов, i<j.
  3. Воспользуемся следующей процедурой для придания грамматике нужного вида:
for i = n .. 1
   for j = i + 1 .. n
      Для каждого правила вывода из Ajδ1||δk заменить каждое правило AiAjγ на Aiδ1γ||δkγ.

После каждой итерации главного цикла все правила для Ak (где ki) будут иметь вид Akaγ. Значит, после применения процедуры все правила грамматики будут иметь вид Aaγ.

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

Асимптотика

Алгоритм состоит из трех шагов, сложность первого и последнего шага равны O(|Γ|) и O(|Γ|2) соответственно. Таким обзом, сложность алгоритма является O(|Γ|2)+O(nni=1aj), где второй член — сложность алгоритма удаления левой рекурсии.

Применение

Простота доказательств

Использование нормальных форм существенно упрощает доказательство теорем. Например, использование нормальной формы Грейбах позволяет доказать, что для каждого контекстно-свободного языка (не содержащего ε) существует автомат с магазинной памятью без переходов по ε.

Разбор грамматики

Нормальная форма Холмского позволяет производить разбор грамматики. Например, с помощью алгоритма Кока-Янгера-Касами. В свою очередь, нормальная форма Грейбах позволяет использовать метод рекурсивного спуска, сложность которого является линейной, несмотря на возвраты.

Источники информации