Алгоритм Эрли — различия между версиями
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 forfor ∪= # Правило (2) for for ∪= # Правило (3) while на данной итерации какое-то множество изменилось
Корректность алгоритма
Теорема: |
Приведенный алгоритм правильно строит все списки ситуаций. |
Доказательство: |
Алгоритм не добавит в список ситуацию, которая ему не принадлежит:Докажем индукцией по исполнению алгоритма. 1. Включаем по правилу 1. 2. Включаем по правилу 2. 3. Включаем по правилу 3. В каждый список попадут все ситуации, которые ему принадлежат:Для всех наборов нужно доказать, что, если , то алгоритм добавит в .Рангом набора называется , где — длина кратчайшего вывода , — длина кратчайшего вывода , — длина кратчайшего вывода .Докажем утверждение индукцией по рангу набора. 1. 2. 3. |
Пример
Построим список разбора для строки
в грамматике со следующими правилами:
|
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
Так как
Литература
Ахо А., Ульман Д. Теория синтакcического анализа, перевода и компиляции. Том 1. Синтаксический анализ. Пер. с англ. — М.:«Мир», 1978. С. 358 — 364.