# CMP1 (Front-end) ## 1. Introduction à Tiger ### Définitions - Un **compilateur** est un programme qui convertit un langage source en langage machine cible. - Un **compilateur croisé** est un programme (fonctionnant sur une machine A) qui convertit un langage source en un langage machine cible B (di􏰃érent de A). - Un **transpilateur** est un programme qui convertit une langue source en langue cible (même niveau d'abstraction). - Le **pré-processeur** supprime toutes les de􏰀ne, inclut les directives. Produits de code pur. - Le **Linker** combine un ou plusieurs fichiers objet et éventuellement du code de bibliothèque en un exécutable ou une bibliothèque - Un **Loader** lit le code exécutable dans la mémoire, fait une traduction d'adresse et essaie d'exécuter le programme résultant en un programme en cours d'exécution. - Le **Loader** effectue le chargement du programme et le **Linker** effectue la résolution des symboles; et l'un d'eux peut faire la relocalisation. - **Static/Dynamic** : Compile time / runtime - **GCC** : **cpp** (preprocessor) + **cc1** (actual C compiler) + **as** (assembler) + **ld** (linker) ### Compilateur TC (Tiger) de l'EPITA ![](https://i.imgur.com/3OuHuSZ.png) --- ## 2. Le Scanner et le Parseur ### Flex et Bison - **Flex** : - Analyseur lexical - Génère des scanners - Description sous forme d'expressions régulières - Structure : ``` %{ [definitions] %} %% [rules] %% [subprograms] ``` - Fonctionne avec des expressions régulières et définit des regex ([a-zA-Z], [0-9], ...) - `yytext` le texte reconnu - `yyleng` la taille du texte reconnu - `yylex` démarre le scan - `yywrap` est appelé lorsque à la fin du texte à analyser - Pour chacunes des regexps correspondantes, un token peut être retourné (si oui, Bisou se charge de l'analyser) - **Bison** : - Analyseur syntaxique - Génère le Parseur - Travaille avec le Lexer : lire le token et analyser le flux d'entrée - Structure : ``` [definitions] %% [rules] %% [%% subprograms ] ``` Attention à la **grammaire ambiguë** : l'analyseur ne peut pas choisir ### Coupler Flex et Bison *Objectif : produire un flux de jetons dans le scanner qui sera analysé par l'analyseur* Étapes : 1. Définir le token dans le `parser.yy` en utilisant `%token TOKENNAME` 2. Bison produit un fichier d'en-tête qui doit être inclus dans votre scanner - Le scanner peut désormais voir les token déclarés - Lorsque le scanner correspond à une expression rationnelle, on retourner au token associé dans la règle du Lexer *Remarque: `%token <XXX> TOKENNAME` associe un token à une valeur (ici XXX).*