Изменения

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

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

866 байт добавлено, 12:17, 7 января 2013
Алгоритм устранения произвольной левой рекурсии
После <tex>i</tex> итерации внешнего цикла в любой продукции вида <tex> A_k \Rightarrow A_l\alpha </tex> где <tex> i > k </tex> будет <tex> l > k</tex>.
В результате после каждой итерации растет нижний предел m всех продукций вида <tex>A_i \Rightarrow A_m\alpha</tex> до тех пор, пока не будет достигнуто <tex>m \geq i</tex>. Затем из <tex>A_i</tex> устраняется непосредственная левая рекурсия и достигается m > i.
 
==Пример==
Дана грамматика
 
<tex>A \Rightarrow S\alpha </tex>
<tex>S \Rightarrow S\beta | A\gamma | b</tex>
 
Среди продукций <tex>A</tex> непосредственной рекурсии нет, поэтому во время первой итерации внешнего цикла ничего не происходит.
Во время второй итерации внешнего цикла продукция <tex> S \Rightarrow A\gamma </tex> переходит в <tex> S \Rightarrow S\alpha\gamma </tex>.
 
Грамматика имеет вид
 
<tex>A \Rightarrow S\alpha </tex>
 
<tex>S \Rightarrow {S}{\beta} | {S}{\alpha}{\gamma} | \beta</tex>
 
Устраняем левую рекурсию для <tex>S</tex>
 
<tex> S \Rightarrow \beta{S_1}</tex>
 
<tex> {S_1} \Rightarrow \beta{S_1} | \alpha\gamma{S_1}</tex>
 
228
правок

Навигация