Vous êtes sur la page 1sur 1

Université Paris 13 CTL Année 2023-24

Institut Galilée Devoir maison INFOA2

On considère le langage K pour lequel on veut faire un compilateur : c’est un sous-ensemble simplifié du
langage C, sans pointeurs / allocation mémoire dynamique / passage par adresse, avec des variables mais
peu de types de données simples ou complexes (p.ex. pas de string, struct, etc), avec des instructions
de conditionnelle et répétition (sans sucre syntaxique comme do..while), les déclarations de variable
/ fonction, et les appels de fonction. La description formelle sera faite au fil des enseignements à venir.
On souhaite reconnaitre un document source écrit en langage K pour générer du code assembleur
correspondant (p.ex. mips, x86-64, pseudo-assembleur). Le travail à faire en autodidacte ne sera pas
noté, il s’agit de définir des fichiers de spécifications lexeur-K.l et parseur-K.y pour flex et bison
(voir document de cours mis sur l’ENT) et un fichier main.c qui ne fait que dire si l’analyse est réussie.
Il n’est pas demandé de générer du code assembleur !
NB : Les actions sémantiques devraient être utilisées pour construire une structure de donnée arbores-
cente en C représentant l’arbre syntaxique abstrait (AST) du document source afin d’en faire une
représentation intermédiaire. Comme cela sera indiqué en cours cette étape ne sera pas faite mais on
générera à la place du code assembleur : en effet les actions sémantiques peuvent être faite pendant
l’analyse syntaxique comme un parcours de l’AST. On utilisera un formalisme adhoc qui permettra la
génération de code.

Fragment -1
valeur : entiers
Pas de variables ni types de donnée, pas d’appels de fonctions, pas de booléens, même pas de main() :
seulement une valeur entière dans le document source. Il s’agit essentiellement de définir une expression
régulière pour les entiers et d’interfacer les trois fichiers flex, bison et main... (pas si simple).

Fragment 0
expressions arithmétiques et booléennes sur les entiers
opérateurs (seulement arithmétiques sur les entiers pour ceux qui n’ont jamais fait de compilation/théorie
des langages)

arithmétiques : + - *
comparaisons : == < <=
logiques : ! && ||

Pas de variables ni types de donnée, pas d’appels de fonctions, pas de booléens, même pas de main() :
seulement une expression arithmétique ou booléenne dans le document source.

Vous aimerez peut-être aussi