Programmazione orientata agli oggetti in ANSI-C. Implementazione della sottoclasse – Var

screen() chiama new() per creare un nuovo simbolo variabile e lo restituisce al riconoscitore che provvede ad inserirlo nell'albero delle espressioni. Di conseguenza, Var deve creare le entries nella tabella dei simboli che possono comportarsi come nodi, ossia quando definiremo struct Var dovremo estendere una struct Name per ereditare l'abilità di vivere in una tabella dei simboli e per supportare le funzioni linkate dinamicamente che sono applicabili ai nodi delle espressioni. Descriviamo l'interfaccia in Var.h.
const void * Var;
const void * Assign;

Una variabile ha un nome e un valore. Se valutiamo un'espressione aritmetica, dobbia ritornare il componente .value . Se cancelliamo un'espressione, non dobbiamo però cancellare il nodo della variabile perchè esso continua a vivere nella tabella dei simboli.

struct Var { struct Name _; double value; };
#define value(tree) (((struct Var *) tree) —> value)
static double doVar (const void * tree)
{
return value(tree);
}
static void freeVar (void * tree)
{
}

Come chiarito nel paragrafo 4.6 il codice è semplificato per fornire una funzione di accesso per il valore.

Creare una variabile richiede l'allocazione di una struct Var, l'inserimento di una copia dinamica del nome della variabile:

static void * mkVar (va_list ap)
{ struct Var * node = calloc(1, sizeof(struct Var));
const char * name = va_arg(ap, const char *);
size_t len = strlen(name);
assert(node);
node —> _.name = malloc(len+1);
assert(node —> _.name);
strcpy((void *) node —> _.name, name);
node —> _.token = VAR;
return node;
}
static struct Type _Var = { mkVar, doVar, freeVar };
const void * Var = & _Var;

new() si occupa di inserire la descrizione di tipo Var all'interno del nodo prima di restituire il simbolo a screen() o a qualsiasi funzione/elemento/struttura che voglia utilizzarlo.

Tecnicamente, mkVar() è il costruttore per Name. Comunque, solo i nomi delle variabili devono essere memorizzati dinamicamente. Poiché decidiamo che nel nostro calcolatore il costruttore è responsabile dell'allocazione di un oggetto, non possiamo permettere che il costruttore di Var chiami il costruttore di Name per mantenere i componenti .name e .token – un costruttore di Name allocherebbe una struct Name piuttosto che una struct Var.

Scarica subito una copia gratis

2 Commenti

  1. Avatar photo raf1900 24 Maggio 2010
  2. Avatar photo TecnoMan 25 Maggio 2010

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend