Алгоритм Эрли — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
м
Строка 2: Строка 2:
 
|definition =
 
|definition =
 
Пусть <tex>G = (N, \Sigma, P, S)</tex> {{---}} контекстно свободная грамматика и <tex>\omega = a_1 a_2 ... a_n</tex> {{---}} входная цепочка из <tex>\Sigma^*</tex>.
 
Пусть <tex>G = (N, \Sigma, P, S)</tex> {{---}} контекстно свободная грамматика и <tex>\omega = a_1 a_2 ... a_n</tex> {{---}} входная цепочка из <tex>\Sigma^*</tex>.
Объект вида <tex>[A \rightarrow X_1 X_2 ... X_k \cdot X_{k+1} ... X_m, i]</tex> назовем <b>ситуацией</b>, относящейся к цепочке <tex>\omega</tex>, если <tex>A \rightarrow X_1 ... X_m </tex> {{---}} правило из <tex>P</tex> и <tex>0 \leqslant i \leqslant n</tex>. <tex>\cdot</tex> является метасимволом, не принадлежащим ни <tex>N</tex>, ни <tex>\Sigma</tex>. <tex>k \in \mathbb{N}, 0 \leqslant k \leqslant m</tex>.
+
Объект вида <tex>[A \rightarrow X_1 X_2 ... X_k \cdot X_{k+1} ... X_m, i]</tex> назовем <b>ситуацией</b>, относящейся к цепочке <tex>\omega</tex>, если <tex>A \rightarrow X_1 ... X_m </tex> {{---}} правило из <tex>P</tex> и <tex>0 \leqslant i \leqslant n</tex> — позиция в <tex>\omega</tex>. <tex>\cdot</tex> является метасимволом, не принадлежащим ни <tex>N</tex>, ни <tex>\Sigma</tex>.  
 
}}
 
}}
  
Строка 16: Строка 16:
  
 
==Алгоритм Эрли==
 
==Алгоритм Эрли==
 
+
Построим список разбора для <tex>\omega</tex>
<b>Вход.</b> контекстно свободная грамматика <tex>G = (N, \Sigma, P, S)</tex> и входная цепочка <tex>\omega = a_1 a_2 ... a_n</tex>.<br>
 
<b>Выход.</b> Список разбора <tex>I_0, I_1, ... I_n</tex> для цепочки <tex>\omega</tex>.<br>
 
<b>Метод.</b><br>
 
 
Строим <tex>I_0</tex><br>
 
Строим <tex>I_0</tex><br>
<i>Шаг 1.</i> Если <tex>S \rightarrow \alpha</tex> {{---}} правило из <tex>P</tex>, включить <tex>[S \rightarrow \cdot \alpha, 0]</tex> в <tex>I_0</tex>.<br>
+
<i>Шаг 1.</i> Если <tex>S \rightarrow \alpha \in P</tex>, включить <tex>[S \rightarrow \cdot \alpha, 0]</tex> в <tex>I_0</tex>.<br>
Выполняем шаги 2 и 3 до тех пор, пока можем включать новые ситуации в <tex>I_0</tex>.<br>
+
Пока можно включить новые ситуации в <tex>I_0</tex> повторяем шаги 2 и 3.<br>
<i>Шаг 2.</i> Если <tex>[B \rightarrow \gamma \cdot, 0] \in I_0</tex>, включить в <tex>I_0</tex> ситуацию <tex>[A \rightarrow \alpha B \cdot \beta, 0]</tex> для всех <tex>[A \rightarrow \alpha \cdot B \beta, 0]</tex>, уже принадлежащих <tex>I_0</tex>.<br>
+
<i>Шаг 2.</i> Если <tex>[B \rightarrow \gamma \cdot, 0] \in I_0</tex>, включить в <tex>I_0</tex> ситуацию <tex>[A \rightarrow \alpha B \cdot \beta, 0]</tex> для всех <tex>[A \rightarrow \alpha \cdot B \beta, 0]</tex> из <tex>I_0</tex>.<br>
<i>Шаг 3.</i> Допустим, что <tex>[A \rightarrow \alpha \cdot B \beta, 0] \in I_0</tex>. Для каждого правила из <tex>P</tex> вида <tex>B \rightarrow \gamma</tex> включить в <tex>I_0</tex> ситуацию <tex>[B \rightarrow \cdot \gamma, 0]</tex> (если она еще не там).<br>
+
<i>Шаг 3.</i> Для всех <tex>[A \rightarrow \alpha \cdot B \beta, 0] \in I_0</tex>, для всех <tex>\gamma</tex> таких, что <tex>B \rightarrow \gamma \in P</tex> включить <tex>[B \rightarrow \cdot \gamma, 0]</tex> в <tex>I_0</tex>.<br>
 
