[ Pobierz całość w formacie PDF ]
.W praktyce rzadko spotyka się naprawdę skomplikowane deklaracje, ważne jest jednak to, by je należycie rozumieć i - jeśli zajdzie taka potrzeba - wiedzieć, jak je tworzyć.Jednym z dobrych sposobów syntetyzowania deklaracji jest metoda małych kroków, korzystająca z definicji typów typedef, o której jest mowa w p.6.7.Tu proponujemy inny sposób: prezentujemy parę programów, które zamieniają poprawny tekst napisany w języku C na zwykły opis słowny i odwrotnie.Opis słowny czyta się od lewej strony do prawej.Pierwszy z programów, dcl, jest bardziej skomplikowany*.Jego zadaniem jest zamiana deklaracji C na opis słowny, jak w następujących przykładach:*Aby nie komplikować jeszcze bardziej tego programu, nie będziemy tu zajmować się deklinacją polskich stów.- Przyp.tłum.1665.12 SKOMPLIKOWANE DEKLARACJEchar **argvargv: wskaźnik do wskaźnik do char int(*daytab)[13]daytab: wskaźnik do tablica[13] o elementach int int *daytab[13]daytab: tabtica[13] o elementach wskaźnik do int void *comp()comp: tunkcja zwracająca wskaźnik do void void (*comp)()comp: wskaźnik do funkcja zwracająca void char (*(*x ())[])()x: funkcja zwracająca wskaźnik do tablica[] o elementachwskaźnik do funkcja zwracająca char char(*(*x[3])())[51x: tablica[3l o elementach wskaźnik do funkcja zwracającawskaźnik do tablica[5] o elementach charProgram dcl działa na podstawie gramatyki, którą wprowadza deklarator, szczegółowo opisany w dodatku A8.5.Tutaj przedstawiamy uproszczoną postać reguł składniowych:deklarator:opcjonalne *-i bezpośredni-deklaratorbezpośredni-deklarator: nazwa {deklarator)hezpośredni-deklarator() bezpośredni-deklarator[opcjonalny rozmiar}Mówiąc prościej, deklarator jest bezpośrednim deklaratorem być może poprzedzonym znakami *.Bezpośredni deklarator jest albo nazwą, albo deklaratorem ujętym w nawiasy okrągłe, albo bezpośrednim deklaratorem, po którym następują nawiasy okrągłe, albo bezpośrednim deklaratorem, po którym następują nawiasy kwadratowe ewentualnie zawierające rozmiar.Z tej gramatyki można skorzystać przy rozbiorze deklaracji.Rozważmy na przykład deklarator(*pfa[])()Fragment pfa zostanie zidentyfikowany jako nazwa, a zatem jako bezpośredni-deklarator.Wobec tego konstrukcja pfa[] także jest bezpośrednim deklaratorem.Potem1675 WSKAŹNIKI I TABLICEkonstrukcja *pfa[] zostanie rozpoznana jako deklarator, a zatem (*pfa[]) też jest bezpośrednim deklaratorem.Na koniec, konstrukcja (*pfa[ ]) () jest bezpośrednim deklaratorem, a zatem jest deklaratorem.Ten rozbiór gramatyczny możemy także zilustrować graficznie za pomocą drzewa wywodu (w którym deklarator skróciliśmy do deki, a bezpośredni-deklarator do bezp-dekl):„Sercem" programu dcl jest para funkcji, dcl i dirdcl, które dokonują rozbioru gramatycznego deklaracji według podanej składni (dcl odpowiada jednostce składniowej de-klarator, a dirdcl -jednostce składniowej bezpośredni-deklarator).Składnię zdefiniowano rekurencyjnie, zatem obie funkcje także wywołują się rekurencyjnie po rozpoznaniu fragmentu deklaracji.Taki program jest nazywany rekurencyjnie zstępującym analizatorem składniowym./* dcl: analiza składniowa deklaratora */ void dcl (void){int ns;for (ns = 0; gettoken() == '*'; ) /* zlicza *-i */ns++; dirdcl (); while (ns-- > 0)strcat(out, " wskaźnik do"); }1685 [ Pobierz całość w formacie PDF ]
zanotowane.pl doc.pisz.pl pdf.pisz.pl przylepto3.keep.pl
.W praktyce rzadko spotyka się naprawdę skomplikowane deklaracje, ważne jest jednak to, by je należycie rozumieć i - jeśli zajdzie taka potrzeba - wiedzieć, jak je tworzyć.Jednym z dobrych sposobów syntetyzowania deklaracji jest metoda małych kroków, korzystająca z definicji typów typedef, o której jest mowa w p.6.7.Tu proponujemy inny sposób: prezentujemy parę programów, które zamieniają poprawny tekst napisany w języku C na zwykły opis słowny i odwrotnie.Opis słowny czyta się od lewej strony do prawej.Pierwszy z programów, dcl, jest bardziej skomplikowany*.Jego zadaniem jest zamiana deklaracji C na opis słowny, jak w następujących przykładach:*Aby nie komplikować jeszcze bardziej tego programu, nie będziemy tu zajmować się deklinacją polskich stów.- Przyp.tłum.1665.12 SKOMPLIKOWANE DEKLARACJEchar **argvargv: wskaźnik do wskaźnik do char int(*daytab)[13]daytab: wskaźnik do tablica[13] o elementach int int *daytab[13]daytab: tabtica[13] o elementach wskaźnik do int void *comp()comp: tunkcja zwracająca wskaźnik do void void (*comp)()comp: wskaźnik do funkcja zwracająca void char (*(*x ())[])()x: funkcja zwracająca wskaźnik do tablica[] o elementachwskaźnik do funkcja zwracająca char char(*(*x[3])())[51x: tablica[3l o elementach wskaźnik do funkcja zwracającawskaźnik do tablica[5] o elementach charProgram dcl działa na podstawie gramatyki, którą wprowadza deklarator, szczegółowo opisany w dodatku A8.5.Tutaj przedstawiamy uproszczoną postać reguł składniowych:deklarator:opcjonalne *-i bezpośredni-deklaratorbezpośredni-deklarator: nazwa {deklarator)hezpośredni-deklarator() bezpośredni-deklarator[opcjonalny rozmiar}Mówiąc prościej, deklarator jest bezpośrednim deklaratorem być może poprzedzonym znakami *.Bezpośredni deklarator jest albo nazwą, albo deklaratorem ujętym w nawiasy okrągłe, albo bezpośrednim deklaratorem, po którym następują nawiasy okrągłe, albo bezpośrednim deklaratorem, po którym następują nawiasy kwadratowe ewentualnie zawierające rozmiar.Z tej gramatyki można skorzystać przy rozbiorze deklaracji.Rozważmy na przykład deklarator(*pfa[])()Fragment pfa zostanie zidentyfikowany jako nazwa, a zatem jako bezpośredni-deklarator.Wobec tego konstrukcja pfa[] także jest bezpośrednim deklaratorem.Potem1675 WSKAŹNIKI I TABLICEkonstrukcja *pfa[] zostanie rozpoznana jako deklarator, a zatem (*pfa[]) też jest bezpośrednim deklaratorem.Na koniec, konstrukcja (*pfa[ ]) () jest bezpośrednim deklaratorem, a zatem jest deklaratorem.Ten rozbiór gramatyczny możemy także zilustrować graficznie za pomocą drzewa wywodu (w którym deklarator skróciliśmy do deki, a bezpośredni-deklarator do bezp-dekl):„Sercem" programu dcl jest para funkcji, dcl i dirdcl, które dokonują rozbioru gramatycznego deklaracji według podanej składni (dcl odpowiada jednostce składniowej de-klarator, a dirdcl -jednostce składniowej bezpośredni-deklarator).Składnię zdefiniowano rekurencyjnie, zatem obie funkcje także wywołują się rekurencyjnie po rozpoznaniu fragmentu deklaracji.Taki program jest nazywany rekurencyjnie zstępującym analizatorem składniowym./* dcl: analiza składniowa deklaratora */ void dcl (void){int ns;for (ns = 0; gettoken() == '*'; ) /* zlicza *-i */ns++; dirdcl (); while (ns-- > 0)strcat(out, " wskaźnik do"); }1685 [ Pobierz całość w formacie PDF ]