aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/rapport.md80
1 files changed, 47 insertions, 33 deletions
diff --git a/doc/rapport.md b/doc/rapport.md
index 35b23fe..906d3ec 100644
--- a/doc/rapport.md
+++ b/doc/rapport.md
@@ -1,33 +1,37 @@
1--- 1---
2title: "UPEM / Compilation / Projet" 2title: "UPEM / Compilation / Projet / Rapport"
3author: [Pacien TRAN-GIRARD, Adam NAILI] 3author: [Pacien TRAN-GIRARD, Adam NAILI]
4date: 2018-02-20 4date: 2018-02-20
5... 5...
6 6
7#Rapport 7# Analyse lexicale
8 8
9##Analyse lexicale
10L'analyse lexicale est réalisée avec Flex et est contenue dans le fichier `tpc.lex`. 9L'analyse lexicale est réalisée avec Flex et est contenue dans le fichier `tpc.lex`.
11*Les lexèmes ont été définis au sein de ce fichier:* 10
12 11## Lexèmes
13| Symbole | Description | Token associé | 12
14|:-----------------:|:-----------------------------------------------:|:-------------:| 13Les lexèmes ont été définis au sein de ce fichier :
15| = | opérateur d'affectation | | 14
16| + | opérateur d'addition | ADDSUB | 15| Symbole | Description | Token associé |
17| - | opérateur de soustraction ou moins unaire | ADDSUB | 16|:------------------------------:|:----------------------------------------------:|:-------------:|
18| * | multiplication | DIVSTAR | 17| `=` | opérateur d'affectation | |
19| / et % | division et reste de la division entière | DIVSTAR | 18| `+` | opérateur d'addition | `ADDSUB` |
20| ! | négation booléenne | | 19| `-` | opérateur de soustraction ou moins unaire | `ADDSUB` |
21| ==, != | opérateur de comparaison | EQ | 20| `*` | multiplication | `DIVSTAR` |
22| <,>,<=,>= | opérateur de comparaison | ORDER | 21| `/` et `%` | division et reste de la division entière | `DIVSTAR` |
23| && | opérateur booléen | AND | 22| `!` | négation booléenne | |
24| || | opérateur booléen | OR | 23| `==`, `!=` | opérateur de comparaison | `EQ` |
25| ; et , | le point virgule et la virgule | | 24| `<`, `>`, `<=` ,`>=` | opérateur de comparaison | `ORDER` |
26| (, ), {, } [ et ] | les parenthèses, les accolades et les crochets | | 25| `&&` | opérateur booléen | `AND` |
27 26| `||` | opérateur booléen | `OR` |
28- Certains symboles ne sont pas associés à des tokens. En effet ils sont utilisés directement dans la grammaire, entourés de simple guillemets. (par exemple `'='`) 27| `;` et `,` | le point virgule et la virgule | |
29 28| `(`, `)`, `{`, `}`, `[` et `]` | les parenthèses, les accolades et les crochets | |
30- Les identificateurs sont constitués d'au moins une lettre, puis éventuellement de chiffres, et/ou d'"underscore" (`_`). Ils sont identifiés par le token `IDENT` 29
30- Certains symboles ne sont pas associés à des tokens.
31 En effet ils sont utilisés directement dans la grammaire, entourés de simple guillemets. (par exemple `'='`)
32
33- Les identificateurs sont constitués d'au moins une lettre, puis éventuellement de chiffres, et/ou d'"underscore" (`_`).
34 Ils sont identifiés par le token `IDENT`
31 35
32- Gestion de la casse 36- Gestion de la casse
33 37
@@ -37,13 +41,17 @@ L'analyse lexicale est réalisée avec Flex et est contenue dans le fichier `tpc
37 41
38- Les commentaires sont délimités par `/*` et `*/` et ne peuvent pas être imbriqués. 42- Les commentaires sont délimités par `/*` et `*/` et ne peuvent pas être imbriqués.
39 43
40- `print`,`reade` et `readc` sont des identificateurs qui appartiennent au langage tpc, ils ne doivent pas être utilisé pour déclarer des variables. Nous avons donc créer des tokens spécifiques pour leur gestion dans la grammaire (respectivement les tokens `PRINT`, `READE` et`READC`) 44- `print`,`reade` et `readc` sont des identificateurs qui appartiennent au langage tpc, ils ne doivent pas être utilisé pour déclarer des variables.
45 Nous avons donc créer des tokens spécifiques pour leur gestion dans la grammaire (respectivement les tokens `PRINT`, `READE` et`READC`)
46
41 47
42##Analyse syntaxique 48# Analyse syntaxique
43 49
44La grammaire est celle fournie sur la plateforme elearning. 50La grammaire est celle fournie sur la plateforme elearning.
45 51
46- Cette grammaire génère un conflit empiler/réduire pour la règle 52## Résolution des conflits
53
54Cette grammaire génère un conflit empiler/réduire pour la règle
47 55
48```yacc 56```yacc
49Instr : IF '('Exp')' Instr 57Instr : IF '('Exp')' Instr
@@ -56,11 +64,12 @@ Par exemple :
56IF '('Exp')' IF '('Exp')' Instr ELSE Instr 64IF '('Exp')' IF '('Exp')' Instr ELSE Instr
57``` 65```
58 66
59*Faut il empiler `ELSE` ? Ou réduire `IF '('Exp')' Instr` ?* 67Faut il empiler `ELSE` ? Ou réduire `IF '('Exp')' Instr` ?
60Pour résoudre le conflit, il faut gérer les `precedences`. 68Pour résoudre le conflit, il faut gérer les `precedences`.
61Nous avons choisi de rentre le `ELSE` plus précédant que `')'` qui est le dernier terminal. Ainsi, Bison va choisir d'empiler en priorité. 69Nous avons choisi de rentre le `ELSE` plus précédant que `')'` qui est le dernier terminal.
70Ainsi, Bison va choisir d'empiler en priorité.
62 71
63- Un autre conflit existe, sur l'associativité de `,`: 72Un autre conflit existe, sur l'associativité de `,`:
64 73
65```yacc 74```yacc
66ListExp : ListExp ',' Exp 75ListExp : ListExp ',' Exp
@@ -68,6 +77,7 @@ ListExp : ListExp ',' Exp
68``` 77```
69 78
70Par exemple : 79Par exemple :
80
71``` 81```
72ListExp ',' ListExp ',' ListExp 82ListExp ',' ListExp ',' ListExp
73``` 83```
@@ -77,11 +87,15 @@ Dans les langages tel que le C, l'associativité se fait à gauche.
77On déclare donc `%left ,` pour l'indiquer à Bison. 87On déclare donc `%left ,` pour l'indiquer à Bison.
78 88
79 89
80##Améliorations enviseageables 90# Améliorations enviseageables
81 91
82- Récupération sur erreur 92## Récupération sur erreur
83Nous pourrions envisager de parser entièrement le fichier et de ne pas s'arrêter dès la première erreur de syntaxe comme le fait gcc. Il est possible de réaliser ceci en modifiant le code de yyerror() par exemple. 93
94Nous pourrions envisager de parser entièrement le fichier et de ne pas s'arrêter dès la première erreur de syntaxe comme le fait `gcc`.
95Il est possible de réaliser ceci en modifiant le code de `yyerror()` par exemple.
96
97## Numérotation des lignes
84 98
85- Numérotation des lignes
86En complément de la précédente amélioration, nous pourrions imaginer donner les lignes dans le message d'erreur de syntaxe. 99En complément de la précédente amélioration, nous pourrions imaginer donner les lignes dans le message d'erreur de syntaxe.
87Il suffit de maintenir une variable globale incrémentée à chaque saut de ligne `\n` 100Il suffit de maintenir une variable globale incrémentée à chaque saut de ligne `\n`
101