Programmazione orientata agli oggetti in ANSI-C. Programmazione Savvy. Information Hiding

Programmazione orientata agli oggetti in ANSI-C. Programmazione Savvy. Information Hiding

Applicando ciò che abbiamo imparato nei paragrafi precedenti, dobbiamo considerare che non renderemo nota all’esterno la struttura di un nodo. Al contrario, però, dobbiamo inserire alcune dichiarazioni nel file header value.h

const void * Add;
...
void * new (const void * type, ...);
void process (const void * tree);
void delete (void * tree);

Ora possiamo codificare sum() come segue:

#include "value.h"
static void * sum (void)
{ void * result = product();
const void * type;
for (;;)
{ switch (token) {
case ’+’:
type = Add;
break;
case ’—’:
type = Sub;
break;
default:
return result;
}
scan(0);
result = new(type, result, product());
}
}

product() la stessa architettura di sum e chiama una funzione per riconoscere numeri, segni e una somma inclusa in parentesi:

static void * sum (void);
static void * factor (void)
{ void * result;
switch (token) {
case ’+’:
scan(0);
return factor();
case ’—’:
scan(0);
return new(Minus, factor());
default:
error("bad factor: ’%c’ 0x%x", token, token);
case NUMBER:
result = new(Value, number);
break;
case ’(’:
scan(0);
result = sum();
if (token != ’)’)
error("expecting )");
}
scan(0);
return result;
}

In particolar modo in factor() dobbiamo essere molto cauti per mantenere lo scanner invariato: token deve sempre contenere il successivo simbolo di input. Non appena token viene “consumato” doppiamo chiamare scan(0)

Leave a Reply