Introduction

Ecrire un compilateur du langage Pasada qui produit un programme C.

L'objectif à réaliser est un compilateur traduisant des programmes écrits en
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++.

  1. 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
  2. Ecrire un analyseur lex/yacc qui réalise uniquement la vérification syntaxiquesans génération de code.
  3. Ecrire un compilateur en utilisant les structures de données adéquates : arbres abstraits, table des symboles, \ldots
  4.  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.
  5. Améliorer le langage pasada en ajoutant la notion de structure C.
Modifié le: jeudi 17 janvier 2019, 13:42