69
правок
Изменения
Нет описания правки
{{Определение
|definition =
Пусть <tex>G = \langle N, \Sigma, P, S \rangle</tex> {{---}} [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|контекстно-свободная]] грамматика и <tex>w = a_1 a_2 w_0 w_1 ... a_nw_{n-1}</tex> {{---}} входная цепочка из <tex>\Sigma^*</tex>.Объект вида <tex>[A \rightarrow \alpha \cdot \beta, i]</tex>, где <tex>A \rightarrow \alpha \beta </tex> — правило из <tex>P</tex> и <tex>0 \leqslant i \leqslant n</tex> — позиция в <tex>w</tex>, называется '''ситуацией''', относящейся к цепочке <tex>w</tex>, где '''<tex> \cdot </tex>''' {{---}} вспомогательный символ, который не явлется терминалом или нетерминалом ( <tex> \cdot \notin \Sigma \cup N</tex>).
}}
{{Определение
|definition =
}}
{{Определение
|definition =
Последовательность списков ситуаций <tex>I_0D_0, I_1D_1, .., I_nD_{n-1}</tex> называется <b>списком разбора</b> для входной цепочки <tex>w</tex>.
}}
== Алгоритм Эрли ==
Чтобы воспользоваться леммой, необходимо найти <tex>I_nD_n</tex> для <tex>w</tex>. Алгоритм Эрли является [[Динамическое программирование|динамическим алгоритмом]]: он последовательно строит список разбора, причём при построении <tex>I_jD_j</tex> используются <tex>I_0D_0, \ldots, I_D_{j}</tex> (то есть элементы списков с меньшими номерами и ситуации, содержащиеся в текущем списке на данный момент).
Алгоритм основывается на следующих трёх правилах:
# Если <tex>[A \rightarrow \alpha \cdot a_w_{j} \beta, i] \in I_D_{j-1}</tex> (где <tex>a_jw_j</tex> — <tex>j</tex>-ый символ строки), то <tex>[A \rightarrow \alpha a_w_{j} \cdot \beta, i] \in I_jD_j</tex>.# Если <tex>[B \rightarrow \eta \cdot , ki] \in I_jD_j</tex> и <tex>[A \rightarrow \alpha \cdot B \beta, ik] \in I_{k}D_i</tex>, то <tex>[A \rightarrow \alpha B \cdot \beta, ik] \in I_jD_j</tex>.# Если <tex>[B A \rightarrow \alpha \cdot A B \etabeta, ki] \in I_jD_{j} </tex> и <tex>(A B \rightarrow \betaeta) \in P</tex>, то <tex>[A B \rightarrow \cdot \betaeta, j] \in I_jD_{j}</tex>.
=== Псевдокод ===
Для простоты добавим новый стартовый вспомогательный нетерминал <tex>S'</tex> и правило <tex>(S' \rightarrow S)</tex>.
'''function''' <tex>\mathtt{earley}(G, w)</tex>:
<font color=green>// Инициализация </font>
<tex> D_{0} = \lbrace [S' \rightarrow \cdot S, 0] \rbrace </tex>
'''for''' <tex>i = 1</tex> '''to''' <tex>len(w) - 1</tex>
<tex>D_i</tex> = <tex>\varnothing </tex>
<font color=green>// Вычисление ситуаций </font>
'''for''' <tex>j = 0</tex> '''to''' <tex>len(w) - 1</tex>
<tex>\mathtt{scan}(D, j, G, w)</tex>
'''while''' <tex>D_j</tex> изменяется
<tex>\mathtt{complete}(D, j, G, w)</tex>
<tex>\mathtt{predict}(D, j, G, w)</tex>
<font color=green>// Результат </font>
'''if''' <tex>[S' \rightarrow S \cdot, 0] \in D_{len(w)} </tex>
'''return''' ''true''
'''else'''
'''return''' ''false''
<font color=green>// Первое правило </font> '''function''' <tex>I_0\mathtt{scan}(D, j, G, w)</tex> : '''if''' <tex>j</tex> == <tex>\lbrace 0</tex> '''return''' '''for''' <tex>[S' A \rightarrow \alpha \cdot Sa \beta, 0i] \rbracein D_{j - 1} </tex> '''if''' <tex>a</tex> == <tex>w_{j - 1}</tex> # Правило (0) — инициализация useful_loop(0) <tex>D_{j}</tex> <tex> \cup</tex>= <tex>[A \rightarrow \alpha \cdot a \beta, i]</tex>
<font color=green>// Второе правило </font> '''function''' <tex>\mathtt{complete}(D, j, G, w)</tex>: '''for ''' <tex>[B \rightarrow \eta \cdot, i] \in D_{j = 1..n} </tex> '''for ''' <tex>[A \rightarrow \alpha \cdot a_{j} B \beta, ik] \in I_D_{j-1i}</tex> <tex>I_jD_{j}</tex> &<tex> \cup;</tex>= <tex>\{ [A \rightarrow \alpha a_{j} B \cdot \beta, ik] \}</tex> # Правило (1) useful_loop(j)
==Корректность алгоритма==
{{Теорема
|statement = Приведенный алгоритм правильно строит все списки ситуаций.То есть алгоритм поддерживает инвариант <tex> [A \rightarrow \alpha \cdot \beta, i] \in D_{j} \Longleftrightarrow \exists \delta \in \Sigma \cup N : ((S' \Rightarrow^* w_0...w_{i-1} A \delta) \wedge A \Rightarrow^* w_i...w_{j-1})</tex>
|proof =
Докажем индукцией по исполнению алгоритма.<br/>
<u> ''База (инициализация) индукции: '' <tex/u>\alpha = \varepsilon \Rightarrow^* \varepsilon <br/tex> и <tex>[S' \Rightarrow^* rightarrow \gamma cdot S , 0] \delta in D_0</tex> при .<texbr/><u>\gamma = \delta = \varepsilon ''Индукционный переход:'' </texu>.<br/>Индукционный переход: пусть в Пусть предположение верно для всех списков ситуаций с номерами меньше <tex> I_{0},...,I_{j} </tex> нет лишних ситуаций. Пусть включаем Разберемся, в результате применения какого правила ситуация <tex>[A \rightarrow \alpha \cdot \beta, i] </tex> попала в <tex>I_D_{j}</tex>. Рассмотрим три случая:<br/>
1. Включаем по правилу <tex>(1)\mathtt{scan}</tex>.<br/>Тогда Это произошло, если <tex>\alpha = \alpha' a_a</tex>, <tex>a = w_{j-1} , </tex> и <tex> [A \rightarrow \alpha' \cdot a_{j} a \beta, i] \in I_D_{j-1}</tex>. <br/>По предположению индукции <tex>\alphaS' \Rightarrow^* a_{i+1}w_0...a_w_{ji-1} A \delta</tex> и существуют <tex>\gammaalpha'\Rightarrow^* w_i...w_{j-2}</tex> и <tex>\delta' ,<br/tex> такие, что тогда в силу <tex>S' \Rightarrow^* \gamma' A \delta', \gamma' \Rightarrow^* a_1...a_a = w_{ij-1} </tex>. Значит, получаем <tex> \alpha = \alpha' a_{j} a \Rightarrow^* a_w_i...w_{i+j-2}w_{j-1}= w_i...a_w_{j-1} </tex> и при .<br/>Таким образом условия: <tex>\gamma = \gammaS', \delta = Rightarrow^* w_0...w_{i-1} A \delta'</tex> и <tex>[A \rightarrow \alpha \cdot \beta, i] \in I_jRightarrow^* w_i...w_{j-1}</tex>выполняются.
2. Включаем по правилу <tex>(2)\mathtt{predict}</tex>.<br/>Тогда По построению: <tex>\alpha = \alpha' B varepsilon </tex> и <tex>i=j</tex>, [A что автоматически влечет второй пункт утверждения.<br/>Кроме того <tex>\rightarrow \alphaexists i' \cdot B \beta, le i] \in I_{k}</tex> и ситуация <tex> [B A' \rightarrow \eta alpha ' \cdotA \delta ', ki'] \in I_{j} D_i</tex>. По , из чего по предположению, индукции следует <tex>\alphaS' \Rightarrow^* a_{i+1}w_0...a_w_{ki'-1}, A' \eta \Rightarrow^* a_{k+1}...a_{j} delta ''</tex>, откуда и <tex>\alpha = \alpha' B \Rightarrow^*a_w_{i+1'}...a_w_{ji-1} </tex>. Кроме того<br/>Получаем, существуют что <tex>S' \gammaRightarrow^* w_0...w_{i'-1} A'</tex> и <tex>\delta'' </tex> такие, что значит <tex>S' \Rightarrow^* w_0...w_{i'-1} \gammaalpha' A \delta', \gammadelta '' = a_1...a_{i} </tex>. Значит, при следовательно <tex>S' \gamma = \gammaRightarrow^* w_0...w_{i'-1} w_{i', }...w_{i-1} A \delta = ' \delta''</tex> , в итоге <tex>[A S' \rightarrow \alpha \cdot \beta, Rightarrow^* w_0...w_{i] -1} A \in I_jdelta</tex>, что нам и требовалось.
3. Включаем по правилу <tex>(3)\mathtt{complete}</tex>.<br/>Тогда По построению: <tex>\alpha = \varepsilon, alpha ' A' </tex> и <tex>\exists i = j', \delta : [B A \rightarrow \alpha' \cdot A ' \etabeta, ki] \in I_D_{ji'}, \wedge [A ' \Rightarrow rightarrow \eta \cdot, i'] \betain D_j</tex>. По предположению <br/>Cледовательно <tex>\alpha = \alpha' A' \Rightarrow^* a_w_i...w_{k+i'-1} w_{i'}...a_w_{ij}</tex> и существуют <tex>\gamma'</tex> и <tex>\delta' </tex> такие, что <tex>S' \Rightarrow^* \gamma' B \delta', \gamma' \Rightarrow^* a_1= w_i...a_w_{kj-1} </tex>. Значит, при <tex>\gamma = \gamma' \alpha', \delta = \eta \delta' </tex> выполнено <tex> S' \Rightarrow^* \gamma A \delta</tex>что дает нам второй пункт утверждения, следовательно <tex>[A \rightarrow \alpha \cdot \betaа так как первый пункт следует из индукционного предположения, i] \in I_j</tex>все хорошо.
}}
==Пример==
Построим список разбора для строки <tex>w = (a + a)</tex> в грамматике со следующими правилами:
* <tex>S \rightarrow T + S</tex>;* <tex>S \rightarrow T </tex>;* <tex>T \rightarrow F * T</tex>;* <tex>T \rightarrow F</tex>;* <tex>F \rightarrow ( S )</tex>;* <tex>F \rightarrow a</tex>.
{|
{| class="wikitable"
|-
!<tex>I_0D_0</tex>
|-
|
{| class="wikitable"
|-
!<tex>I_1D_1</tex>
|-
|
{| class="wikitable"
|-
!<tex>I_2D_2</tex>
|-
|
{| class="wikitable"
|-
!<tex>I_3D_3</tex>
|-
|
{| class="wikitable"
|-
!<tex>I_4D_4</tex>
|-
|
{| class="wikitable"
|-
!<tex>I_5D_5</tex>
|-
|
|}
Так как <tex>[S' \rightarrow S \cdot , 0] \in I_5D_5</tex>, то <tex>w \in L(G) </tex>.<br> ==См. также==* [[Алгоритм Кока-Янгера-Касами разбора грамматики в НФХ]]* [[Алгоритм Кока-Янгера-Касами, модификация для произвольной грамматики]]
==ЛитератураИсточники информации==''*[http://lpcs.math.msu.su/~sk/lehre/fivt2013/Earley.pdf Алексей Сорокин {{---}} Алгоритм Эрли]* Ахо А., Ульман Д.'' {{---}} Теория синтакcического анализа, перевода и компиляции. Том 1. Синтаксический анализ. Пер. с англ. — {{---}} М.:«Мир», 1978. С. 358 — 364.
[[Категория: Теория формальных языков]]
[[Категория: Контекстно-свободные грамматики]]
[[Категория: Алгоритмы разбора]]