Aalys Earley – Wikipedia

before-content-x4

W teorii języków, Algorytm Earleya jest algorytmem analizy syntaktycznej dla gramatyk niekonstkalnych opisanych po raz pierwszy przez Jaya Earleya [[[ Pierwszy ] . Jak algorytmy CYK i Glr , Algorytm Earleya oblicza wszystkie możliwe analizy zdania (i nie tylko jedna z tych analiz). Opiera się na dynamicznym programowaniu.

after-content-x4

Możemy zbudować analizator Earley dla dowolnej gramatyki niekonstkalnej. Biega w czasie sześciennym (o (n 3 ), Lub N jest długością łańcucha wejściowego). W przypadku gramatyki nieobsługiwej analiza Earley przeprowadzana jest w czasie kwadratowym (n (n 2 )).

Rozważ gramatykę niekonstologiczną, a także łańcuch wejściowy długości

N {DisplayStyle n}

odnotowany

A Pierwszy . . . A N {DisplayStyle A_ {1} … a_ {n}}

. Analiza według algorytmu Earley ma na celu rozpoznanie łańcucha, a zatem stwierdzenie, czy łańcuch jest częścią języka generowanego przez gramatykę.

Przedmioty Earley et Table Earley [[[ modyfikator |. Modyfikator i kod ]

Algorytm Earleya manipuluje Przedmioty Earley , nazywany prosto rzeczy . Pozycja to dane:

after-content-x4
  • Zauważona zasada produkcji gramatyki
  • Indeks startowy
  • wskaźnik pozycji we właściwej części reguły, która jest reprezentowana przez a punkt .

Reprezentujemy element w formularzu

( A A B W I ) {DisplayStyle (A Rightarrow Alpha Bullet Beta, i)}

, Lub

0 I N {DisplayStyle 0leq Ileq n}

.

Zasada algorytmu [[[ modyfikator |. Modyfikator i kod ]

Mamy stół

T {DisplayStyle T}

sztywny

N + Pierwszy {DisplayStyle n+1}

gdzie przechowujemy zestawy przedmiotów Earleya, gdzie

N {DisplayStyle n}

jest długością łańcucha wejściowego.

Obliczenia zaczyna się od

T [[[ 0 ] {DisplayStyle t [0]}

zawierające elementy formularza

( S A W 0 ) {DisplayStyle (s prawy Bullet Alpha, 0)}

Lub

S {DisplayStyle s}

jest aksjomat gramatyki i

S A {DisplayStyle S Rightarrow Alpha}

jest zasadą produkcyjną. Przedmiot

( S A W 0 ) {DisplayStyle (s prawy Bullet Alpha, 0)}

Reprezentuje sytuację, w której nic nie zostało rozpoznane, ale gdzie staramy się rozpoznać aksjomat od początku łańcucha wejściowego. Następnie wykonujemy krok 0, 1, …, do kroku n.

Cel kroku

J {DisplayStyle J}

ma obliczyć, aby przechowywać w tabeli

T [[[ J ] {DisplayStyle t [j]}

, wszystkie przedmioty

( A A B W I ) {DisplayStyle (A Rightarrow Alpha Bullet Beta, i)}

Jak na przykład

A I . . . A J {DisplayStyle A_ {i} … a_ {j}}

jest rozpoznawany przez

A {DisplayStyle Alpha}

.

Na scenie

J {DisplayStyle J}

, obliczamy

T [[[ J ] {DisplayStyle t [j]}

z tabel

T [[[ 0 ] W W T [[[ J Pierwszy ] {DisplayStyle t [0], Dots, t [j-1]}

Nasety, w kolejności trzech operacji:

  • Czytanie (skaner po angielsku). Operacja odczytu jest przeprowadzana
  • Prognoza (predyktor w języku angielskim). I przedmiot z formularzy
  • Ukończenie (pełne w języku angielskim) . I przedmiot z formularzy

Analiza się powiódła, jeśli tabela

T [[[ N ] {DisplayStyle t [n]}

Zawiera element w formie

( S A W 0 ) {displayStyle (s praweArrow Alpha Bullet, 0)}

, Lub

S A {DisplayStyle S Rightarrow Alpha}

jest produkcją.

Rozważ kolejną gramatykę wyrażeń arytmetycznych:

S {DisplayStyle s}

jest aksjomat gramatyki.

Przeanalizujmy łańcuch wejściowy

A + A {DisplayStyle A+A}

. Następnie uzyskujemy następujące tabele. Zwrócimy uwagę „P:” Operację prognostyczną; „C:” Operacja ukończenia i „L:” Operacja czytania.

W kroku 0 obliczanie zaczyna się od

( S I W 0 ) {DisplayStyle (Srightarrow Bullet E, 0)}

. Następnie nasycimy operacją prognostyczną.

P:
P:
P:
P:
P:
P:
P:
P:
P:
P:

W kroku 1 otrzymujemy

( F A W 0 ) {DisplayStyle Color {Red} (frightarrow Abullet, 0)}

przez operację czytania. Operacja przewidywania nic nie wytwarza, ponieważ wskaźnik położenia znajduje się na końcu właściwej części. Przedmiot

( F A W 0 ) {DisplayStyle Color {Red} (frightarrow Abullet, 0)}

jest używany przez operację zakończenia do uzyskania

( N F W 0 ) {DisplayStyle Color {Red} (nrightarrow fbullet, 0)}

, Następnie

( I N W 0 ) {DisplayStyle Color {Red} (erightarrow nbullet, 0)}

itd. do nasycenia operacji zakończenia.

L:
C:
C:
C:
C:
C:
C:
C:

W kroku 2 otrzymujemy

( I I + N W 0 ) {DisplayStyle (Erightarrow E+Bullet N, 0)}

czytając operację. Jak

N {DisplayStyle n}

jest tuż po indeksie pozycji w pierwszej linii

T [[[ 2 ] {DisplayStyle t [2]}

, dodajemy wszystkie zasady

( N A ) {displayStyle (nrightarrow alpha)}

W prognozie, z indeksem 2, który jest bieżącym wskaźnikiem pozycji.

L:
P:
P:
P:
P:
P:
P:
P:

W kroku 3 czytamy

F {DisplayStyle f}

, więc uzupełniamy

( N F W 2 ) {DisplayStyle (Nrightarrow Bullet F, 2)}

z

T [[[ 2 ] {DisplayStyle t [2]}

W

( N F W 2 ) {displayStyle (nrightarrow fbullet, 2)}

. Jest więc zasada

( N F W 2 ) {displayStyle (nrightarrow fbullet, 2)}

Tak więc zasada

( I I + N W 0 ) {DisplayStyle (Erightarrow E+Bullet N, 0)}

kończy się w

( I I + N W 0 ) {DisplayStyle (Erightarrow e+nbullet, 0)}

.

Nasyczymy przez zakończenie.

L:
C:
C:
C:
C:
C:
C:
C:

Jak

( S I W 0 ) {DisplayStyle Color {Red} (Srightarrow Ebullet, 0)}

jest w

T [[[ 3 ] {DisplayStyle t [3]}

, słowo wejście jest rozpoznawane.

Złożoność espace [[[ modyfikator |. Modyfikator i kod ]

Albo

I {DisplayStyle i}

Liczba osobnych elementów w indeksie bliskiego startu. Można to zwiększyć przy użyciu wielkości gramatyki: dla każdego elementu w gramatyce wskaźnik pozycji może mieć skończoną liczbę przestrzeni i dla każdej z tych pozycji uzyskujemy inny element. Otrzymujemy

I {DisplayStyle i}

Licząc te elementy. W praktyce sprowadza się to do liczenia liczby możliwych lokalizacji symbolu

{DisplayStyle Bullet}

W zasadach produkcji gramatyki. W poprzednim przykładzie mamy zatem

I = 34 {DisplayStyle i = 34}

.

Przy stole

T [[[ J ] {DisplayStyle t [j]}

, każdy z

I {DisplayStyle i}

elementy mogą pojawiać się z indeksem start pomiędzy

0 {DisplayStyle 0}

I

J {DisplayStyle J}

. Więc jest najwyżej

I . ( J + Pierwszy ) {DisplayStyle I. (j+1)}

elementy w tabeli

T [[[ J ] . J {DisplayStyle t [j] .J}

jest zwiększony przez

N {DisplayStyle n}

Lub

N {DisplayStyle n}

to rozmiar słowa wejściowego. Podsumowując

I . ( J + Pierwszy ) {DisplayStyle I. (j+1)}

Dla

J {DisplayStyle J}

z

0 {DisplayStyle 0}

ma

N {DisplayStyle n}

, otrzymujemy

I . ( N + Pierwszy ) . ( N + 2 ) / 2 {DisplayStyle I. (n+1). (N+2)/2}

Elementy co najwyżej w tabelach. Złożoność w przestrzeni jest zatem w O (N²).

Złożoność w czasie (sprawa ogólna) [[[ modyfikator |. Modyfikator i kod ]

Zbadajmy złożoność czytania operacji, prognozy i ukończenia na stole

T [[[ J ] {DisplayStyle t [j]}

:

Czytanie analizuje elementy

T [[[ J Pierwszy ] {DisplayStyle t [j-1]}

każdy w stałym czasie. Biorąc pod uwagę wielkość

T [[[ J Pierwszy ] {DisplayStyle t [j-1]}

, operacja odczytu jest wykonywana w

O ( J ) {DisplayStyle o (j)}

. Prognozy działa na każdym z elementów już obecnych w stałym czasie. Po odczytaniu liczba obecnych elementów jest w

O ( J ) {DisplayStyle o (j)}

Dlatego przewidywanie jest wykonywane w

O ( J ) {DisplayStyle o (j)}

. Ukończenie działa na każdym obecnym elemencie w czasie w zależności od wielkości tabeli, do której powraca jej indeks startowy. W najgorszym przypadku mogą być ograniczone do jednej drogi każdej z poprzednich tabel, co daje złożoność O (J²).

Podsumowując te złożoności

N {DisplayStyle n}

Tabele, otrzymujemy złożoność w ostatnim czasie w O (n 3 ).

Złożoność w czasie (gramatyka non-ambiguë) [[[ modyfikator |. Modyfikator i kod ]

Które stawiają złożoność w O (n 3 ) była działaniem ukończenia. Teraz, jeśli gramatyka nie jest ambiguel, istnieje tylko jeden sposób na uzyskanie każdego elementu i rozmiar tabeli

T [[[ J ] {DisplayStyle t [j]}

Po zakończeniu

O ( J ) {DisplayStyle o (j)}

. Więc każdego z tych elementów można było uzyskać tylko w czasie

O ( J ) {DisplayStyle o (j)}

. Następnie uzyskujemy, podsumowując złożoność w czasie w O (N²).

Analiza Earleya można wykonać za pomocą Acykliczny wykres zorientowany wejście [[[ 4 ] Zamiast ciąg znaków. Umożliwia to ustalenie kilku słów jako bardziej zwarty sposób, a także analizowanie kilku słów w tym samym czasie, dzięki czemu jest bardziej skuteczny. Tabele tabel są następnie wskaźnikami odpowiadającymi topologicznemu sortowaniu wykresu. Ponadto dla węzła indeksu J, operacja odczytu już nie używa

T [[[ J Pierwszy ] {DisplayStyle t [j-1]}

więcej

T [[[ k ] {DisplayStyle t [k]}

gdzie k jest wskaźnikiem węzła nadrzędnego badanego węzła.

after-content-x4