Wyznaczyć zbiory `FIRST' i 'FOLLOW' dla reguł poniższej gramatyki (symbolem początkowym jest `S').
S : S 'x' | /* puste */Czy ta gramatyka jest LL(1). Dlaczego analizator rekursywny ma problem z tą gramatyką?
Wyznaczyć zbiory `FIRST' i 'FOLLOW' dla reguł poniższej gramatyki (symbolem początkowym jest `S').
S : T 'x' ; T : A | B ; A : 'a' | /* puste */ ; B : 'b' | /* puste */ ;Komentarz: Na wykładzie podalem nieco ogólniejszą niż zwykle się przyjmuje definicje gramantyki LL(1). Gramatyka powyżej spełnia warunki z wykładu, ale nie spełnia warunków tradycyjnej definicji LL(1), która wymaga by co najwyżej jedena z alternatywnych prawych stron wyprowadzała symbol pusty.
Wyznaczyć zbiory `FIRST' i 'FOLLOW' dla reguł poniższej gramatyki (symbolem początkowym jest `S').
S : I | B ; B : 'b' I2 'e' ';' ; I2 : /* puste */ | I2 I ';' I : 't' X | 'v' X | 'x' '=' E ';' | 'i' C 'd' I2 'e' | 'i' C 'd' I2 'o' I2 'e' | 'w' C 'd' I2 'e' ; X : 'x' ';' | 'x' ',' X ; E : 'x' | 'x' '+' E ; C : E '=' EKomentarz: Dla skrócenia rachunków używam tylko jednoznakowych symboli końcowych, lecz można sobie wyobrażać że 'x' to dowolny identyfikator, 'b', 'd', 'e', 'i', 'o', 't', 'v' i 'w' to słowa kluczowe ("begin", "do", "end", "if", "otherwise", "type", "var" i "while" odpowiednio). Przerobienie tego na porządny język programowania pozostawiam Państwa wyobraźni...
Program `bison' pozwala wiązać akcje z regułami gramatyki. Normalne akcje umieszcza się na końcu reguły. Jednak `bison' pozwala umieścić akcję w dowolnym miejscu (nawet na początku reguły). Realizuje to przez wstawianie dodatkowych symboli pomocniczych które wyprowadzają tylko ciąg pusty. Np.
intstr_if : { printf("Analizyjemy intstrukcję if\n");} SYM_IF warunek instr ;daje skutek równoważny z
intstr_if : pom_if SYM_IF warunek instr ; pom_if : { printf("Analizyjemy intstrukcję if f\n");} ;Takie przekształcenie gramatyki może wprowadzić do niej dodatkowe konflikty. Sprawdzić że gramatyka z zadania 1 listy 2 jest akceptowana przez `bison'-a zaś po dodaniu akcji na początku prawej strony każdej reguły (jeśli reguła ma kilka alternatyw to na początku każdej alternatywy) `bison' zgłasza informacje o konfliktach (błędach).
Uzasadnić że aby uniknąć konfliktów po dodaniu akcji na początku każdej reguły gramatyka powinna być LL(1) według tradycyjnej definicji (istotna jest tu jednoznaczność wyprowadzenia symboli pustych).