Traducteur Pasada vers C
Introduction
Ecrire un compilateur du langage Pasada qui produit un programme C.
pasada (Pascal-Ada), dans le langage C. Le compilateur sera lui-même écrit en
C++. Il est donc de la forme : (pasada,C++,C).
Description du langage pasada
Caractéristiques
- Pas de compilation séparée. Un programme pasada est entièrement localisé dans un fichier d'extension .pa.
- C'est un langage très fortement typé. Toutes les conversions de types doivent être explicites. Il existe 4 types : int, bool, string, float.
- Un programme pasada utilise un certain nombre de procédures. Chaque procédure déclare un certain nombre de variables locales, puis définit les instructions qui la réalisent. Chaque procédure possède un certain nombre de paramètres typés qui peuvent être soit d'entrée (in : lisibles mais non modifiables), soit de sortie (out : résultats), soit d'entrée/sortie (inout : lisibles et modifiables).
- Le point d'entrée du programme, déclare un certain nombre de variables globales, puis définit les instructions.
- Les entrées/sorties sont très basiques : lecture au clavier et écriture à l'écran d'une variable typée.
- Il n'y a pas de problèmes de références en avant : on peut utiliser une procédure avant qu'elle n'apparaisse dans le fichier.
- Il n'y a pas de surcharge de procédures : chaque procédure a un nom différent. Il n'y a pas de conflit de noms de variables : dans une proc, s'il y a conflit sur le nom local/global, c'est la variable locale qui est prioritaire.
- Les structures de contrôle sont : if then else, if then, while begin end, repeat until.
- Les opérateurs sont à la pascal : égal (=), différent ($<>$), et (and) évaluation complète, non (not), affectation (:=), ...
Exemple
/* les commentaires à la C et à la C++ sont possibles */
procedure fact(in int n, out int r) // factorielle : 2 paramètres
int j; // variable locale à fact()
begin // début du corps de procédure
if n=0 // pas de parenthèse autour d'une condition
then r:=1; // affectation du résultat
else
begin // bloc d'instructions
fact(n-1,j); // appel récursif à fact
r:=n*j; // affectation du résultat
end // fin de bloc
return; // retour à l'appelant
end // fin de procédure
program // point d'entrée du programme
int i,j; // variable globale
begin // bloc d'instructions du programme
writeString("Veuillez entrer un entier SVP : "); // affichage
readInt(i); // proc prédéfinie : readInt(out int i)
writeString("Voici le résultat de factorielle() : ");
fact(i,j); // calcul
writeInt(j); // proc prédéfinie : writeInt(in int i)
end
\end{verbatim}
Développement du compilateur
Le compilateur pac (pasada compiler), sera développé en lex, yacc, C++.
- Ecrire la grammaire du langage pasada. N'oubliez pas les procédures prédéfinies telles que les conversions, la taille d'une chaîne, les entrées/sorties, \ldots
- Ecrire un analyseur lex/yacc qui réalise uniquement la vérification syntaxiquesans génération de code.
- Ecrire un compilateur en utilisant les structures de données adéquates : arbres abstraits, table des symboles, \ldots
- Améliorer le langage pasada en ajoutant la notion de tableau statique. Un tableau est toujours déclaré avec sa taille : \verb_int tab[10];_. Lestableaux sont indicés de 1 à n. Dans une procédure, un paramètre tableau est déclaré sans sa taille : \verb_inout int tableau[];_. Dans ce cas, l'opérateur prédéfini \verb_|tableau|_ renvoie la taille (int) du tableau.
- Améliorer le langage pasada en ajoutant la notion de structure C.