Построение <tex>I_j</tex> по <tex>I_0, I_1, ..., I_{j-1}</tex>. <br>
 
Построение <tex>I_j</tex> по <tex>I_0, I_1, ..., I_{j-1}</tex>. <br>
<i>Шаг 4.</i> Для каждой ситуации <tex>[B \rightarrow \alpha \cdot a \beta, i] \in I_{j-1}</tex>, для которой <tex>a = a_j</tex> включить в <tex>I_j</tex> ситуацию <tex>[B \rightarrow \alpha a \cdot \beta, i] </tex>.<br>
+
<i>Шаг 4.</i> Для каждой ситуации <tex>[B \rightarrow \alpha \cdot a_{j} \beta, i] \in I_{j-1}</tex>, <tex>a_j</tex>— j-й символ в <tex>\omega</tex> включить <tex>[B \rightarrow \alpha a \cdot \beta, i] </tex> в <tex>I_j</tex>.<br>
Выполняем шаги 5 и 6 до тех пор, пока можем включать новые ситуации в <tex>I_j</tex>.<br>
+
Пока можно включить новые ситуации в <tex>I_j</tex> повторяем шаги 5 и 6.<br>
<i>Шаг 5.</i> Пусть <tex>[A \rightarrow \alpha \cdot , i] \in I_j</tex>. Ищем ситуации вида <tex>[B \rightarrow \gamma \cdot A \delta, k]</tex>. Для каждой из них включить в <tex>I_j</tex> ситуацию <tex>[B \rightarrow \gamma A \cdot \delta, k]</tex>.<br>
+
<i>Шаг 5.</i> Если <tex>[A \rightarrow \alpha \cdot , i] \in I_j</tex>, то для каждой ситуации <tex>[B \rightarrow \gamma \cdot A \beta, k] \in I_{i}</tex> включить <tex>[B \rightarrow \gamma A \cdot \beta, k]</tex> в <tex>I_j</tex>.<br>
<i>Шаг 6.</i> Пусть <tex>[A \rightarrow \alpha \cdot B \beta, i] \in I_j</tex>. Для каждого <tex>B \rightarrow \gamma</tex> из <tex>P</tex> включить в <tex>I_j</tex> ситуацию <tex>[B \rightarrow \cdot \gamma, j]</tex>.<br>
+
<i>Шаг 6.</i> Для всех <tex>[A \rightarrow \alpha \cdot B \beta, i] \in I_j</tex>, для всех <tex>\gamma</tex> таких, что <tex>B \rightarrow \gamma \in P</tex> включить <tex>[B \rightarrow \cdot \gamma, j]</tex> в <tex>I_j</tex>.<br>
Вычисляем все <tex>I_j</tex> для <tex>0 \leqslant j \leqslant n</tex>.<br>
+
Если <tex>[S \rightarrow \alpha \cdot, 0] \in I_n</tex>, то <tex>\omega \in L(G) </tex>.<br>
<tex>\omega \in L(G) \Leftrightarrow [S \rightarrow \alpha \cdot, 0] \in I_n</tex>.<br>
+
 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'''Шаг 4.'''&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'''Шаг 5.'''&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'''Шаг 6.'''<br>
 
[[Файл:Эрли2.png]] [[Файл:Эрли1.png]] [[Файл:Эрли3.png]]
 
  
 
==Литература==
 
==Литература==
 
*А.Ахо, Дж. Ульман. Теория синтакcического анализа, перевода и компиляции. Том 1. Синтакcический анализ.
 
