Изменения

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

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

209 байт добавлено, 15:37, 7 января 2013
Устранение непосредственной левой рекурсии
<ol>
<li>Запишем все правила вывода из <tex>A</tex> в виде:
<tex>A \Rightarrow to A\alpha_1\,|\,\ldots\,|\,A\alpha_n\,|\,\beta_1\,|\,\ldots\,|\,\beta_m </tex>, где
<ul>
<li> <tex>\alpha</tex> {{---}} непустая последовательность терминалов и нетерминалов (<tex>\alpha \nrightarrow \varepsilon </tex>);</li>
<li> <tex>\beta</tex> {{---}} непустая последовательность терминалов и нетерминалов, не начинающаяся с <tex>A</tex>.</li>
</ul>
<li>Заменим правила вывода из <tex>A</tex> на <tex>A \Rightarrow to\beta_1A^\prime\, |\, \ldots\, |\, \beta_mA^\prime \,|\, \beta_1 \,|\, \ldots \,|\, \beta_m</tex>.</li>
<li>Создадим новый нетерминал <tex>A^\prime \Rightarrow to \alpha_1A^\prime\, |\, \ldots\, |\, \alpha_nA^\prime | \alpha_1\, |\, \ldots\, |\, \alpha_n</tex>. </li>
</li>
</ol>
Нетерминал Изначально нетерминал <tex>A </tex> порождает сроки вида <tex>\beta\alpha_{i0}\alpha_{i1} \ldots \alpha_{ik}</tex>. В новой грамматике нетерминал <tex>A</tex> порождает <tex>\beta{A_i}</tex>, а <tex>A_i</tex> порождает те же строкивида <tex>\alpha_{i0}\alpha_{i1} \ldots \alpha_{ik}</tex>. Из этого очевидно, что и ранее, но без левой рекурсии. Эта процедура устраняет все непосредственные рекурсии из продукций для Aизначальная грамматика эквивалентна новой.
==Алгоритм устранения произвольной левой рекурсии==
228
правок

Навигация