Czy istnieje jakiś nieogólny algorytm analizowania CFG, który rozpoznaje EPAL?

23

EPAL, język parzystych palindromów, jest definiowany jako język generowany przez następującą jednoznaczną, bezkontekstową gramatykę:

Saa

Sbb

SaSa

SbSb

EPAL jest „zmorą” wielu algorytmów parsowania: jeszcze nie spotkałem się z żadnym algorytmem parsowania dla jednoznacznych CFG, które potrafią parsować dowolną gramatykę opisującą język. Jest często używany do pokazania, że ​​istnieją jednoznaczne CFG, których nie można przeanalizować przez konkretny analizator składni. To zainspirowało moje pytanie:

Czy istnieje jakiś algorytm analizujący akceptujący tylko jednoznaczne CFG, który działa na EPAL?

Oczywiście można zaprojektować parser dwuprzebiegowy ad-hoc dla gramatyki, która analizuje język w czasie liniowym. Interesują mnie metody analizy, które nie zostały zaprojektowane specjalnie z myślą o EPAL.

Alex ten Brink
źródło
1
Niemal boję się zapytać: co jest nie tak z LL (1) przez rekurencyjne zejście?
Raphael
3
Rekurencyjne zejście bez wstecznego śledzenia nie obsługuje EPAL, ponieważ językiem nie jest LL (k) dla żadnego k. Rekurencyjne zejście z cofaniem może obsłużyć gramatykę w czasie , ale jest to ogólny algorytm z wykładniczym zachowaniem w najgorszym przypadku, czego nie szukam. O(n2)
Alex ten Brink
O(N2) nie jest wykładnicze, jest kwadratowe. ma charakter wykładniczy. O(2N)
Victor Stafusa,
1
@Victor: nawracanie ma charakter wykładniczy na niektórych gramatykach, ale nie na tej konkretnej gramatyce. Jest to jednak algorytm działający na dwuznacznych gramatykach, pomija go jako odpowiedź na moje pytanie.
Alex ten Brink
1
@jmad: moim zamiarem nie jest parsowanie języka (możesz to zrobić trywialnie w czasie liniowym), ale raczej zaspokojenie mojej ciekawości: widziałem, że jest używany jako przykład języka, którego nie można przeanalizować za pomocą metody parsowania tyle razy, że jestem ciekawy, czy istnieje jakaś metoda analizy, która to rozpoznaje.
Alex ten Brink

Odpowiedzi:

14

Rozważ poniższy szkic strategii analizowania na własne ryzyko.

Zamiast czytać dane wejściowe tylko z jednego końca, czytamy z obu stron i szukamy pasujących reguł. Możemy to zrobić w rekurencyjnym stylu opadania; w wywołaniu znajdź prefiks i sufiks na wejściu, tak że istnieje reguła , zejdź do na pozostałym słowie. Jeśli nie ma pasującej reguły, odrzuć słowo.A()wvAwBvB()

Algorytm analizuje wszystkie liniowe, jednoznaczne gramatyki. Zajmuje to czas liniowy, jeśli wszystkie pary reguł i mają lub ¹. Obejmuje to EPAL. W przeciwnym razie musimy spojrzeć w przyszłość, abyśmy mogli zająć .AwBvAwBvwpwvsvΘ(n2)

Pomysł w ogóle nie działa w przypadku gramatyki nieliniowej. Gramatyki liniowej, ale niejednoznacznej, nie można na ogół analizować bez cofania (przynajmniej dla negatywnych danych wejściowych).


  1. wpv oznacza tutaj, że oraz , tzn. żadne słowo nie jest przedrostkiem drugiego. jest podobny do sufiksów.wvvws
Raphael
źródło
1
Doskonały! Dokładnie tego szukałem. To wspaniałe, że język, który nie jest dla dowolnego jest analizowalny przez tak prosty algorytm. NLR(k)k
Alex ten Brink
1
Po głębszym zastanowieniu odkryłem drobny błąd w twoim opisie: gramatyka liniowa jest jednoznaczny, ale nie ma takiego unikalnego prefiksu, jak to opisujesz. Nadal istnieje unikalny prefiks, ale może być konieczne zajrzenie do nieterminala, aby go uzyskać, a czas działania zmienia się na . Twój algorytm działa jednak na . SaAb|aBb,Aa,BbO(n2)EPAL
Alex ten Brink
@AlextenBrink Dobry połów. Zedytowałem, aby to uwzględnić.
Raphael