Алгоритм Эрли — различия между версиями
Kirelagin (обсуждение | вклад) (Добил доказательство, уф.) |
Kirelagin (обсуждение | вклад) (→Пример) |
||
| Строка 97: | Строка 97: | ||
==Пример== | ==Пример== | ||
| − | + | Построим список разбора для строки <tex>\omega = (a + a)</tex> в грамматике со следующими правилами: | |
| − | <tex>S \rightarrow T + S</tex | + | * <tex>S \rightarrow T + S</tex> |
| − | <tex>S \rightarrow T </tex | + | * <tex>S \rightarrow T </tex> |
| − | <tex>T \rightarrow F * T</tex | + | * <tex>T \rightarrow F * T</tex> |
| − | <tex>T \rightarrow F</tex | + | * <tex>T \rightarrow F</tex> |
| − | <tex>F \rightarrow ( S )</tex | + | * <tex>F \rightarrow ( S )</tex> |
| − | <tex>F \rightarrow a</tex | + | * <tex>F \rightarrow a</tex> |
| − | |||
| + | {| | ||
| + | |- | ||
| + | | | ||
| − | + | {| class="wikitable" | |
| − | <tex>[S' \rightarrow \cdot S, 0]</tex> | + | |- |
| − | <tex>[S \rightarrow \cdot T + S, 0]</tex> | + | !<tex>I_0</tex> |
| − | <tex>[S \rightarrow \cdot T, 0]</tex> | + | |- |
| − | <tex>[T \rightarrow \cdot F * T, 0]</tex> | + | | |
| − | <tex>[T \rightarrow \cdot F, 0]</tex> | + | {| |
| − | <tex>[F \rightarrow \cdot ( S ), 0]</tex> | + | |- |
| − | <tex>[F \rightarrow \cdot a, 0]</tex> | + | !Ситуация !! Из правила |
| + | |- | ||
| + | |<tex>[S' \rightarrow \cdot S, 0]</tex> || 0 | ||
| + | |- | ||
| + | |<tex>[S \rightarrow \cdot T + S, 0]</tex> || 3 | ||
| + | |- | ||
| + | |<tex>[S \rightarrow \cdot T, 0]</tex> || 3 | ||
| + | |- | ||
| + | |<tex>[T \rightarrow \cdot F * T, 0]</tex> || 3 | ||
| + | |- | ||
| + | |<tex>[T \rightarrow \cdot F, 0]</tex> || 3 | ||
| + | |- | ||
| + | |<tex>[F \rightarrow \cdot ( S ), 0]</tex> || 3 | ||
| + | |- | ||
| + | |<tex>[F \rightarrow \cdot a, 0]</tex> || 3 | ||
| + | |} | ||
| + | |} | ||
| + | || | ||
| − | + | {| class="wikitable" | |
| − | <tex>[F \rightarrow ( \cdot S ), 0]</tex> | + | |- |
| − | <tex>[S \rightarrow \cdot T + S, 1]</tex> | + | !<tex>I_1</tex> |
| − | <tex>[S \rightarrow \cdot T, 1]</tex> | + | |- |
| − | <tex>[T \rightarrow \cdot F * T, 1]</tex> | + | | |
| − | <tex>[T \rightarrow \cdot F, 1]</tex> | + | {| |
| − | <tex>[F \rightarrow \cdot ( S ), 1]</tex> | + | |- |
| − | <tex>[F \rightarrow \cdot a, 1]</tex> | + | !Ситуация !! Из правила |
| + | |- | ||
| + | |<tex>[F \rightarrow ( \cdot S ), 0]</tex> || 1 | ||
| + | |- | ||
| + | |<tex>[S \rightarrow \cdot T + S, 1]</tex> || 3 | ||
| + | |- | ||
| + | |<tex>[S \rightarrow \cdot T, 1]</tex> || 3 | ||
| + | |- | ||
| + | |<tex>[T \rightarrow \cdot F * T, 1]</tex> || 3 | ||
| + | |- | ||
| + | |<tex>[T \rightarrow \cdot F, 1]</tex> || 3 | ||
| + | |- | ||
| + | |<tex>[F \rightarrow \cdot ( S ), 1]</tex> || 3 | ||
| + | |- | ||
| + | |<tex>[F \rightarrow \cdot a, 1]</tex> || 3 | ||
| + | |} | ||
| + | |} | ||
| + | || | ||
| − | + | {| class="wikitable" | |
| − | <tex>[F \rightarrow a \cdot, 1]</tex> | + | |- |
| − | <tex>[T \rightarrow F \cdot * T, 1]</tex> | + | !<tex>I_2</tex> |
| − | <tex>[T \rightarrow F \cdot , 1]</tex> | + | |- |
| − | <tex>[S \rightarrow T \cdot , 1]</tex> | + | | |
| − | <tex>[S \rightarrow T \cdot + S, 1]</tex> | + | {| |
| − | <tex>[F \rightarrow ( S \cdot ), 0]</tex> | + | |- |
| + | !Ситуация !! Из правила | ||
| + | |- | ||
| + | |<tex>[F \rightarrow a \cdot, 1]</tex> || 1 | ||
| + | |- | ||
| + | |<tex>[T \rightarrow F \cdot * T, 1]</tex> || 2 | ||
| + | |- | ||
| + | |<tex>[T \rightarrow F \cdot , 1]</tex> || 2 | ||
| + | |- | ||
| + | |<tex>[S \rightarrow T \cdot , 1]</tex> || 2 | ||
| + | |- | ||
| + | |<tex>[S \rightarrow T \cdot + S, 1]</tex> || 2 | ||
| + | |- | ||
| + | |<tex>[F \rightarrow ( S \cdot ), 0]</tex> || 2 | ||
| + | |} | ||
| + | |} | ||
| + | |- | ||
| + | | | ||
| − | + | {| class="wikitable" | |
| − | <tex>[S \rightarrow T + \cdot S, 1]</tex> | + | |- |
| − | <tex>[S \rightarrow \cdot T + S, 3]</tex> | + | !<tex>I_3</tex> |
| − | <tex>[S \rightarrow \cdot T, 3]</tex> | + | |- |
| − | <tex>[T \rightarrow \cdot F * T, 3]</tex> | + | | |
| − | <tex>[T \rightarrow \cdot F, 3]</tex> | + | {| |
| − | <tex>[F \rightarrow \cdot ( S ), 3]</tex> | + | |- |
| − | <tex>[F \rightarrow \cdot a, 3]</tex> | + | !Ситуация !! Из правила |
| + | |- | ||
| + | |<tex>[S \rightarrow T + \cdot S, 1]</tex> || 1 | ||
| + | |- | ||
| + | |<tex>[S \rightarrow \cdot T + S, 3]</tex> || 3 | ||
| + | |- | ||
| + | |<tex>[S \rightarrow \cdot T, 3]</tex> || 3 | ||
| + | |- | ||
| + | |<tex>[T \rightarrow \cdot F * T, 3]</tex> || 3 | ||
| + | |- | ||
| + | |<tex>[T \rightarrow \cdot F, 3]</tex> || 3 | ||
| + | |- | ||
| + | |<tex>[F \rightarrow \cdot ( S ), 3]</tex> || 3 | ||
| + | |- | ||
| + | |<tex>[F \rightarrow \cdot a, 3]</tex> || 3 | ||
| + | |} | ||
| + | |} | ||
| + | || | ||
| − | + | {| class="wikitable" | |
| − | <tex>[F \rightarrow a \cdot , 3]</tex> | + | |- |
| − | <tex>[T \rightarrow F \cdot * T, 3]</tex> | + | !<tex>I_4</tex> |
| − | <tex>[T \rightarrow F \cdot , 3]</tex> | + | |- |
| − | <tex>[S \rightarrow T \cdot + S, 3]</tex> | + | | |
| − | <tex>[S \rightarrow T \cdot , 3]</tex> | + | {| |
| − | <tex>[S \rightarrow T + S \cdot , 1]</tex> | + | |- |
| − | <tex>[F \rightarrow ( S \cdot ), 0]</tex> | + | !Ситуация !! Из правила |
| + | |- | ||
| + | |<tex>[F \rightarrow a \cdot , 3]</tex> || 1 | ||
| + | |- | ||
| + | |<tex>[T \rightarrow F \cdot * T, 3]</tex> || 2 | ||
| + | |- | ||
| + | |<tex>[T \rightarrow F \cdot , 3]</tex> || 2 | ||
| + | |- | ||
| + | |<tex>[S \rightarrow T \cdot + S, 3]</tex> || 2 | ||
| + | |- | ||
| + | |<tex>[S \rightarrow T \cdot , 3]</tex> || 2 | ||
| + | |- | ||
| + | |<tex>[S \rightarrow T + S \cdot , 1]</tex> || 2 | ||
| + | |- | ||
| + | |<tex>[F \rightarrow ( S \cdot ), 0]</tex> || 2 | ||
| + | |} | ||
| + | |} | ||
| + | || | ||
| − | + | {| class="wikitable" | |
| − | <tex>[F \rightarrow ( S )\cdot , 0]</tex> | + | |- |
| − | <tex>[T \rightarrow F \cdot * T, 0]</tex> | + | !<tex>I_5</tex> |
| − | <tex>[T \rightarrow F \cdot , 0]</tex> | + | |- |
| − | <tex>[S \rightarrow T \cdot + S, 0]</tex> | + | | |
| − | <tex>[S \rightarrow T \cdot , 0]</tex> | + | {| |
| − | <tex>[S' \rightarrow S \cdot , 0]</tex> | + | |- |
| + | !Ситуация !! Из правила | ||
| + | |- | ||
| + | |<tex>[F \rightarrow ( S )\cdot , 0]</tex> || 1 | ||
| + | |- | ||
| + | |<tex>[T \rightarrow F \cdot * T, 0]</tex> || 2 | ||
| + | |- | ||
| + | |<tex>[T \rightarrow F \cdot , 0]</tex> || 2 | ||
| + | |- | ||
| + | |<tex>[S \rightarrow T \cdot + S, 0]</tex> || 2 | ||
| + | |- | ||
| + | |<tex>[S \rightarrow T \cdot , 0]</tex> || 2 | ||
| + | |- | ||
| + | |<tex>[S' \rightarrow S \cdot , 0]</tex> || 2 | ||
| + | |} | ||
| + | |} | ||
| + | |} | ||
Так как <tex>[S' \rightarrow S \cdot , 0] \in I_5</tex>, то <tex>\omega \in L(G) </tex>.<br> | Так как <tex>[S' \rightarrow S \cdot , 0] \in I_5</tex>, то <tex>\omega \in L(G) </tex>.<br> | ||
Версия 23:32, 18 января 2012
Алгоритм Эрли позволяет определить, выводится ли данное слово в данной контекстно-свободной грамматике .
Вход: КС грамматика и слово .
Выход: , если выводится в ; — иначе.
Содержание
Определения
| Определение: |
| Пусть — контекстно-свободная грамматика и — входная цепочка из . Объект вида , где — правило из и — позиция в , называется ситуацией, относящейся к цепочке . |
| Определение: |
| -м списком ситуаций для входной цепочки , где , называется множество ситуаций . То есть выводит часть c первого по -й символ. |
| Лемма: |
. |
| Доказательство: |
| Поскольку (при ), из определения получаем, что . |
| Определение: |
| Последовательность списков ситуаций называется списком разбора для входной цепочки . |
Алгоритм Эрли
Построим список разбора для с помощью данного алгоритма и воспользуемся леммой, доказанной выше.
Для простоты добавим новый стартовый вспомогательный нетерминал и правило .
∪= # Правило (0) — инициализация useful_loop(0) for i = 1..n for ∪= # Правило (1) useful_loop(j)
function useful_loop(j):
do
for
for
∪= # Правило (2)
for
for
∪= # Правило (3)
while на данной итерации какое-то множество изменилось
Корректность алгоритма
| Теорема: |
Приведенный алгоритм правильно строит все списки ситуаций. |
| Доказательство: |
Алгоритм не добавит в список ситуацию, которая ему не принадлежит:Докажем индукцией по исполнению алгоритма. 1. Включаем по правилу 1. 2. Включаем по правилу 2. 3. Включаем по правилу 3. В каждый список попадут все ситуации, которые ему принадлежат:Для всех наборов нужно доказать, что, если , то алгоритм добавит в . Рангом набора называется , где — длина кратчайшего вывода , — длина кратчайшего вывода , — длина кратчайшего вывода . Докажем утверждение индукцией по рангу набора. 1. оканчивается терминалом. 2. оканчивается нетерминалом. 3. . |
Пример
Построим список разбора для строки в грамматике со следующими правилами:
|
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
Так как , то .
Литература
Ахо А., Ульман Д. Теория синтакcического анализа, перевода и компиляции. Том 1. Синтаксический анализ. Пер. с англ. — М.:«Мир», 1978. С. 358 — 364.