Napisać gramatykę która rozpoznaje typowe nagłówki funkcji w C. Dla uproszczenia można się ograniczyć tylko do typów nazwanych przez identyfikator (wbudowane lub zadeklarowane gdzie indziej przez `typedef'). Przy takim ograniczeniu symbolami są: identyfikatory, '(', ')' , ',', ';' i '...'. Przykładowe nagłówki:
int fun1(int, int); typek fun2(typek x, int y); int fun3(); int fun4(int, ...);Postarać się by gramatka spełniała warunki typu LL(1) czy SLR(1). Uwaga: ręczne sprawdzanie warunków typu LR jest dość pracochłonne więc tego nie wymagam. Ale proszę zrobić trochę wysiłku w tym kierunku, tzn. wyeliminować te konflikty które Państwo zobaczą.
S : T | U | V | X | Y ; T : T X T | /* puste */ ; U : U X 'u' | /* puste */ ; V : Y 'v' Y | X 'v' ; X : X Y X | /* puste */ ; Y : Y 'y' ;
Wyznaczyć automat LR(0) dla poniższej gramatyki:
E : E '+' T | T ; T : T '*' P | P ; P : '(' E ')' | 'x' ;
Pokazać że gramatyka:
S:'x' '+' 'x' | 'x' * 'x' ;nie jest LL(1) zaś jest LR(0).
Pokazać że gramatyka:
S: T '.' ; T: /* puste */ | T X ',' | T Y ';'; X: 'x' | 'z' ; Y: 'y' | 'z' ;nie jest LR(0) zaś jest LR(1).
Pokazać że gramatyka:
S: A 'r' | B 'l' ; A: /* puste */ | 'x' A ; B: /* puste */ | B 'x' ;nie jest LR(1) (ani nawet LR(k) dla żadnego k), choć jest jednoznaczna i można dla niej podać prosty algorytm analizy syntaktycznej.
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 instrukcję if\n");} SYM_IF warunek instr ;daje skutek równoważny z
intstr_if : pom_if SYM_IF warunek instr ; pom_if : { printf("Analizyjemy instrukcję if f\n");} ;Takie przekształcenie gramatyki może wprowadzić do niej dodatkowe konflikty. Np. poniższa gramatyka, gdzie symbolem początkowym jest S zaś symbolami końcowymi są '1', 'x', '+', '-', '*', '(' i ')' jest akceptowana bez konfliktów przez 'bison'-a
E : T | E '+' T ; T : F | T '*' F ; F : '-' P | P ; P : '(' E ')' | '1' | 'x' ;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) (istotna jest tu jednoznaczność wyprowadzenia symboli pustych).