<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=94.25.228.65&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=94.25.228.65&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/94.25.228.65"/>
		<updated>2026-05-20T13:53:58Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%A3%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BB%D0%B5%D0%B2%D0%BE%D0%B9_%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B8&amp;diff=27394</id>
		<title>Обсуждение:Устранение левой рекурсии</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%A3%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BB%D0%B5%D0%B2%D0%BE%D0%B9_%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B8&amp;diff=27394"/>
				<updated>2012-12-08T14:00:02Z</updated>
		
		<summary type="html">&lt;p&gt;94.25.228.65: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;: {{tick}} написать, почему, собственно, надо ее устранять     верно ли что для нормального разбора сверху вних&lt;br /&gt;
: {{tick}} англоязычные термины и источники&lt;br /&gt;
: {{tick}} а сложность алгоритма какая? --[[Участник:Dgerasimov|Дмитрий Герасимов]] 22:31, 7 декабря 2012 (GST)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1)Таким образом, после применения алгоритма все правила вывода имеют вид: &lt;br /&gt;
*&amp;lt;tex&amp;gt;A \rightarrow c \alpha &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt; {{---}} терминал, &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; {{---}} произвольный нетерминал;&lt;br /&gt;
*&amp;lt;tex&amp;gt;A_i \rightarrow A_j \alpha &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;i &amp;lt; j&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;A_i , A_j&amp;lt;/tex&amp;gt; {{---}} нетерминалы из исходной грамматики;&lt;br /&gt;
*&amp;lt;tex&amp;gt;A_i^{\prime} \rightarrow A_j \alpha &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A_i^{\prime}&amp;lt;/tex&amp;gt; {{---}} новый нетерминал, &amp;lt;tex&amp;gt;A_j&amp;lt;/tex&amp;gt; {{---}} нетерминал из исходной грамматики.&lt;br /&gt;
&lt;br /&gt;
Если теперь перенумеровать нетерминалы, сохранив порядок для старых и присвоив всем новым меньшие номера, то все правила будут иметь вид:&lt;br /&gt;
*&amp;lt;tex&amp;gt;B_i \rightarrow c \alpha &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt; {{---}} терминал;&lt;br /&gt;
*&amp;lt;tex&amp;gt;B_i \rightarrow B_j \alpha &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;i &amp;lt; j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
казалось бы это бред&lt;/div&gt;</summary>
		<author><name>94.25.228.65</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BB%D0%B5%D0%B2%D0%BE%D0%B9_%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B8&amp;diff=27391</id>
		<title>Устранение левой рекурсии</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BB%D0%B5%D0%B2%D0%BE%D0%B9_%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B8&amp;diff=27391"/>
				<updated>2012-12-08T13:43:24Z</updated>
		
		<summary type="html">&lt;p&gt;94.25.228.65: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=Говорят, что [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|контекстно-свободная(КС) грамматика]] &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt; содержит '''непосредственную левую рекурсию''', если она содержит правило вида &amp;lt;tex&amp;gt;A \rightarrow A\alpha&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Говорят, что КС-грамматика &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt; содержит '''левую рекурсию''', если в ней существует вывод вида &amp;lt;tex&amp;gt;A \Rightarrow^* A\alpha&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Устранение непосредственной левой рекурсии==&lt;br /&gt;
