Изменения

Перейти к: навигация, поиск

Устранение левой рекурсии

826 байт добавлено, 10:00, 8 января 2013
Алгоритм устранения произвольной левой рекурсии
==Алгоритм устранения произвольной левой рекурсии==
Пусть <tex>N = \lbrace A_1, A_2, \ldots , A_n \rbrace</tex> {{---}} упорядоченное множество всех нетерминалов.
<div>
for все нетерминалы <tex>A_i</tex>
Очевидно, что одна итерация алгоритма не меняет язык, а значит язык получившийся в итоге грамматики совпадает с исходным.
Алгоритм не работает для грамматик с <tex>\varepsilon</tex> переходами и с грамматиками имеющими <tex>A \Rightarrow^+ A</tex>. Поэтому для произвольной грамматики необходимо сначала воспользоваться алгоритмом [[Удаление_eps-правил_из_грамматики | алгоритмом удаления <tex> \varepsilon </tex>-правил]].
 
Проблема этого алгоритма в том, что в зависимости от порядка нетерминалов в множестве размер грамматки может получиться экспоненциальным.
===Пример===
<tex>A_1 \to 0 | 1</tex>
 
<tex>A_{i+1} \to {A_i}0</tex> для <tex>1 \leq i < n</tex>
Алгоритм не работает Упорядочим множество нетерминалов по возрастанию индексов. Легко заметить, что правила для грамматик с <tex>\varepsilonA_i</tex> переходами и с грамматиками имеющими будут представлять из себя все двоичные вектора длины <tex>A \Rightarrow^+ Ai</tex>. Поэтому для произвольной грамматики необходимо сначала воспользоваться алгоритмом [[Удаление_eps-правил_из_грамматики | алгоритмом удаления <tex> \varepsilon </tex>-правил]]Если упорядочить нетерминалы по убыванию в грамматике изменений не будет.
==Пример==
228
правок

Навигация