Link alla Repository GitLab: https://gitlab.com/compilatori-a.a.-2021_22/myfun-semancgen-es5_mpp/martone-criscuolo_es5_scg.git
Nota: per la compilazione del file "calcolatrice2.c" e del file "cubo.c" potrebbe essere necessario linkare la libreria math mediante
l'aggiunta del parametro "-lm" al comando "gcc".
Per l'analisi semantica abbiamo adottato le seguenti convenzioni:
- Per
+, -, *, /
viene assunto il tipo di dimensione maggiore (come mostrato anche nella tabella che ci è stata fornita); - L'operatore
&
ammette concatenazioni solo tra stringhe; - Gli operatori di confronto di disuguaglianza (
<, <=, ...
) sono ammessi solo tra interi e real, mentre gli operatori di uguaglianza (=, !=
) sono ammessi anche tra stringhe. Tutti restituiscono un valore di tipo booleano; - Se un parametro è di output, ovvero il suo tipo è
out <type>
, allora quando viene passato come input ad un'altra funzione viene passato come out e non come in, mentre se viene utilizzato in un espressione (o come rval o lval), viene dereferenziato in automatico; - Abbiamo aggiunto il supporto alla ricorsione, tuttavia abbiamo deciso di non renderla disponibile per il main;
- Non permettiamo l'inzializzazione di una variabile con sè stessa o con una variabile definita dopo la suddetta;
- L'IF crea un nuovo scoping nel quale è possibile anche oscurare identificatori già dichiarati (stesso discorso per il WHILE);
- Anche se non vengono dichiarati nuovi identificatori in un determinato livello di scoping, la tabella viene creata lo stesso e lasciata vuota;
- Non è possibile utilizzare una funzione (o una variabile) prima che questa sia dichiarata;
- È previsto il meccanismo di oscuramento delle variabili;
- Non è permesso assegnare ad una variabile il valore di una variabile che offusca, ma solamente in fase di dichiarazione. Questa necessità è dovuta al fatto che il C, in questo caso, non assegna il valore della variabile esterna a quella interna ma la lascia non inizializzata, provocando così comportamenti inattesi.
Per la generazione del codice, abbiamo fatto le seguenti scelte:
- vista la difficoltà nel gestire i puntatori, stringhe e le conversioni verso le stringhe, come intestazione di ogni programma MyFun abbiamo deciso di aggiungere delle funzioni di servizio che ci aiutano nei vari compiti;
- Per la dichiarazione degli identificatori, dal momento che il C non contempla un'istruzione
del tipo
id = id(...)
e visto che permettiamo la dichiarazione di funzioni e variabili con lo stesso identificatore, nella generazione del codice viene effettuata l'aggiunta di un suffisso var oppure fun se si tratta di una variabile o una funzione, rispettivamente; - Quando viene fatta una READ su una lista di variabili (per stringhe leggere punto 4), viene generata una
scanf(...)
diversa per ogni variabile e, se è presente anche l'Expr
finale (stringa da stampare), viene generata prima la rispettivaprintf(...)
e poi il resto; - Per la READ di stringhe, visto che non esistono come tipo in C, abbiamo realizzato una helper function
getln()
che permette la creazione di unchar *
di dimensione dinamica contenente la sequenza di caratteri data in input da tastiera;
Ulteriori type rules utilizzati durante lo sviluppo sono:
- DIVINT, Elevamento a potenza, Uguaglianza e disuguaglianza
op | operando1 | operando2 | risultato |
---|---|---|---|
DIVINT | INTEGER | INTEGER | INTEGER |
POW | INTEGER | INTEGER | INTEGER |
POW | REAL | REAL | REAL |
POW | INTEGER | REAL | REAL |
POW | REAL | INTEGER | REAL |
= | INTEGER | INTEGER | BOOLEAN |
= | INTEGER | REAL | BOOLEAN |
= | REAL | INTEGER | BOOLEAN |
= | REAL | REAL | BOOLEAN |
= | STRING | STRING | BOOLEAN |
= | BOOLEAN | BOOLEAN | BOOLEAN |
!= | INTEGER | INTEGER | BOOLEAN |
!= | INTEGER | REAL | BOOLEAN |
!= | REAL | INTEGER | BOOLEAN |
!= | REAL | REAL | BOOLEAN |
!= | STRING | STRING | BOOLEAN |
!= | BOOLEAN | BOOLEAN | BOOLEAN |
- IF-THEN-ELSE
- Assegnamento con parametri di tipo out
- Read statement
- Write statement