Опишем процедуру, устраняющую все правила вида &amp;lt;tex&amp;gt;A \rightarrow A\alpha&amp;lt;/tex&amp;gt;, для фиксированного нетерминала &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Запишем все правила вывода из &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; в виде: &lt;br /&gt;
&amp;lt;tex&amp;gt;A \rightarrow A\alpha_1\,|\,\ldots\,|\,A\alpha_n\,|\,\beta_1\,|\,\ldots\,|\,\beta_m &amp;lt;/tex&amp;gt;, где&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; {{---}} непустая последовательность терминалов и нетерминалов (&amp;lt;tex&amp;gt;\alpha \nrightarrow \varepsilon &amp;lt;/tex&amp;gt;);&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt; {{---}} непустая последовательность терминалов и нетерминалов, не начинающаяся с &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Заменим правила вывода из &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;A \rightarrow \beta_1A^\prime\, |\, \ldots\,  |\,  \beta_mA^\prime \,|\, \beta_1 \,|\, \ldots \,|\, \beta_m&amp;lt;/tex&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Создадим новый нетерминал &amp;lt;tex&amp;gt;A^\prime \rightarrow \alpha_1A^\prime\,  |\,  \ldots\, |\, \alpha_nA^\prime | \alpha_1\,  |\,  \ldots\, |\, \alpha_n&amp;lt;/tex&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Устранение произвольной левой рекурсии==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;N = \lbrace A_1, A_2, \ldots , A_n \rbrace&amp;lt;/tex&amp;gt; {{---}} множество всех нетерминалов.&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
 for i = 1 to n &lt;br /&gt;
   for j = 1 to i – 1 &lt;br /&gt;
     рассмотреть все правила вывода из &amp;lt;tex&amp;gt;A_j&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;A_j \rightarrow \delta_1 | \ldots | \delta_k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
     заменить каждое правило &amp;lt;tex&amp;gt;A_i \rightarrow A_j \gamma&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;A_i \rightarrow \delta_1\gamma | \ldots | \delta_k\gamma&amp;lt;/tex&amp;gt;.&lt;br /&gt;
   устранить непосредственную левую рекурсию для &amp;lt;tex&amp;gt;A_i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, после применения алгоритма все правила вывода имеют вид: &lt;br /&gt;
*&amp;lt;tex&amp;gt;A \rightarrow c \alpha &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt; {{---}} терминал, &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; {{---}} произвольный нетерминал;&lt;br /&gt;
*&amp;lt;tex&amp;gt;A_i \rightarrow A_j \alpha &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;i &amp;lt; j&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;A_i , A_j&amp;lt;/tex&amp;gt; {{---}} нетерминалы из исходной грамматики;&lt;br /&gt;
*&amp;lt;tex&amp;gt;A_i^{\prime} \rightarrow A_j \alpha &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A_i^{\prime}&amp;lt;/tex&amp;gt; {{---}} новый нетерминал, &amp;lt;tex&amp;gt;A_j&amp;lt;/tex&amp;gt; {{---}} нетерминал из исходной грамматики.&lt;br /&gt;
&lt;br /&gt;
Если теперь перенумеровать нетерминалы, сохранив порядок для старых и присвоив всем новым меньшие номера, то все правила будут иметь вид:&lt;br /&gt;
*&amp;lt;tex&amp;gt;B_i \rightarrow c \alpha &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt; {{---}} терминал;&lt;br /&gt;
*&amp;lt;tex&amp;gt;B_i \rightarrow B_j \alpha &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;i &amp;lt; j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм  устранения левой рекурсии==&lt;br /&gt;
&lt;br /&gt;
Для произвольной грамматики &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt; левую рекурсию можно устранить следующим образом:&lt;br /&gt;
#Воспользуемся [[Удаление_eps-правил_из_грамматики | алгоритмом удаления &amp;lt;tex&amp;gt; \varepsilon &amp;lt;/tex&amp;gt;-правил]]. Получим грамматику без &amp;lt;tex&amp;gt; \varepsilon &amp;lt;/tex&amp;gt;-правил для языка &amp;lt;tex&amp;gt;L(\Gamma) \setminus \lbrace \varepsilon \rbrace&amp;lt;/tex&amp;gt;.&lt;br /&gt;
#Воспользуемся алгоритмом ''устранения произвольной левой рекурсии''.&lt;br /&gt;
#Если &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt; присутствовал в языке исходной грамматики, добавим новый начальный символ &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt; и правила &amp;lt;tex&amp;gt;S' \rightarrow S \, | \, \varepsilon &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
* ''Хопкрофт Д., Мотвани Р., Ульман Д.'' — '''Введение в теорию автоматов, языков и вычислений''', 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528 с. : ISBN 5-8459-0261-4 (рус.)&lt;br /&gt;
* Robert C. Moore — [http://aclweb.org/anthology-new/A/A00/A00-2033.pdf Removing  Left  Recursion  from  Context-Free  Grammars ]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория формальных языков]]&lt;br /&gt;
[[Категория: Контекстно-свободные грамматики]]&lt;/div&gt;</summary>
		<author><name>94.25.228.65</name></author>	</entry>

	</feed>