Приведение грамматики к ослабленной нормальной форме Грейбах — различия между версиями
Zernov (обсуждение | вклад) |
Zernov (обсуждение | вклад) (→Приведение грамматики к ослабленной нормальной форме Грейбах) |
||
Строка 19: | Строка 19: | ||
Рассмотрим контекстно-свободную грамматику <tex> \Gamma </tex>. Для приведения её к нормальной ослабленной форме Грейбах нужно выполнить три шага. На каждом шаге мы строим новую грамматику, допускающую тот же язык, что и <tex> \Gamma </tex>. | Рассмотрим контекстно-свободную грамматику <tex> \Gamma </tex>. Для приведения её к нормальной ослабленной форме Грейбах нужно выполнить три шага. На каждом шаге мы строим новую грамматику, допускающую тот же язык, что и <tex> \Gamma </tex>. | ||
− | + | #Избавимся от <tex> \varepsilon </tex>-правил. Для этого воспользуемся [[Удаление_eps-правил_из_грамматики | алгоритмом удаления <tex> \varepsilon </tex>-правил]]. | |
− | + | #Воспользуемся [[Устранение_левой_рекурсии|алгоритмом устранения левой рекурсии]].Получим грамматику, все правила которой будут иметь следующий вид: | |
− | Для этого воспользуемся [[Удаление_eps-правил_из_грамматики | алгоритмом удаления <tex> \varepsilon </tex>-правил]]. | + | #* <tex> A_i \rightarrow a \gamma </tex>, |
− | + | #* <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>. | |
− | + | #Воспользуемся следующей процедурой для придания грамматике нужного вида: | |
− | Получим грамматику, все правила которой будут иметь следующий вид: | + | '''for''' i = n .. 1 |
− | + | '''for''' j = i + 1 .. n | |
− | |||
− | |||
− | |||
− | где <tex> A_i </tex>, <tex> A_j </tex> {{---}} нетерминалы, <tex> a </tex> {{---}} терминал, <tex> \gamma </tex> {{---}} произвольная последовательность из терминалов и нетерминалов, <tex> i < j </tex>. | ||
− | |||
− | |||
− | Воспользуемся следующей процедурой для придания грамматике нужного вида: | ||
− | |||
− | for i = n | ||
− | for j = i + 1 | ||
Для каждого правила вывода из <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>. | ||
− | |||
После каждой итерации главного цикла все правила для <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>. | ||
− | |||
− | |||
Таким образом, мы получили грамматику в ослабленной нормальной форме Грейбах, которая допускает тот же язык, что и исходная. | Таким образом, мы получили грамматику в ослабленной нормальной форме Грейбах, которая допускает тот же язык, что и исходная. |
Версия 17:44, 6 декабря 2016
Определение: |
Грамматикой в нормальной форме Грейбах (англ. Greibach normal form) называется контекстно-свободная грамматика, в которой могут содержаться только правила одного из следующих типов:
|
Определение: |
Грамматикой в ослабленной нормальной форме Грейбах (англ. Greibach weak normal form) называется контекстно-свободная грамматика, в которой могут содержаться только правила одного из следующих типов:
|
Содержание
Приведение грамматики к ослабленной нормальной форме Грейбах
Теорема: |
Любую контекстно-свободную грамматику можно привести к ослабленной нормальной форме Грейбах. |
Доказательство: |
Рассмотрим контекстно-свободную грамматику . Для приведения её к нормальной ослабленной форме Грейбах нужно выполнить три шага. На каждом шаге мы строим новую грамматику, допускающую тот же язык, что и .
for i = n .. 1 for j = i + 1 .. n Для каждого правила вывода иззаменить каждое правило на . После каждой итерации главного цикла все правила для Таким образом, мы получили грамматику в ослабленной нормальной форме Грейбах, которая допускает тот же язык, что и исходная. (где ) будут иметь вид . Значит, после применения процедуры все правила грамматики будут иметь вид . |
Асимптотика
Алгоритм состоит из трех шагов, сложность первого и последнего шага равны
и соответственно. Таким обзом, сложность алгоритма является , где второй член — сложность алгоритма удаления левой рекурсии.Применение
Простота доказательств
Использование нормальных форм существенно упрощает доказательство теорем. Например, использование нормальной формы Грейбах позволяет доказать, что для каждого контекстно-свободного языка (не содержащего
) существует автомат с магазинной памятью без переходов по .Разбор грамматики
Нормальная форма Холмского позволяет производить разбор грамматики. Например, с помощью алгоритма Кока-Янгера-Касами. В свою очередь, нормальная форма Грейбах позволяет использовать метод рекурсивного спуска, сложность которого является линейной, несмотря на возвраты.