# 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 dene, 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

---
## 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).*