[ Pobierz całość w formacie PDF ]
.W praktyce rzadko spotyka się naprawdę skomplikowane deklaracje, ważne jest jed­nak to, by je należycie rozumieć i - jeśli zajdzie taka potrzeba - wiedzieć, jak je two­rzyć.Jednym z dobrych sposobów syntetyzowania deklaracji jest metoda małych kro­ków, korzystająca z definicji typów typedef, o której jest mowa w p.6.7.Tu propo­nujemy 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 zamia­na 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 na­wiasy 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 ewen­tualnie 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-dekla­rator.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 de­klaratorem, a zatem jest deklaratorem.Ten rozbiór gramatyczny możemy także zilus­trować 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 grama­tycznego deklaracji według podanej składni (dcl odpowiada jednostce składniowej de-klarator, a dirdcl -jednostce składniowej bezpośredni-deklarator).Składnię zdefinio­wano rekurencyjnie, zatem obie funkcje także wywołują się rekurencyjnie po rozpo­znaniu 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