Predykat (języki formalne)

Z testwiki
Przejdź do nawigacji Przejdź do wyszukiwania

Predykat – warunek o który mogą być wzbogacone produkcje języka bezkontekstowego

A{πi}?αii-ta predykowana produkcja.

Produkcja z semantycznym predykatem πi jest wykonalna (Szablon:Lang viable) tylko wtedy, gdy πi jest spełnione (true) w bieżącym stanie. Predykaty pozwalają na znaczne zwiększenie siły rozpoznawania języka, w tym, na dodaniu kontekstu do gramatyki bezkontekstowej.

Generator parserów ANTLR używa predykatów do ujednoznaczniania niejednoznacznej gramatyki. Weźmy gramatykę niejednoznaczną i lewostronnie rekurencyjną:

EE%E|E+E|id.

Występuje tu dodawanie o niskim priorytecie i modulo o wyższym. Możemy przekształcić według reguł[1] do postaci bez lewostronnej rekurencji:

Eid(%E|+E)*.

Ta gramatyka nie będąc już lewostronnie rekurencyjną pozostaje niejednoznaczna, predykaty ujednoznaczniają:

E[pr]id({3pr}?%E[4]|{2pr}?+E[3])*.

Wszędzie indziej odniesienia do E stają się odniesieniami do E[0]. Produkcja {3pr}?%E[4] jest wykonalna kiedy priorytet operacji modulo 3, odpowiada lub przekracza parametr pr. Pierwsze wołanie E ma pr = 0 i ponieważ 30 parser rozwija „% E[4]” w E[0]. Kiedy wołamy parsowanie E[4], predykat 2pr? nie przechodzi ponieważ priorytet operatora + jest zbyt niski: 24. Konsekwentnie E[4] nie dopasowuje operatora + opóźniając wołanie E[0].

Przypisy

Szablon:Przypisy