main() { /*leggere e memorizzare le costanti; leggere e memorizzare le definizioni di funzioni; leggere e valutare le espressioni; */ }
void Elabora_Costanti(MEMORIA * m) /*legge e memorizza le costanti*/ { A_Capo_Lettura(); /*salta @const NL */ while(Look_Char() != '@') Elabora_Costante(m); } void Elabora_Costante(MEMORIA *m) { IDENT id; REALE_ENORME re; Salta_Blanks(); id = Leggi_Ident(); Salta('='); Salta_Blanks(); re = Leggi_Reale_Enorme(); A_Capo_Lettura(); * m = Modifica(id,re,&m); }
void Elabora_Funzioni(void) /*legge e memorizza le definizioni di funzioni*/ { A_Capo_Lettura(); /*salta @funz NL */ while(Look_Char() != '@') Elabora_Funzione(); } void Elabora_Funzione(void) { IDENT funz, par_for; ESPRESSIONE corpo; Salta_Blanks(); funz = Leggi_Ident(); Salta('('); Salta_Blanks(); par_for = Leggi_Ident(); Salta(')'); Salta('='); Salta_Blanks(); corpo = Leggi_Espressione(); A_Capo_Lettura(); Aggiungi_Funzione(funz,par_for,corpo); }
void Elabora_Espressioni(void) /*legge e valuta le espressioni*/ { A_Capo_Lettura(); /*salta @valuta NL */ while(Look_Char() != '@') Elabora_Espressione(); } void Elabora_Espressione(void) { REALE_ENORME re; ESPRESSIONE esp; esp = Leggi_Espressione(); A_Capo_Lettura(); re = Valuta(esp, Valori_Costanti); Stampa_Reale_Enorme(re); A_Capo_Stampa(); }
REALE_ENORME Valuta(ESPRESSIONE esp, MEMORIA m) /*valuta l'espressione esp utilizzando la memoria m*/ { if(E_Valore(esp)) return Valore(esp); else if(E_Identificatore(esp))/*una costante o il parametro di una funzione*/ return Valore_Di(Ident(esp),m); else if(E_Applicazione(esp)){ REALE_ENORME re1 = Valuta(Primo_Arg(esp),m); REALE_ENORME re2 = Valuta(Secondo_Arg(esp),m); return Applica(Operatore(esp),re1,re2); } else if(E_Chiamata_Funzione(esp)){ REALE_ENORME re = Valuta(Parametro_Attuale(esp),m); return Valuta(Corpo(Funzione(esp)), Modifica(Parametro_Formale(Funzione(esp)),re,m)); } } REALE_ENORME Applica(char oper, REALE_ENORME re1, REALE_ENORME re2) /*applica l'operatore oper ad re1 e re2*/ { if(oper == '+') return Somma(re1,re2); else if(oper == '-') return Differenza(re1,re2); else if(oper == '*') return Prodotto(re1,re2); else printf("Errore: %c non puo\' essere un operatore\n",oper); }