Académique Documents
Professionnel Documents
Culture Documents
Cours compilation
1
Licence 3 Cours compilation Chapitre 3
3.1. Introduction
Tout langage de programmation possède des règles qui indiquent si un programme est
bien formé.
L’analyseur syntaxique reçoit une suite d’unités lexicales de la part de l’analyseur lexical,
et doit vérifier que cette suite peut être engendrée par une grammaire du langage.
Le problème est donc :
- Étant donné une grammaire G ;
- Étant donné un mot m (programme) ;
Est-ce que le mot (m) appartient au langage généré par G.
3.2. Principe
Le principe est d’essayer de construire un arbre de dérivation. Les grammaires les plus
adaptées à l’analyse syntaxique sont les grammaires de type 2 (non contextuelle).
Analyseur syntaxique
2
Licence 3 Cours compilation Chapitre 3
Exemple :
𝑆 → 𝑎𝑆⁄𝑏 /𝐴𝑐
𝐺1 = {
𝐴 → 𝐴𝑎⁄𝑐
3
Licence 3 Cours compilation Chapitre 3
𝑆 → 𝑎𝑆⁄𝑏 /𝐴𝑐
𝐺1 = { 𝐴 → 𝑐 ⁄𝑐𝐴′
𝐴′ → 𝑎⁄𝑎𝐴′
𝐴 → 𝐵𝛼1 ⁄𝛽1
{
𝐵 → 𝐴𝛼2 ⁄𝛽2
Pour transformer une grammaire récursive à gauche directe indirecte, on utilise la
« substitution ».
𝐴 → 𝐵𝛼1 ⁄𝛽1
On a {
𝐵 → 𝐴𝛼2 ⁄𝛽2
On substitue B dans A, ce qui donne : 𝐴 → 𝐴𝛼2 𝛼1 ⁄𝛽2 𝛼1 /𝛽1
On substitue A dans B, ce qui donne : 𝐵 → 𝐵𝛼1 𝛼2 ⁄𝛽1 𝛼2 /𝛽2
La grammaire après substitution :
𝐴 → 𝐴𝛼2 𝛼1 ⁄𝛽2 𝛼1 /𝛽1
{
𝐵 → 𝐵𝛼1 𝛼2 ⁄𝛽1 𝛼2 /𝛽2
4
Licence 3 Cours compilation Chapitre 3
𝐴 → 𝛼𝐵/𝛾/𝛽
{
𝐵 → 𝑥/𝑦/𝑧
Exemple :
𝑆 → 𝑎𝑆/𝑏𝐴
𝑆 → 𝑎𝑆/𝑏𝐴
𝐺2 = { ⇔ 𝐺 ′ = {𝐴 → 𝑎𝐵/𝑐
𝐴 → 𝑎𝑏/𝑎𝐴/𝑐
𝐵 → 𝑏/𝐴
3.4. Grammaire 𝜺 − 𝑳𝒊𝒃𝒓𝒆
Une grammaire est 𝜺 − 𝒍𝒊𝒃𝒓𝒆 si et seulement si :
Il n’existe pas dans P des productions de la forme : 𝐴 → 𝜀 ou bien 𝑆 → 𝜀 (Axiome), et il
n’existe pas de membre droit de production de la forme 𝐴 → 𝜀 pour 𝐴 ≠ 𝑆.
Une grammaire peut être transformée en une grammaire équivalente.
Exemple :
𝑆 → 𝑎/𝐴 𝑆 → 𝑎/𝐴
𝐺3 = { 𝐴 → 𝐴𝐵/𝜀 ⇔ {𝐴 → 𝐴𝐵/𝐵
𝐵 → 𝑎𝐴𝑏𝐵/𝑏 𝐵 → 𝑎𝐴𝑏𝐵/𝑏/𝑎𝑏𝐵
3.5. Conditions d’analyse syntaxique ascendante
Afin de réaliser l’analyse syntaxique ascendante, il faut que la grammaire soit de type 2,
soit non ambiguë.
5
Licence 3 Cours compilation Chapitre 3
Une grammaire est ambiguë, s’il existe une séquence de symboles terminaux qui admet plusieurs
dérivations.
Exemple
Soit 𝐺 = {𝐸 → 𝐸 + 𝐸/𝐸 ∗ 𝐸/𝑖𝑑}
La grammaire G est ambiguë, car la séquence (id + id*id) admet deux arbres de dérivation
distincte.
E
E
E * E
E + E
ou
E + E id
id E * E
id id id id
6
Licence 3 Cours compilation Chapitre 3
Exemple :
Soit la grammaire 𝐺2 suivante :
7
Licence 3 Cours compilation Chapitre 3
Remarque
1. Cette technique n’est pas efficace, car elle nécessite l’examinassions de plusieurs
arbres de dérivation en parallèle, ce qui est couteux en temps et en espace mémoire.
2. Pour appliquer cette méthode, il faut que la grammaire soit non récursive à gauche.
8
Licence 3 Cours compilation Chapitre 3
(𝐴𝑣𝑎𝑛𝑐𝑒𝑟) 𝑏𝑒𝑔𝑖𝑛 (2,1,1,2) < 𝐿𝐷 > (𝐴𝑣𝑎𝑛𝑐𝑒𝑟) ; (3,1,2,4) < 𝐿𝐼 > (𝐴𝑣𝑎𝑛𝑐𝑒𝑟)𝑒𝑛𝑑
3 𝑅𝑒𝑡𝑟𝑜𝑢𝑟
𝐴𝑟𝑟𝑖è𝑟𝑒 4 𝑅𝑒𝑡𝑟𝑜𝑢𝑟
𝐴𝑟𝑟𝑖è𝑟𝑒 𝐴𝑟𝑟𝑖è𝑟𝑒
𝐴𝑟𝑟𝑖è𝑟𝑒
(𝐴𝑣𝑎𝑛𝑐𝑒𝑟) 𝑑 (𝐴𝑣𝑎𝑛𝑐𝑒𝑟) ; (2,1,2,4) < 𝐿𝐷 >
(𝐴𝑣𝑎𝑛𝑐𝑒𝑟)𝑖 (𝐸𝑐ℎ𝑒𝑐) ; < 𝐿𝐼 >
1 𝑅𝑒𝑡𝑟𝑜𝑢𝑟
𝐴𝑟𝑟𝑖è𝑟𝑒 (3,2,2,4)
𝐴𝑟𝑟𝑖è𝑟𝑒
𝐸𝑐ℎ𝑒𝑐 𝑑 ; < 𝐿𝐷 >
2 𝑅𝑒𝑡𝑟𝑜𝑢𝑟
(𝐸𝑐ℎ𝑒𝑐)𝑑
(2,2,2,2)
(𝐴𝑣𝑎𝑛𝑐𝑒𝑟)𝑑
9
Licence 3 Cours compilation Chapitre 3
Table d’analyse
𝑆 → 𝑎𝐴𝑏/𝜀
𝐺5 = {
𝐴 → 𝑎𝐴/𝑎𝑏
Réaliser un analyseur syntaxique avec la méthode décente récursive.
Pour réaliser l’analyse syntaxique, on ajoute une nouvelle règle𝑍 → 𝑆#, tel que 𝑍 est
le nouvel axiome et # est le symbole spécial représentant la fin de la chaine à analyser.
10
Licence 3 Cours compilation Chapitre 3
𝑷𝒓𝒐𝒄𝒆𝒅𝒖𝒓𝒆 𝑍( )
𝑫𝒆𝒃𝒖𝒕
𝑆( )
𝒔𝒊 (𝑡𝑐 = ′#′) 𝐴𝑙𝑜𝑟𝑠
𝑐ℎ𝑎𝑖𝑛𝑒 𝑎𝑐𝑐𝑒𝑝𝑡é𝑒
𝒔𝒊𝒏𝒐𝒏
𝐸𝑟𝑟𝑒𝑢𝑟
𝒇𝒊𝒏𝑺𝒊;
𝒇𝒊𝒏.
𝑷𝒓𝒐𝒄𝒆𝒅𝒖𝒓𝒆 𝑆( )
𝑫𝒆𝒃𝒖𝒕
𝒔𝒊 (𝑡𝑐 = ′𝑎′) 𝐴𝑙𝑜𝑟𝑠
𝑡𝑐 ← 𝑡𝑠;
𝐴();
𝒔𝒊 (𝑡𝑐 = ′𝑎′) 𝐴𝑙𝑜𝑟𝑠
𝑡𝑐 ← 𝑡𝑠
𝒔𝒊𝒏𝒐𝒏
𝐸𝑟𝑟𝑒𝑢𝑟
𝒇𝒊𝒏𝑺𝒊;
𝒇𝒊𝒏𝑺𝒊;
𝒇𝒊𝒏.
𝑷𝒓𝒐𝒄𝒆𝒅𝒖𝒓𝒆 𝐴( )
𝑫𝒆𝒃𝒖𝒕
𝒔𝒊 (𝑡𝑐 = ′𝑐′) 𝐴𝑙𝑜𝑟𝑠
𝑡𝑐 ← 𝑡𝑠 ;
𝐴( );
Sinon 𝒔𝒊 (𝑡𝑐 = ′𝑎′) 𝐴𝑙𝑜𝑟𝑠
𝑡𝑐 ← 𝑡𝑠
𝒔𝒊 (𝑡𝑐 = ′𝑏′) 𝐴𝑙𝑜𝑟𝑠
𝑡𝑐 ← 𝑡𝑠
𝒔𝒊𝒏𝒐𝒏
𝐸𝑟𝑟𝑒𝑢𝑟
𝒔𝒊𝒏𝒐𝒏
𝐸𝑟𝑟𝑒𝑢𝑟
𝒇𝒊𝒏𝑺𝒊;
𝒇𝒊𝒏𝑺𝒊;
𝒇𝒊𝒏.
11
Licence 3 Cours compilation Chapitre 3
12