*А.Ахо, Дж. Ульман. Теория синтакcического анализа, перевода и компиляции. Том 1. Синтакcический анализ.

Версия 09:51, 1 декабря 2011

Определение:
Пусть [math]G = (N, \Sigma, P, S)[/math] — контекстно свободная грамматика и [math]\omega = a_1 a_2 ... a_n[/math] — входная цепочка из [math]\Sigma^*[/math]. Объект вида [math][A \rightarrow X_1 X_2 ... X_k \cdot X_{k+1} ... X_m, i][/math] назовем ситуацией, относящейся к цепочке [math]\omega[/math], если [math]A \rightarrow X_1 ... X_m [/math] — правило из [math]P[/math] и [math]0 \leqslant i \leqslant n[/math] — позиция в [math]\omega[/math]. [math]\cdot[/math] является метасимволом, не принадлежащим ни [math]N[/math], ни [math]\Sigma[/math].


Определение:
Для каждого [math]0 \leqslant j \leqslant n[/math] построим список ситуаций [math]I_j[/math] такой, что [math][A \rightarrow \alpha \cdot \beta , i] \in I_j[/math] для [math]0 \leqslant j \leqslant n[/math] тогда и только тогда, когда для некоторых [math]\gamma[/math] и [math]\delta[/math] существуют выводы [math]S \Rightarrow^* \gamma A \delta, \gamma \Rightarrow^* a_1...a_i[/math] и [math]\alpha \Rightarrow^* a_{i+1} ... a_j[/math].


Определение:
Последовательность списков [math]I_0, I_1, ..., I_n[/math] называется списком разбора для входной цепочки [math]\omega[/math].


Алгоритм Эрли

Построим список разбора для [math]\omega[/math] Строим [math]I_0[/math]
Шаг 1. Если [math]S \rightarrow \alpha \in P[/math], включить [math][S \rightarrow \cdot \alpha, 0][/math] в [math]I_0[/math].
Пока можно включить новые ситуации в [math]I_0[/math] повторяем шаги 2 и 3.
Шаг 2. Если [math][B \rightarrow \gamma \cdot, 0] \in I_0[/math], включить в [math]I_0[/math] ситуацию [math][A \rightarrow \alpha B \cdot \beta, 0][/math] для всех [math][A \rightarrow \alpha \cdot B \beta, 0][/math] из [math]I_0[/math].
Шаг 3. Для всех [math][A \rightarrow \alpha \cdot B \beta, 0] \in I_0[/math], для всех [math]\gamma[/math] таких, что [math]B \rightarrow \gamma \in P[/math] включить [math][B \rightarrow \cdot \gamma, 0][/math] в [math]I_0[/math].
Построение [math]I_j[/math] по [math]I_0, I_1, ..., I_{j-1}[/math].
Шаг 4. Для каждой ситуации [math][B \rightarrow \alpha \cdot a_{j} \beta, i] \in I_{j-1}[/math], [math]a_j[/math]— j-й символ в [math]\omega[/math] включить [math][B \rightarrow \alpha a \cdot \beta, i] [/math] в [math]I_j[/math].
Пока можно включить новые ситуации в [math]I_j[/math] повторяем шаги 5 и 6.
Шаг 5. Если [math][A \rightarrow \alpha \cdot , i] \in I_j[/math], то для каждой ситуации [math][B \rightarrow \gamma \cdot A \beta, k] \in I_{i}[/math] включить [math][B \rightarrow \gamma A \cdot \beta, k][/math] в [math]I_j[/math].
Шаг 6. Для всех [math][A \rightarrow \alpha \cdot B \beta, i] \in I_j[/math], для всех [math]\gamma[/math] таких, что [math]B \rightarrow \gamma \in P[/math] включить [math][B \rightarrow \cdot \gamma, j][/math] в [math]I_j[/math].
Если [math][S \rightarrow \alpha \cdot, 0] \in I_n[/math], то [math]\omega \in L(G) [/math].


Литература

  • А.Ахо, Дж. Ульман. Теория синтакcического анализа, перевода и компиляции. Том 1. Синтакcический анализ.