Sviluppo di AMBIENTE

Progettiamo una stuttura dati per gli ambienti, cioè le associazioni tra nomi di funzioni (identificatori) e loro parametro formale (un identificatore) e corpo (un'espressione).
Decidiamo di realizzare una struttura dati dinamica schematicamente presentata di seguito.

La corrispondente dichiarazione di tipo C è
typedef struct AMB * AMBIENTE;
struct AMB{ IDENT Funzione;
            IDENT Parametro_Formale;
            ESPRESSIONE Corpo;
            AMBIENTE Next;
           };
Il modulo contiene una variabile globale Funzioni in cui verrà contenuto l'ambiente delle funzioni corrente, e tale variabile è completamente incapsulata all'interno del modulo. Questa soluzione è ragionevole poichè all'interno del programma occorre utilizzare una sola variabile di tipo AMBIENTE, diversamente da MEMORIA.
AMBIENTE Funzioni = NULL;
/*variabile globale che contiene le definizioni delle funzioni*/
Sviluppiamo ora le varie funzioni che appaiono nell'interfaccia del modulo.
Modifica dell'ambiente
void Aggiungi_Funzione(IDENT funz, IDENT param, ESPRESSIONE cor)
/*aggiunge a Funzioni la definizione della funzione funz con 
parametro formale param e corpo cor*/
{
    AMBIENTE  Funzioni1 = (AMBIENTE)malloc(sizeof(struct AMB));
    
    Funzioni1 -> Corpo = cor;
    Copia_Ident(Funzioni1 -> Funzione,funz);
    Copia_Ident(Funzioni1 -> Parametro_Formale,param);
    Funzioni1 -> Next = Funzioni;
    Funzioni = Funzioni1;         
}
Recupero del parametro formale di una funzione
void Parametro_Formale(IDENT funz, IDENT par)
/*ritorna il parametro formale della funzione funz come registrato in Funzioni,
nel parametro variabile par,
si assume che ci sia sempre una definizione per funz in Funzioni */
{
    AMBIENTE Funzioni1 = Funzioni;
    
    while(Funzioni1 != NULL)
        if(Uguali_Ident(Funzioni1 -> Funzione,funz)){
            Copia_Ident(par, Funzioni1 -> Parametro_Formale);
            return;
        }
        else 
            Funzioni1 = Funzioni1 -> Next;         
}
Recupero del corpo di una funzione
ESPRESSIONE Corpo(IDENT funz)
/*ritorna il corpo della funzione funz come registrato in Funzioni,
 si assume che ci sia sempre una definizione per funz in Funzioni */
{
    AMBIENTE Funzioni1 = Funzioni;
    
    while(Funzioni1 != NULL)
        if(Uguali_Ident(Funzioni1 -> Funzione,funz))
            return Funzioni1 -> Corpo;
        else 
            Funzioni1 = Funzioni1 -> Next;         
}
A questo punto abbiamo sviluppato due file che faranno parte del programma, l'interfaccia e il body di questo modulo: AMBIENTE.h e AMBIENTE.c.