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ę:

S→aa

S→bb

S→aSa

S→bSb

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.


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()wvA→wBvB()

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ąć .A→wBvA→w′B′v′w≢pw′v≢sv′Θ(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. w≢pv oznacza tutaj, że oraz , tzn. żadne słowo nie jest przedrostkiem drugiego. jest podobny do sufiksów.w⋢vv⋢w≢s

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 . S→aAb|aBb,A→a,B→bO(n2)EPAL
— Alex ten Brink

@AlextenBrink Dobry połów. Zedytowałem, aby to uwzględnić.
— Raphael
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.