ANSI C 4

ANSI C 4



5 WSKAŹNIKI I TABLICE


int gettoken (void); int tokentype; char token[MAXTOKEN]; char name[MAXTOKEN]; char datatype[MAXTOKEN]; char out[1000];



/* typ ostatniego leksemu */

/* tekst ostatniego leksemu */

I* nazwa występująca w deklaracji */ /* typ danych: char, int itp. */

/* wyjściowy opis słowny */

main() /*dcl: zamień deklaracje C na opis słowny */

{

while (gettoken () != EOF) { /* pierwszy leksem w wierszu */ strcpy(datatype, token); /* jest typem* danych */ out[0] = ’\0’;

dcl(); /* analiza składniowa reszty wiersza */ if (tokentype != ’\n’)

printffbłąd składniowy\n"); printf(”%s: %s %s\n”, name, out, datatype);

}

return 0;

}

Podczas czytania z wejścia funkcja gettoken najpierw pomija odstępy i znaki tabulacji, a potem buduje kolejny leksem; „leksemem” jest tu nazwa, para nawiasów okrągłych, para nawiasów kwadratowych ewentualnie zawierających liczbę, a także każd) inny pojedynczy znak.

int gettoken(void) /* podaj następny leksem */

{

int c, getch(void);

void ungetch(int);

char *p = token;

while ((c = getch()) == ” || c == ’\t’)

if (c == •(’) (

if ((c = getch()) == ’)■) { strcpy(token,

return tokentype = PARENS;

} else { ungetch(c); return tokentype = ’(’;

}

12 SKOMPLIKOWANE DEKLARACJE___

powered by

Mi siol


} else if (c == '[*) {

for (*p++ = c; (*p-H- = getch()) != ■]■;

*P = ’\0’;

return tokentype = BRACKETS;

} else if (isalpha (c)) {

for (*p-H- = c; isalnum(c = getch());)

*p++ = c;

*P = ’\0’; ungetch(c);

return tokentype = NAME;

} else

return tokentype = c;

}

Funkcje getch i ungetch omówiliśmy w rozdz. 4.

Działanie odwrotne jest łatwiejsze, zwłaszcza jeśli nie przejmujemy się nadmiarowymi nawiasami. Program undcl zamienia opis słowny deklaracji, powiedzmy „X jest funkcją zwracającą wskaźnik do tablicy wskaźników do funkcji zwracających char”, co możemy wyrazić tak:

x() * [] * () char

na deklarację w języku C

char (*(*x ())[])()

Skrócona składnia danych na wejściu pozwala nam ponownie skorzystać z funkcji gettoken. Program undcl używa więc tych samych zmiennych zewnętrznych co dcl.

I* undcl: zamień opis słowny na deklarację */ main()

{

int type;

char temp[MAXTOKEN];

while (gettoken() != EOF) { strcpyfout, token); while ((type = gettoken()) 1= ’\n’)

if (type == PARENS 11 type == BRACKETS) strcat(out, token); else if (type == ’*’) {

sprintf(temp, "(*%s)", out); strcpy(out, temp);

171


Wyszukiwarka

Podobne podstrony:
ANSI C 4 5 WSKAŹNIKI I TABLICE #define MAXLEN 1000 /* maks. długość wiersza wejściowego */ int get
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 /* swap: zamień miejscami v[i] i v[j] */ void swap(char *v[], int i
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 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 2 5 WSKAŹNIKI I TABLICE _______^ operator przyrostkowy ++ nie zmieni t, dopóki nie zostanie
ANSI C 3 5 WSKAŹNIKI I TABLICE możliwości są zawarte w funkcjach: getline (rozdz. 1 i 4), atoi, it
ANSI C 6 5 WSKAŹNIKI I TABLICE_______—- Oprócz tej różnicy w zapisie tablicę dwuwymiarową traktuj
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