Pok-11-wyk-Slajd20

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania

Gramatyka niejednoznaczna(1)

Gramatyka niejednoznaczna(1)


Warto jednak dokładniej przyjrzeć się mechanizmowi nadawania priorytetów i łączności, ponieważ jedna nieprzemyślana (i wydawałoby się mało istotna) modyfikacja gramatyki może spowodować problemy.

Powróćmy do poprzedniego przykładu. Dokładniejsze przyjrzenie się rozstrzygnięciu konfliktu w sytuacji E –> E – E . - E na korzyść redukcji wywołuje jednak pewne wątpliwości. Na szczycie stosu leży przecież nieterminal, który nie ma (i nie może mieć) ani łączności, ani priorytetu !

Rozstrzygnięcie tego konfliktu następuje na podstawie priorytetu produkcji, który jest jej w YACCu nadawany na podstawie priorytetu najbardziej prawego tokenu. Skoro więc priorytet produkcji leżącej na stosie i operatora widzianego na wejściu jest identyczny, to konflikt jest rozstrzygany zgodnie z zadeklarowanym (w tym przypadku lewym) wiązaniem.

Zmodyfikujmy gramatykę zakładając, że operator odejmowania musi być otoczony spacjami. Wydawałoby się, że taka modyfikacja nie powinna mieć wpływu na działanie parsera ale ?... jednak ma, ponownie pojawia się konflikt przesunięcie/redukcja i wszystkie problemy z niego wynikające.

Źródłem problemu jest oczywiście dodanie do produkcji E –> E – E spacji wokół operatora odejmowania. Spacje nie mają ani wiązania, ani priorytetu (swoją drogą – jakie miałyby mieć ?) a więc gramatyka ponownie stała się niejednoznaczna i YACC wybrał domyślną metodę rozstrzygania konfliktu na korzyść przesunięcia.


<< Poprzedni slajd | Spis treści | Następny slajd >>