<?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=89.113.128.32&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=89.113.128.32&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/89.113.128.32"/>
		<updated>2026-05-12T23:16:35Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_FIRST_%D0%B8_FOLLOW&amp;diff=39990</id>
		<title>Построение FIRST и FOLLOW</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_FIRST_%D0%B8_FOLLOW&amp;diff=39990"/>
				<updated>2014-09-11T12:02:08Z</updated>
		
		<summary type="html">&lt;p&gt;89.113.128.32: /* Пример */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Для данной [[LL(k)-грамматики, множества FIRST и FOLLOW#defLLK | LL(1)-грамматики]] оказывается возможным построить нисходящий рекурсивный парсер, который по слову сможет построить его дерево разбора в грамматике или сказать, что слово не принадлежит языку грамматики. Более того, становится возможной даже автоматическая генерация парсеров для таких грамматик&amp;lt;ref&amp;gt;[http://www.antlr.org/ ANTLR {{---}} Parser generator] &amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Чтобы написать парсер для LL(1)-грамматики, необходимо построить [[LL(k)-грамматики, множества FIRST и FOLLOW#deffirst | множества]] &amp;lt;tex&amp;gt; \mathrm{FIRST} &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; \mathrm{FOLLOW} &amp;lt;/tex&amp;gt;, после чего по ним можно составить таблицу синтаксического анализатора.&lt;br /&gt;
== Построение FIRST ==&lt;br /&gt;
Для построения &amp;lt;tex&amp;gt; \mathrm{FIRST} &amp;lt;/tex&amp;gt; воспользуемся несколькими леммами, которые следуют прямо из определения. Пусть &amp;lt;tex&amp;gt; \alpha, \beta &amp;lt;/tex&amp;gt; {{---}} цепочки из терминалов и нетерминалов, &amp;lt;tex&amp;gt; c &amp;lt;/tex&amp;gt; {{---}} символ из алфавита.&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemmafirst1&lt;br /&gt;
|author=1&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt; \mathrm{FIRST}(\alpha \beta) = \mathrm{FIRST}(\alpha) \cup (\mathrm{FIRST}(\beta)\ \mathrm{if}\ \varepsilon \in \mathrm{FIRST}(\alpha)) &amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Рассмотрим лемму подробней. Пусть правило из нетерминала &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt; имеет вид &amp;lt;tex&amp;gt; A \to X_1 X_2 \dots X_k &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; X_i,\ (1 \leqslant i \leqslant k) &amp;lt;/tex&amp;gt; {{---}} произвольный терминал или нетерминал. Тогда по лемме в &amp;lt;tex&amp;gt; \mathrm{FIRST}[A] &amp;lt;/tex&amp;gt; нужно добавить &amp;lt;tex&amp;gt; \mathrm{FIRST}(X_i) &amp;lt;/tex&amp;gt;, если для всех &amp;lt;tex&amp;gt; 1 \leqslant j &amp;lt; i &amp;lt;/tex&amp;gt; верно, что &amp;lt;tex&amp;gt; X_j \Rightarrow^* \varepsilon &amp;lt;/tex&amp;gt;.&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemmafirst2 &lt;br /&gt;
|author=2&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; \mathrm{FIRST}(c \alpha) = \{c\}&amp;lt;/tex&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt; \mathrm{FIRST}(\varepsilon) = \{\varepsilon \}&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
=== Псевдокод ===&lt;br /&gt;
Алгоритм строит для каждого терминала грамматики &amp;lt;tex&amp;gt;\Gamma = \langle \Sigma, N, S, P \rangle&amp;lt;/tex&amp;gt; отображение в множество символов. Перед запуском алгоритма необходимо избавиться от [[Удаление бесполезных символов из грамматики | бесполезных символов]]. Изначально каждое правило отображается в пустое множество.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  '''function''' constructFIRST():&lt;br /&gt;
      '''for''' &amp;lt;tex&amp;gt;( A  \in N )&amp;lt;/tex&amp;gt;&lt;br /&gt;
          &amp;lt;tex&amp;gt;\mathrm{FIRST}[A] =  \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
      changed = ''true''&lt;br /&gt;
      '''while''' changed&lt;br /&gt;
          changed = ''false''&lt;br /&gt;
          '''for''' &amp;lt;tex&amp;gt;( A \to \alpha \in P )&amp;lt;/tex&amp;gt;&lt;br /&gt;
              &amp;lt;tex&amp;gt; \mathrm{FIRST}[A]\ \cup =\ \mathrm{FIRST}(\alpha) &amp;lt;/tex&amp;gt;&lt;br /&gt;
              changed = ''true'' '''if''' &amp;lt;tex&amp;gt; \mathrm{FIRST}[A] &amp;lt;/tex&amp;gt; изменился          &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|id=proposalfirstcorrect &lt;br /&gt;
|statement=Приведённый алгоритм правильно строит множество &amp;lt;tex&amp;gt; \mathrm{FIRST} &amp;lt;/tex&amp;gt; для данной грамматики.&lt;br /&gt;
|proof=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; \Leftarrow &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм на каждом шаге использует [[#lemmafirst1 | леммы]], чтобы построить списки &amp;lt;tex&amp;gt; \mathrm{FIRST} &amp;lt;/tex&amp;gt; для каждого нетерминала. Поэтому он добавит только те терминалы, которые на самом деле лежат в &amp;lt;tex&amp;gt; \mathrm{FIRST} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; \Rightarrow &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Покажем, что алгоритм найдёт все символы из множества &amp;lt;tex&amp;gt; \mathrm{FIRST} &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Предположим, что в грамматике возможен вывод &amp;lt;tex&amp;gt; A \Rightarrow^* c \gamma &amp;lt;/tex&amp;gt;, и алгоритм не включил &amp;lt;tex&amp;gt; c &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; \mathrm{FIRST}[A] &amp;lt;/tex&amp;gt;. Докажем индукцией по числу шагов &amp;lt;tex&amp;gt; \mathrm{while} &amp;lt;/tex&amp;gt;, что этого не может быть.&lt;br /&gt;
&lt;br /&gt;
Пусть за &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; шагов алгоритм добавит символы &amp;lt;tex&amp;gt; c &amp;lt;/tex&amp;gt; в множество &amp;lt;tex&amp;gt; \mathrm{FIRST} &amp;lt;/tex&amp;gt; для каждого нетерминала &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt; A \Rightarrow^k c \gamma &amp;lt;/tex&amp;gt;. База индукции для числа шагов &amp;lt;tex&amp;gt; 0 &amp;lt;/tex&amp;gt; верна, если считать, что для всех терминалов нам известны &amp;lt;tex&amp;gt; \mathrm{FIRST} &amp;lt;/tex&amp;gt;. Если алгоритм корректно отрабатывает на &amp;lt;tex&amp;gt;(k-1)&amp;lt;/tex&amp;gt;-ом шаге, то он правильно отработает их на &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-ом шаге, потому что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; A \Rightarrow \beta \Rightarrow^{k-1} c \gamma &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для &amp;lt;tex&amp;gt; \beta &amp;lt;/tex&amp;gt; алгоритм правильно построил &amp;lt;tex&amp;gt; \mathrm{FIRST} &amp;lt;/tex&amp;gt; по предположению индукции, а для &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt; он правильно построит по [[#lemmafirst1 | леммам]], следовательно, переход доказан.&lt;br /&gt;
&lt;br /&gt;
К тому же, алгоритм завершится за конечное число шагов, так как в &amp;lt;tex&amp;gt; \mathrm{FIRST} &amp;lt;/tex&amp;gt; для каждого нетерминала не может добавиться больше символов, чем есть в алфавите.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Построение FOLLOW ==&lt;br /&gt;
Сформулируем похожие утверждения для построения &amp;lt;tex&amp;gt; \mathrm{FOLLOW} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemmafollow1 &lt;br /&gt;
|author=3&lt;br /&gt;
|statement=Для каждого правила &amp;lt;tex&amp;gt; A \to \alpha B \beta &amp;lt;/tex&amp;gt; верно, что &amp;lt;tex&amp;gt;(\mathrm{FIRST}(\beta) \setminus \{\varepsilon\}) \subset \mathrm{FOLLOW}(B) &amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemmafollow2 &lt;br /&gt;
|author=4&lt;br /&gt;
|statement=Для каждого правила вида &amp;lt;tex&amp;gt; A \to \alpha B &amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt; A \to \alpha B \beta,\ \varepsilon \in \mathrm{FIRST}(\beta)&amp;lt;/tex&amp;gt; верно, что &amp;lt;tex&amp;gt;\mathrm{FOLLOW}(A) \subset \mathrm{FOLLOW}(B) &amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
=== Псевдокод ===&lt;br /&gt;
Реализация построения &amp;lt;tex&amp;gt; \mathrm{FOLLOW} &amp;lt;/tex&amp;gt; получается сразу из [[#lemmafollow1 | лемм]]. Для алгоритма сначала требуется выполнить построение &amp;lt;tex&amp;gt; \mathrm{FIRST} &amp;lt;/tex&amp;gt; для грамматики.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  '''function''' constructFOLLOW():&lt;br /&gt;
      '''for''' &amp;lt;tex&amp;gt;( A  \in N )&amp;lt;/tex&amp;gt;&lt;br /&gt;
          &amp;lt;tex&amp;gt;\mathrm{FOLLOW}[A] =  \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt;\mathrm{FOLLOW}[S] =  \{\$\} &amp;lt;/tex&amp;gt;  &amp;lt;font color=green&amp;gt; // в стартовый терминал помещается символ конца строки &amp;lt;/font&amp;gt;&lt;br /&gt;
      changed = ''true''&lt;br /&gt;
      '''while''' changed&lt;br /&gt;
          changed = ''false''&lt;br /&gt;
          '''for''' &amp;lt;tex&amp;gt;( A \to \alpha \in P )&amp;lt;/tex&amp;gt;&lt;br /&gt;
              '''for''' &amp;lt;tex&amp;gt;( B : \alpha = \beta B \gamma)&amp;lt;/tex&amp;gt;&lt;br /&gt;
                  &amp;lt;tex&amp;gt; \mathrm{FOLLOW}[B]\ \cup =\ \mathrm{FIRST}(\gamma) \setminus \{\varepsilon\} &amp;lt;/tex&amp;gt;&lt;br /&gt;
                  '''if''' &amp;lt;tex&amp;gt; \varepsilon \in \mathrm{FIRST}(\gamma) &amp;lt;/tex&amp;gt;&lt;br /&gt;
                      &amp;lt;tex&amp;gt; \mathrm{FOLLOW}[B]\ \cup =\ \mathrm{FOLLOW}[A]&amp;lt;/tex&amp;gt;&lt;br /&gt;
                  changed = ''true'' '''if''' &amp;lt;tex&amp;gt; \mathrm{FOLLOW}[B] &amp;lt;/tex&amp;gt; изменился&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Корректность данного алгоритма доказывается точно так же, как и корректность алгоритма конструирования &amp;lt;tex&amp;gt; \mathrm{FIRST} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
Рассмотрим, как будут строиться множества &amp;lt;tex&amp;gt; \mathrm{FIRST} &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; \mathrm{FOLLOW} &amp;lt;/tex&amp;gt; на примере грамматики арифметических выражений. Ограничимся только операциями сложения, умножения и наличием скобок. Числа будем обозначать одной буквой &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; для простоты. Интуитивная грамматика для арифметических выражений выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; E \to E + E \mid E \times E \mid (E) \mid n &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Однако данная грамматика содержит [[Устранение левой рекурсии | левую рекурсию]], [[LL(k)-грамматики, множества FIRST и FOLLOW#Теорема о связи LL(1)-грамматики с множествами FIRST и FOLLOW | правое ветвление]] и является [[Существенно неоднозначные языки#defambigous |неоднозначной]]. Чтобы избавиться от данных проблем неявно, можно придумать более удачную грамматику для рассматриваемого языка. Например, она может иметь следующий вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; &lt;br /&gt;
E \to T + E \mid T \\&lt;br /&gt;
T \to F \times T \mid F \\&lt;br /&gt;
F \to n \mid (E)&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная грамматика содержит только правое ветвление, от которого можно избавиться левой факторизацией, после чего грамматика примет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; &lt;br /&gt;
E \to TE' \\&lt;br /&gt;
E' \to +E \mid \varepsilon \\&lt;br /&gt;
T \to FT' \\&lt;br /&gt;
T' \to \times T \mid \varepsilon \\&lt;br /&gt;
F \to n \mid (E)&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А затем для простоты анализирования раскрыть нетерминалы &amp;lt;tex&amp;gt; E &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; в правилах для &amp;lt;tex&amp;gt; E' &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; T' &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; &lt;br /&gt;
E \to TE' \\&lt;br /&gt;
E' \to +TE' \mid \varepsilon \\&lt;br /&gt;
T \to FT' \\&lt;br /&gt;
T' \to \times FT' \mid \varepsilon \\&lt;br /&gt;
F \to n \mid (E)&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Конструирование FIRST для арифметических выражений ===&lt;br /&gt;
Рассмотрим, как будет выглядеть множество &amp;lt;tex&amp;gt; \mathrm{FIRST} &amp;lt;/tex&amp;gt; после очередной итераций цикла &amp;lt;tex&amp;gt; \mathrm{while} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''После 1ой итерации:''' &lt;br /&gt;
{| style=&amp;quot;background-color:#CCC;margin:0.5px&amp;quot;&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| Правило&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| FIRST&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;E'&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ +,\ \varepsilon\ \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ \}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;T'&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ \times,\ \varepsilon\ \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ n,\ (\ \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
'''После 2ой итерации:''' &lt;br /&gt;
{| style=&amp;quot;background-color:#CCC;margin:0.5px&amp;quot;&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| Правило&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| FIRST&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;E'&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ +,\ \varepsilon\ \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ n,\ (\ \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;T'&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ \times,\ \varepsilon\ \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ n,\ (\ \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
'''После 3eй итерации:''' &lt;br /&gt;
{| style=&amp;quot;background-color:#CCC;margin:0.5px&amp;quot;&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| Правило&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| FIRST&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ n,\ (\ \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;E'&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ +,\ \varepsilon\ \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ n,\ (\ \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;T'&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ \times,\ \varepsilon\ \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ n,\ (\ \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Далее никаких изменений происходить не будет, и на этом алгоритм завершит свою работу.&lt;br /&gt;
=== Конструирование FOLLOW для арифметических выражений ===&lt;br /&gt;
Теперь рассмотрим построение таблицы &amp;lt;tex&amp;gt; \mathrm{FOLLOW} &amp;lt;/tex&amp;gt; после каждой итераций цикла &amp;lt;tex&amp;gt; \mathrm{while} &amp;lt;/tex&amp;gt;. Стартовым нетерминалом будет &amp;lt;tex&amp;gt; E &amp;lt;/tex&amp;gt;, поэтому в него добавим сразу &amp;lt;tex&amp;gt; \$ &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''До цикла while:''' &lt;br /&gt;
{| style=&amp;quot;background-color:#CCC;margin:0.5px&amp;quot;&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| Правило&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| FOLLOW&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ \$ \ \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;E'&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ \}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ \}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;T'&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ \}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ \}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
'''После 1ой итерации:''' &lt;br /&gt;
{| style=&amp;quot;background-color:#CCC;margin:0.5px&amp;quot;&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| Правило&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| FOLLOW&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ \$,\ )\ \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;E'&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ \$ \ \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ +,\ \$\ \}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;T'&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ +,\ \$\ \}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ \times, \ +,\ \$\ \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
'''После 2ой итерации:''' &lt;br /&gt;
{| style=&amp;quot;background-color:#CCC;margin:0.5px&amp;quot;&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| Правило&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| FOLLOW&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ \$,\ )\ \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;E'&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ \$,\ )\ \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ +,\ \$\ \}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;T'&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ +,\ \$\ \}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ \times, \ +,\ \$\ \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
'''После 3ей итерации:''' &lt;br /&gt;
{| style=&amp;quot;background-color:#CCC;margin:0.5px&amp;quot;&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| Правило&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| FOLLOW&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ \$,\ )\ \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;E'&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ \$,\ )\ \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ +,\ \$\ ,\ )\ \}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;T'&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ +,\ \$\ ,\ )\ \}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ \times, \ +,\ \$\ ,\ )\ \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
На этом построение множества &amp;lt;tex&amp;gt; \mathrm{FOLLOW} &amp;lt;/tex&amp;gt; для грамматики закончится.&lt;br /&gt;
&lt;br /&gt;
=== Итоговая таблица ===&lt;br /&gt;
{| style=&amp;quot;background-color:#CCC;margin:0.5px&amp;quot;&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| Правило&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| FIRST&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| FOLLOW&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ n,\ (\ \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ \$,\ )\ \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;E'&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ +,\ \varepsilon\ \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ \$,\ )\ \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ n,\ (\ \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ +,\ \$\ ,\ )\ \}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;T'&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ \times,\ \varepsilon\ \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ +,\ \$\ ,\ )\ \}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ n,\ (\ \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 30px&amp;quot;| &amp;lt;tex&amp;gt;\{\ \times, \ +,\ \$\ ,\ )\ \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Используя [[LL(k)-грамматики, множества FIRST и FOLLOW#Теорема о связи LL(1)-грамматики с множествами FIRST и FOLLOW | теорему]], можно убедиться, что грамматика арифметических выражений на самом деле является LL(1)-грамматикой.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[LL(k)-грамматики, множества FIRST и FOLLOW]]&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [http://en.wikipedia.org/wiki/LL_parser Wikipedia {{---}} LL parser]&lt;br /&gt;
* [http://citforum.ru/programming/theory/serebryakov/4.shtml СitForum {{---}} Синтаксический анализ]&lt;br /&gt;
* Альфред Ахо, Рави Сети, Джеффри Ульман. Компиляторы. Принципы, технологии, инструменты. Издательство Вильямс, 2003. ISBN 5-8459-0189-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Методы трансляции]]&lt;br /&gt;
[[Категория: Нисходящий разбор]]&lt;/div&gt;</summary>
		<author><name>89.113.128.32</name></author>	</entry>

	</feed>