Théorie des langages et compilation - M1 Info

Transcription

Théorie des langages et compilation - M1 Info
Théorie des langages et compilation
M1 Info
Projet
Conversion d'un programme Pascal en C
L'objectif de ce projet est de créer en binôme un programme qui convertit un programme Pascal en un programme C. Votre programme doit procéder en deux étapes successives :
1.
Reconnaissance du programme Pascal (vérification de la syntaxe et de la sémantique)
2.
Traduction du programme Pascal en C (uniquement si l'étape 1 a réussi)
Certaines notions de Pascal étant relativement complexes, il ne vous sera demandé que de gérer une sous­partie du langage, qui se limite aux structures élémentaires.
Reconnaissance du programme Pascal
Pour analyser un programme Pascal, vous devrez créer un analyseur lexical, codé pour lex. Celui­ci devra être capable d'identifier les mots­clés utilisés en Pascal, les valeurs littérales ainsi que les identifiants. Les identifiants représentent les noms des variables, procédures et fonctions. Ces identifiants devront être passés à un analyseur grammatical qui les stockera ensuite dans une table de symboles. Si un lexème n'est pas reconnu (caractère non autorisé ou bien chaîne de caractères invalide), une erreur doit s'afficher indiquant la ligne où se trouve le lexème en question. Les commentaires non fermés doivent également renvoyer une erreur.
Les lexèmes reconnus par le lexeur devront ensuite être manipulés par un analyseur grammatical, codé pour yacc. Celui­ci devra décrire la grammaire du langage Pascal. L'analyseur doit donc être capable de dire si le programme Pascal est correctement formé ou non, syntaxiquement et sémantiquement. Si ce n'est pas le cas, un ou plusieurs messages d'erreur devront s'afficher indiquant le type de chaque erreur ainsi que le numéro de la ligne où l'erreur s'est produite. À chaque utilisation de variable, procédure ou fonction, on devra s'assurer que les types correspondent bien. Si ce n'est pas le cas, une erreur devra s'afficher indiquant le nom du symbole correspondant ainsi que les lignes d'utilisation et de déclaration de ce symbole. Vous utiliserez pour cela une table de symboles contenant toutes les informations nécessaires. Attention : vos symboles ont différentes portées ; ainsi, les variables déclarées en dehors de tout sous­programme (procédure ou fonction) sont globales tandis que celles déclarées à l'intérieur d'un sous­programme sont uniquement locales à ce sous­programme. Si une variable globale et une variable locale ont le même nom, c'est la variable locale qui doit être manipulée à chaque appel dans le corps du sous­programme. Notez également qu'en Pascal, on retourne la valeur d'une fonction en affectant cette valeur à une variable locale portant le même nom que la fonction.
Traduction du programme Pascal en C
Si le programme Pascal a été correctement reconnu et ne contient aucune erreur sémantique, il faut le traduire en un programme C. Pour effectuer cette opération, vous pouvez construire un arbre ou bien concaténer des chaînes de caractères depuis l'analyseur grammatical. Voici un exemple de programme Pascal :
PROGRAM prog;
{ function f }
FUNCTION f(x:INTEGER):INTEGER;
VAR i:INTEGER;
BEGIN
i := 0;
f := 0;
WHILE i < x DO
BEGIN
IF i MOD 2 = 0 THEN
f := f + i;
END;
END;
{ main program }
VAR x:INTEGER;
BEGIN
READLN(x);
WRITELN(f(x));
END.
Voici un exemple de ce que pourrait donner la conversion de ce programme en C :
M1 Info – Théorie des langages
Projet
1/2
#include <stdio.h>
int f(int x)
{
int f;
int i;
while (i < x)
{
if (i % 2 == 0)
f = f + i;
}
return f;
}
int main(int argc,char* argv[])
{
int x;
fscanf("%d\n",&x);
printf("%d\n",f(x));
return EXIT_SUCESS;
}
Pour que vous puissiez concentrer vos efforts sur la réalisation de l'analyseur ainsi que sur le convertisseur Pascal → C, seule la gestion d'une sous­partie du langage Pascal vous est demandée. Vous devrez être capable de gérer :
•
les variables (déclaration et utilisation dont le type est limité aux entiers, réels et booléens) ;
•
les opérateurs de base (+, ­, *, /, DIV, MOD, <, <=, >, >=, =, <>, …)
•
l'affectation de valeurs à des variables ;
•
les conditionnelles IF – THEN et IF – THEN – ELSE ;
•
la boucle WHILE ;
•
les fonction d'entée/sortie READLN et WRITELN, limitées à un seul argument ;
•
les chaînes de caractères, uniquement en argument de WRITELN (attention à l'échappement des guillemets) ;
•
les procédures et les fonctions dont l'appel doit être nécessairement parenthésé ;
•
les commentaires, que vous devrez tout simplement ignorer.
Une bonne lisibilité du code C généré serait souhaitée (sauts de ligne, tabulations…). Le fichier C généré doit pouvoir être compilé sans erreur et avoir le même comportement que le programme Pascal compilé.
Vous êtes tout à fait libre d'étendre ce langage pour gérer des structures plus complexes (gestion des constantes, des chaînes de caractères, des tableaux, des boucles FOR, de la déclaration de types non primitifs, des pointeurs, des fonctions récursives, …). Vous pouvez également chercher à préserver les commentaires ou bien la structure globale du fichier, avec les sauts de ligne et tabulations.
Remise du projet
Le travail est à effectuer par binôme. Vous devrez rendre le projet pour le dimanche 20/04/2014 à 23:59 par mail, dans une archive portant le nom binôme1_binôme2.tar.gz à l'adresse [email protected]­
angers.fr, avec pour sujet « Projet Théorie des langages – [Binôme1, Binôme2] ».
Votre code devra être correctement présenté et structuré (commentaires, découpage en plusieurs fichiers). Vous joindrez à vos fichiers source un rapport de quelques pages décrivant l'organisation de votre projet (ce que représente chacun des fichiers), le travail qu'a effectué chacun des membres du binôme, les difficultés que vous avez rencontrées, les améliorations possibles que vous voyez pour votre programme et comment les intégrer. Vous fournirez également des instructions permettant de compiler le programme ainsi qu'un jeu de test sous la forme de fichiers Pascal. Fournissez des fichiers de tests sur lesquels votre programme fonctionne ainsi que des fichiers sur lesquels il ne fonctionne pas. Ceci permet de vérifier facilement que vous gérez bien les différents cas d'erreur. Indiquez si possible le type d'erreur que doivent provoquer de tels fichiers (erreur de syntaxe, erreur de typage…). Il est conseillé de créer ces fichiers avant même de commencer à coder votre programme.
Si vous avez des questions, vous pouvez me les poser par mail ou dans mon bureau (H211).
M1 Info – Théorie des langages
Projet
2/2