ANSI C 3

ANSI C 3



5 WSKAŹNIKI I TABLICE__-— ---

konstrukcja *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 zilustrować graficznie za pomocą drzewa wywodu (w którym deklarator skróciliśmy do deki, a bezpośredni-deklarator do bezp-dekl):

(    *    pfa    [ ]    )    ()

„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 deklarator, 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() == V;) /* zlicza *-i */ ns++;

dirdcl ();

while (ns-- > 0)

strcat(out, ” wskaźnik do”);

}

5.12 SKOMPLIKOWANE DEKLARACJE ______

—power^d—by

Mi siol


/* dirdcl: analiza składniowa bezpośredniego deklaratora */ void dirdcl (void)

{

int type;

if (tokentype == ’(’) {    /* (deklarator) */

dcl ();

if (tokentype != ')’)

printffbłąd: brak nawiasu )\n”);

} else if (tokentype == NAME ) /* nazwa zmiennej */ strcpy(name, token);

else

printf(”błąd: spodziewana nazwa lub (deklarator)\nu); while ((tyf>e = gettoken()) == PARENS || type == BRACKETS) if (type == PARENS)    /* para nawiasów () */

strcat(out, ” funkcja zwracająca"); else {    /* para nawiasów [ ] */

strcat(out, ” tablica”);

strcat(out, token);    /* ew. rozmiar */

strcat(out, ” o elementach”);

}

}

Ponieważ te programy z zamierzenia są ilustracyjne, a nie „kuloodporne”, trzeba było poważnie ograniczyć możliwości programu dci. Obsługuje on jedynie proste typy danych, jak char czy int. Nie zajmuje się typami argumentów funkcji ani kwalifikatorami jak np. const. Fałszywe odstępy wprawiają go w zakłopotanie. Program dcl nie szuka błędów zbyt dokładnie, więc niepoprawne deklaracje także wprawiają go w zakłopotanie. Takie udoskonalenia pozostawiono do opracowania jako ćwiczenia.

A oto zmienne globalne i główna procedura programu dcl:

#include <stdio.h>

#include <string.h>

#include <ctype.h>

#define MAXTOKEN 100

enum { NAME, PARENS, BRACKETS };

void dcl(void); void dirdcl(void);

169


Wyszukiwarka

Podobne podstrony:
ANSI C 3 5 WSKAŹNIKI I TABLICE możliwości są zawarte w funkcjach: getline (rozdz. 1 i 4), atoi, it
ANSI C 2 5 WSKAŹNIKI I TABLICE _______^ operator przyrostkowy ++ nie zmieni t, dopóki nie zostanie
ANSI C 4 WSKAŹNIKI I TABLICE Wskaźnik jest zmienną, która zawiera adres innej zmiennej. W języku C
ANSI C 5 5 WSKAŹNIKI I TABLICE Jeżeli wskaźnik ip wskazuje na zmienną całkowitą x, to *ip może wys
ANSI C 6 5 WSKAŹNIKI I TABLICE _ Obrazowo wygląda to tak: 5 2 WSKAŹNIKI I ARGUMENTY FUNKCJI w miej
ANSI C 7 5 WSKAŹNIKI I TABLICE Ćwiczenie 5.1. Tak jak została napisana, funkcja getint traktuje zn
ANSI C 8 5 WSKAŹNIKI I TABLICE Między nazwą tablicy a wskaźnikiem jest jednak istotna różnica, o k
ANSI C 9 5 WSKAŹNIKI I TABLICE______—-- alloc i afree jest stosem lub listą LIFO (ang. last-in, fi
ANSI C 0 5 WSKAŹNIKI I TABLICE o specjalną wartość wskaźnikową. Stała NULL jest zdefiniowana w
ANSI C 1 5 WSKAŹNIKI I TABLICE Stałe napisowe chyba najczęściej występują jako argumenty funkcji,
ANSI C 4 5 WSKAŹNIKI I TABLICE #define MAXLEN 1000 /* maks. długość wiersza wejściowego */ int get
ANSI C 5 5 WSKAŹNIKI I TABLICE /* swap: zamień miejscami v[i] i v[j] */ void swap(char *v[], int i
ANSI C 6 5 WSKAŹNIKI I TABLICE_______—- Oprócz tej różnicy w zapisie tablicę dwuwymiarową traktuj
ANSI C 7 5 WSKAŹNIKI I TABLICE oba zapisy a[3][4] i b[31[4] są poprawnymi odwołaniami do pojedyncz
ANSI C 8 5 WSKAŹNIKI I TABLICE ____________— for (i = 1; i < argc; i-H-) printf(,,%s%s”, argv[i
ANSI C 9 5 WSKAŹNIK! I TABLICE ________— A oto program: #include <stdio.h> #include
ANSI C 0 5 WSKAŹNIKI I TABLICE -------- ten program tak, aby najlepiej wykorzystywał dostępną mu p
ANSI C 1 5 WSKAŹNIKI I TABLICE------- if (left >= right) /* nic nie rób, jeśli tablica zawiera
ANSI C 2 5 WSKAŹNIKI I TABLICE _______—— Ćwiczenie 5.16. Dodaj opcję -d (kolejność słownikowa) spr

więcej podobnych podstron