EPAL, język parzystych palindromów, jest definiowany jako język generowany przez następującą jednoznaczną, bezkontekstową gramatykę:
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.
źródło
Odpowiedzi:
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() w v A→wBv B()
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→wBv A→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).
źródło