Изменения

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

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

212 байт добавлено, 20:20, 7 января 2013
Алгоритм устранения произвольной левой рекурсии
for все нетерминалы <tex>A_i</tex>
for все нетерминалы <tex>A_j</tex>, такие, что <tex> 1 \leq j < i </tex> и
рассмотреть все правила вывода из <tex>A_j</tex>: <tex>A_j \Rightarrow to \delta_1 | \ldots | \delta_k</tex>. заменить каждое правило <tex>A_i \Rightarrow to A_j \gamma</tex> на <tex>A_i \Rightarrow to \delta_1\gamma | \ldots | \delta_k\gamma</tex>.
устранить непосредственную левую рекурсию для <tex>A_i</tex>.
</div>
После На <tex>i</tex> итерации внешнего цикла в любой продукции все правила вида <tex> A_k A_i \Rightarrow A_lto A_j \alpha gamma</tex> где <tex> j < i </tex> заменяются на <tex> k A_i \to \delta_1\gamma | \ldots | \delta_k\gamma</tex> будет где <tex> l > kA_j \to \delta_1 | \ldots | \delta_k</tex>.В результате после каждой итерации растет нижний предел m всех продукций вида Таким образом остается только избавиться от непосредственной рекурсии для <tex>A_i \Rightarrow A_m\alpha</tex> до тех пор.Очевидно, пока что одна итерация алгоритма не будет достигнуто меняет язык, а значит язык получившейся в итоге грамматики совпадает с исходным.  Алгоритм не работает для грамматик с <tex>m \geq iepsilon</tex>. Затем из переходами и с грамматиками имеющими <tex>A_iA \Rightarrow^+ A</tex> устраняется непосредственная левая рекурсия и достигается m > i.
==Пример==
228
правок

Навигация