Изменения

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

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

456 байт убрано, 12:34, 3 января 2013
Отмена правки 28696 участника Shagal (обсуждение)
<div>
for все нетерминалы <tex>A_i</tex>
for все нетерминалы <tex>A_j</tex>, такие, что <tex> 1 \leq j < i </tex> и рассмотреть все Если есть правило вида <tex>A_i \rightarrow A_j \alpha </tex> и правила вывода из <tex>A_j</tex>: <tex>A_j \rightarrow \delta_1 | \ldots | \delta_k</tex>. заменить Заменить каждое правило <tex>A_i \rightarrow A_j \gammaalpha</tex> на <tex>A_i \rightarrow \delta_1\gamma alpha| \ldots | \delta_k\gammaalpha</tex>.
устранить непосредственную левую рекурсию для <tex>A_i</tex>.
</div>
Таким образомСмысл вложенного цикла в том, после применения алгоритма все правила вывода имеют вид: *<tex>A \rightarrow c \alpha </tex>, где <tex>c</tex> {{---}} терминал, <tex>A</tex> {{---}} произвольный нетерминал;*чтобы избавиться от правил вида <tex>A_i \rightarrow A_j \alpha </tex>таких, где что <tex>i < j</tex>, <tex>A_i , A_j</tex> {{---}} нетерминалы из исходной грамматики;*<tex>A_i^{\prime} \rightarrow A_j \alpha </tex>, где <tex>A_i^{\prime}</tex> {{---}} новый нетерминал, <tex>A_j</tex> {{---}} нетерминал из исходной грамматики.
Если теперь перенумеровать нетерминалы, сохранив порядок для старых и присвоив всем новым меньшие номера, то все правила будут иметь вид:*После вложенного цикла цепочка выводов вида <tex>B_i A_i \rightarrow c A_j \alpha \rightarrow A_k \ldots </tex>, где <tex>c</tex> {{---}} терминал;*точно не придет в <tex>B_i \rightarrow B_j \alpha A_i</tex>, где а значит для <tex>i < jA_i</tex>может быть применен алгоритм удаление непосредственной левой рекурсии.
==Алгоритм устранения левой рекурсии==
228
правок

Навигация