Home
Accesso / Registrazione
 di 

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

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.

 

 

Scrivi un commento all'articolo esprimendo la tua opinione sul tema, chiedendo eventuali spiegazioni e/o approfondimenti e contribuendo allo sviluppo dell'argomento proposto. Verranno accettati solo commenti a tema con l'argomento dell'articolo stesso. Commenti NON a tema dovranno essere necessariamente inseriti nel Forum creando un "nuovo argomento di discussione". Per commentare devi accedere al Blog
ritratto di raf1900

Consiglio

Ciao Tecnoman sono un neofita del linguaggio C avrei bisogno di un consiglio ma non so come scriverti una mail privata, potresti contattarmi alla mia mail? raf1900@libero.it Ciao grazie.

ritratto di TecnoMan

Re: Consiglio

Ciao, ti ho mandato una mail :)

 

 

Login   
 Twitter Facebook LinkedIn Youtube Google RSS

Ultimi Commenti