Алгоритм Эрли, доказательство оценки O(n^2) для однозначной грамматики — различия между версиями
Kirelagin (обсуждение | вклад) |
AndrewD (обсуждение | вклад) |
||
Строка 42: | Строка 42: | ||
Ситуацию <tex>[A \rightarrow \alpha \cdot \beta, i]</tex> можно включить в <tex>I_j</tex> только по правилам <tex>(1)</tex> (если последний символ <tex>\alpha</tex> — терминал) и <tex>(2)</tex> (если нетерминал). В первом случае результат очевиден. Во втором случае допустим, что <tex>[A \rightarrow \alpha'B \cdot \beta, i]</tex> включается в <tex>I_j</tex>, когда рассматриваются две различные ситуации <tex>[B \rightarrow \eta_1 \cdot, k_1]</tex> и <tex>[B \rightarrow \eta_2 \cdot, k_2]</tex>. Тогда ситуация <tex>[A \rightarrow \alpha' \cdot B\beta, i]</tex> должна оказаться одновременно в <tex>I_{k_1}</tex> и в <tex>I_{k_2}</tex>. | Ситуацию <tex>[A \rightarrow \alpha \cdot \beta, i]</tex> можно включить в <tex>I_j</tex> только по правилам <tex>(1)</tex> (если последний символ <tex>\alpha</tex> — терминал) и <tex>(2)</tex> (если нетерминал). В первом случае результат очевиден. Во втором случае допустим, что <tex>[A \rightarrow \alpha'B \cdot \beta, i]</tex> включается в <tex>I_j</tex>, когда рассматриваются две различные ситуации <tex>[B \rightarrow \eta_1 \cdot, k_1]</tex> и <tex>[B \rightarrow \eta_2 \cdot, k_2]</tex>. Тогда ситуация <tex>[A \rightarrow \alpha' \cdot B\beta, i]</tex> должна оказаться одновременно в <tex>I_{k_1}</tex> и в <tex>I_{k_2}</tex>. | ||
# Пусть <tex>k_1 \ne k_2</tex>. Тогда существуют такие <tex>\gamma_1, \delta_1, \gamma_2</tex> и <tex>\delta_2</tex>, что <tex>S \Rightarrow^* \gamma_1 A \delta_1 \Rightarrow \gamma_1 \alpha' B \beta \delta_1</tex> и <tex>S \Rightarrow^* \gamma_2 A \delta_2 \Rightarrow \gamma_2 \alpha' B \beta \delta_2</tex>. Но в первом выводе <tex>\gamma_1 \alpha' \Rightarrow^* a_1 \dots a_{k_1}</tex>, а во втором <tex>\gamma_2 \alpha' \Rightarrow^* a_1 \dots a_{k_2}</tex>. Тогда для цепочки <tex>a_1 \dots a_n</tex> существуют два разных дерева вывода, в которых <tex>a_{i+1} \dots a_j</tex> выводится из <tex>\alpha' B</tex> двумя разными способами. | # Пусть <tex>k_1 \ne k_2</tex>. Тогда существуют такие <tex>\gamma_1, \delta_1, \gamma_2</tex> и <tex>\delta_2</tex>, что <tex>S \Rightarrow^* \gamma_1 A \delta_1 \Rightarrow \gamma_1 \alpha' B \beta \delta_1</tex> и <tex>S \Rightarrow^* \gamma_2 A \delta_2 \Rightarrow \gamma_2 \alpha' B \beta \delta_2</tex>. Но в первом выводе <tex>\gamma_1 \alpha' \Rightarrow^* a_1 \dots a_{k_1}</tex>, а во втором <tex>\gamma_2 \alpha' \Rightarrow^* a_1 \dots a_{k_2}</tex>. Тогда для цепочки <tex>a_1 \dots a_n</tex> существуют два разных дерева вывода, в которых <tex>a_{i+1} \dots a_j</tex> выводится из <tex>\alpha' B</tex> двумя разными способами. | ||
− | # Пусть <tex>k_1 = k_2</tex>. Тогда <tex>\eta_1 \ne \eta_2</tex>. Тогда, так как <tex>[B \rightarrow \eta_1 \cdot, k_1] \in I_j</tex> и <tex>[B \rightarrow \eta_2 \cdot, k_1] \in I_j</tex>, то <tex>\eta_1 \Rightarrow^* a_{k_1 + 1} \dots a_j</tex> и <tex>\eta_2 \Rightarrow^* a_{k_1 + 1} \dots a_j</tex>, то есть <tex>a_{k_1 + 1} \dots a_j</tex> выводится двумя разными способами. | + | # Пусть <tex>k_1 = k_2</tex>. Тогда <tex>\eta_1 \ne \eta_2</tex>. Тогда, так как <tex>[B \rightarrow \eta_1 \cdot, k_1] \in I_j</tex> и <tex>[B \rightarrow \eta_2 \cdot, k_1] \in I_j</tex>, то <tex>\eta_1 \Rightarrow^* a_{k_1 + 1} \dots a_j</tex> и <tex>\eta_2 \Rightarrow^* a_{k_1 + 1} \dots a_j</tex>, то есть <tex>a_{k_1 + 1} \dots a_j</tex> выводится двумя разными способами. Так как <tex>[A \rightarrow \alpha' \cdot B \beta, i] \in I_{k_1}</tex>, то <tex>S \Rightarrow^* \gamma A \delta \Rightarrow \gamma \alpha' B \beta \delta \Rightarrow^* a_1 \ldots a_i \alpha' B \beta \delta \Rightarrow^* a_1 \ldots a_i a_{i+1} \ldots a_{k_1} B \beta \delta</tex> и <tex> a_1 \ldots a_{k_1} B \beta \delta \Rightarrow a_1 \ldots a_i a_{i+1} \ldots a_{k_1} \eta \beta \delta \Rightarrow^* a_1 \ldots a_i a_{i+1} \ldots a_{k_1} a_{k_1+1} \ldots a_j w'</tex>, где <tex>\eta = \eta_1</tex> или <tex>\eta = \eta_2</tex>, а <tex>w'</tex> {{---}} некоторая строка, такая что <tex>\beta \delta \Rightarrow^* w'</tex>. Таким образом, строка <tex>a_1 \ldots a_i a_{i+1} \ldots a_{k_1} a_{k_1+1} \ldots a_j w'</tex> выводится двумя способами. |
}} | }} | ||
Версия 03:38, 19 января 2012
Алгоритм
Приведем Алгоритм Эрли.
На вход подается КС-грамматика и строка из . Результатом работы алгоритма является список разбора для строки .
Для простоты добавим новый стартовый вспомогательный нетерминал
и правило .∪= # Правило (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): |
в списке находится ситуаций. |
Доказательство: |
Так как грамматика фиксирована, то | количество ситуаций вида не больше некоторой константы. Таким образом, поскольку в находятся ситуации, у которых , всего в будет ситуаций.
Лемма (2): |
Пусть — однозначная КС-грамматика и — цепочка из . Тогда алгоритм Эрли пытается включить в не более одного раза, если . |
Доказательство: |
Ситуацию можно включить в только по правилам (если последний символ — терминал) и (если нетерминал). В первом случае результат очевиден. Во втором случае допустим, что включается в , когда рассматриваются две различные ситуации и . Тогда ситуация должна оказаться одновременно в и в .
|
Теорема: |
Если входная грамматика однозначна, то время выполнения алгоритма Эрли для слова длины составляет . |
Доказательство: |
Орагнизуем каждый список разбора таким образом, чтобы по любому символу , можно было за получить список тех и только тех ситуаций, содержащихся в , которые имеют вид .Время построения не зависит от входной строки.Рассмотрим .
|
Литература
- А. Ахо, Дж. Ульман. Теория синтакcического анализа, перевода и компиляции. Том 1. Синтакcический анализ.