Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
1
Chapitre 3: Analyse syntaxique descendante
Dérivation
Qualités des grammaires
Ambigüités
Récursivité à gauche
Factorisation à gauche
Analyseurs descendants
Principe
Analyse par descente récursive
Construction de la table d’analyse
2
Chapitre 4: Langages réguliers
Grammaires régulières
3
Chapitre 5: Analyse syntaxique ascendante
Grammaires LR(k)
Langages R0(A)
R0(i) et grammaires LR(0)
Construction de l’automate LR(0)
Fonctionnement de l’analyseur
Méthode des 0-items
Grammaires SLR(1)
Construction des tables d’analyse SLR(1)
Algorithme d’analyse SLR(1)
Grammaires LR(1)
Construction des ensembles d’items LR(1)
Construction des tables canoniques LR(1)
Construction des tables d’analyse LALR(1)
Bison et utilisation des grammaires ambigües
4
Chapitre 1: Introduction à la compilation
- Langages de programmation
- Algorithmique
- Architecture des machines
- Théorie des langages
- Génie logiciel
5
Les compilateurs
Définition simplifiée:
Messages d’erreurs
6
Il existe des milliers de langages source
7
Modèle de compilation par analyse et synthèse
Deux parties:
8
Environnement du compilateur
Préprocesseur
programme source
Compilateur
Assembleur
10
Analyse lexicale
Dans un compilateur l’analyse linéaire est appelée analyse lexicale.
Exemple:
position := initiale + vitesse * 60
Les caractères formants cette instruction sont regroupés dans les unités
lexicales suivantes:
1 – l’identificateur position
2 – le symbole d’affectation :=
3 – l’identificateur initiale
4 – le symbole plus
5 – l’identificateur vitesse
6 – le symbole de multiplication
7 – le nombre 60
Les espaces sont éliminés lors de l’analyse lexicale.
11
Analyse syntaxique
12
Exemple : définition des expressions:
Les règles 1 et 2 sont des règles de base (non récursives) tandis que la règle 3 définit des
expressions en terme d’opérateurs appliqués à d’autres expressions
13
position := initiale + vitesse * 60
Instruction d’affectation
identificateur
:= expression
position
expression + expression
identificateur
*
expression expression
initiale
Arbre syntaxique
identificateur nombre
vitesse 60
14
On peut définir les instructions récursivement par des règles comme les suivantes
si (e1) alors i2
15
Analyse sémantique
Cette phase contrôle si le programme source contient des erreurs sémantiques et
Collecte des informations destinées à la production de code
position +
:=
initiale *
position +
vitesse 60
initiale *
Arbre abstrait
vitesse EntierVersRéel
60
Programme source
Analyseur lexical
Analyseur syntaxique
Analyseur sémantique
Gestionnaire de la Gestionnaire d’erreurs
table des symboles Générateur de code intermédiaire
Optimiseur de code
Générateur de code
Programme cible
Organisation logique
17
Regroupement de phases
18
19
Chapitre 2: Analyse lexicale
Unités lexicales, modèles et lexèmes
Chaînes et langages (définitions)
Opérations sur les langages
Expressions régulières
Diagramme de transition
Automates Finis
Automates finis déterministes
Automates avec sortie (Transducteurs)
Lex : langage de spécification
d’analyseurs lexicaux
20
Chapitre 2: Analyse lexicale
L’analyseur lexical constitue la première phase d’un compilateur. Sa tâche principale est de lire
Les caractères d’entrée et de produire comme résultats des entités lexicales.
Table des
symboles
22
Unités lexicales, modèles et lexèmes
if if if
Oprel < <= > >= <> = < <= > >= <> =
23
Attributs des unités lexicales
Les unités lexicales et les valeurs d’attributs sont données sous forme de couples:
24
Spécification des unités lexicales
• Une chaîne (mot ou phrase) sur un alphabet est une séquence de symboles extraits de
cet ensemble.
25
* préfixe, suffixe ou sous-chaine propre de s: Toute chaine non vide x qui est respectivement,
préfixe, suffixe ou sous-chaine de s telle que s x
exemples: {} ou
ensemble des programmes c syntaxiquement bien écrits
phrases françaises grammaticalement correctes.
* Exponentiation de chaine:
s0 =
s1 = s
Et pour i>0
si = si-1s
26
Opérations sur les langages
Opération Définition
Union L U M = {s | s L ou s M}
concaténation LM = {st | s L et t M}
fermeture de Kleene de L
L* i0 Li
fermeture positive de L
L i1 Li
27
Expressions régulières
29
Exemples
3 – a* dénote {,a,aa,aaa,…}
30
Si deux expressions r et s dénotent le même langage, on écrit r = s
Ex: (a | b) = (b | a)
Définitions régulières:
On souhaite définir des expressions régulières en utilisant des noms.
Si S est un alphabet de symboles de base, alors une définition régulière est une suite de
définitions de la forme:
D1 –--> r1
D2 –--> r2
…..
Dn –-> rn
Où :
chaque di est un nom distinct
chaque ri est une expression régulière sur les symboles S U {d1,d2,…,di-1}
31
Propriétés algébriques des expressions régulières
Axiome Description
r = r
r=r est l’élément neutre pour la concaténation
r* = (r | )*
r** =r*
32
Exemple: Les identificateurs
33
Notations abrégées
1- « Au moins une instance » est représentée par l’opérateur unaire postfixe +
r* = r+ |
r+ = r*r
2 – « zéro ou une instance » est représentée par l’opérateur unaire postfixe ?
r? = r|
Exemple:
chiffre –--> 0|1|…|9
chiffres –--> chiffre +
fraction-opt –--> (. chiffres) ?
exposant-opt–--> (E(+|-)? chiffres)?
nb –--> chiffres fraction-opt exposant-opt
3 – « classes de caractères »
Exemples:
[abc] dénote l’expression régulière a|b|c
[a-z] dénote l’expression régulière a|b|c|…|z
[A-Za-z][A-Za-z0-9]* dénote les identificateurs
34
Reconnaissance des unités lexicales
instr –--> si expr alors instr | si expr alors instr sinon instr |
expr –--> terme oprel terme | terme
term –--> id | nb
si –--> si
alors –--> alors
sinon –--> sinon
oprel –--> < | > | <= | >= |= | <>
id –--> lettre(lettre|chiffre)*
nb –--> chiffre+(. chiffre+)? (E(+|-)? chiffre+)?
35
Modèles d’expressions régulières pour les léxèmes
bl - -
si si -
alors alors -
sinon sinon -
id id pointeur vers une entrée de la table
nb nb pointeur vers une entrée de la table
< oprel PPQ
<= oprel PPE
= oprel EGA
<> oprel DIF
> oprel PGQ
>= oprel PGE
36
Diagramme de transition
>
3 Retourne(oprel, DIF)
> =
6 7 Retourne(oprel, PGE)
autre *
8 Retourne(oprel, PGQ)
*
début lettre autre 11
9 10 Retourne(unilexid(), rangerid())
Exemple: reconnaisseur pour des nombres sans signes Nb → chiffre+ (. chiffre+)? (E(+|-)? chiffre+)?
chif chif
début chif *
25 26 autre 27
38
délim
début délim *
28 29 autre 30
39
Automates Finis
Définitions:
Reconnaisseur:
Un reconnaisseur pour un langage est un programme qui prend en entrée une chaine x et
répond « oui » si x est une phrase du langage et « non » sinon.
40
Automates finis non déterministes
1 – un ensemble d’états E;
2 – un ensemble de symboles d’entrée S (alphabet);
3 – une fonction de transition, qui fait correspondre des couples état-symbole à des
ensembles d’états;
4 – un état e0 considéré comme état de départ ou état initial;
5 – un ensemble d’états F distingués comme états d’acceptation ou états finaux.
début a b b
0 1 2 3
b (a|b)*abb
41
Représentation en machine:
Table de transition : une ligne pour chaque état et une colonne pour
chaque symbole plus éventuellement
Le langage défini par un AFN est l’ensemble des chaines d’entrée qu’il accepte.
42
a
a
1 2
début b
0
b
3 4
aa*|bb*
43
Construction d’un AFN à partir d’une expression régulière
Algorithme:
Donnée: Une expression régulière r sur un alphabet
Résultat: un AFN N qui reconnait L(r)
début
i N(s) N(t) f
début N(s) f
i
45
Automates finis déterministes
Un AFD est un cas particulier d’automate fini non déterministe dans lequel:
b
b
début a b b
0 1 2 3
a
a
a
(a|b)*abb
46
Simulation d’un AFD
Données: une chaine d’entrée x terminée par un caractère de fin de fichier (EOF).
un AFD D avec un état de départ e0 et un ensemble d’états d’acceptation F.
Résultat: réponse « oui » si D accepte x; « non » dans le cas contraire.
Outils:
transiter(e,c) donne l’état vers lequel il y a une transition depuis l’état e sur le
caractère d’entrée c.
e:=e0;
c:=carsuiv();
tant que c<> EOF faire
e:=transiter(e,c);
c:=carsuiv();
fin;
si e appartient à F alors retourner « oui »
sinon retourner « non »;
47
Transformation d’un AFN en AFD
Trouver l’-clôture de s:
(s)= {s} U {s’ / s → s1 … →sn →s’}
(T) ← T
tant qu’il existe un sommet t (T) ; t → u
48
Déterminisation d’un AFN
49
Algorithme:
50
(a|b)*abb
a
2 3
a b b
6 7 8 9 10
0 1
b
4 5
(s) a b
a
I a {0,1,2,4,7}=I {2,3,6,7,1,4,8}=II {4,5,6,1,7,2}=III
II
a II II {4,5,6,7,1,2,9}=IV
b
a
III II III
b
a IV II {5,10,6,7,1,2,4}=V
III
b
IV V II III
b b
51
Minimisation
1 – M0 = {S\F, F}
2 – On construit des partitions Mi+1 à partir de Mi en utilisant l’algorithme suivant:
Algorithme:
début
pour tout élément pj de Mi faire
partitionner pj en sous ensembles p’ j /
si s et t sont 2 sommets pj Mi alors
pour toute lettre ,
(s,) et (t,) sont dans un même ensemble pk alors ajouter s et t à p’j
et Mi+1={p’1,p’2,….,p’n}
arrêter quand Mi = Mi+1
fin
52
a
1 a
2
M0= (1,2,3,4) (5)
b a
a M1= (1,2,3) (4) (5)
b M2 = (1,3) (2) (4) (5)
a M3 = (1,3) (2) (4) (5)
3
4
b
b b
a
5 1,3 a
2
a
(1,a)=(2) (1,b)=(3)
a
(2,a)=(2) (2,b)=(4)
b
(3,a)=(2) (3,b)=(3) a
(4,a)=(2) (4,b)=(5)
(5,a)=(2) (5,b)=(3) 4
b b
5
53
Automates avec sortie (Transducteurs)
Définition:
deux alphabets: X alphabet d’entrée et Y alphabet de sortie
un ensemble d’états S
un ensemble d’arcs définis par : un état origine et un état extrémité
un symbole d’entrée dans X*
un symbole de sortie dans Y*
un état initial s0
un ensemble d’états terminaux F S
Exemple: e2 e4
e1
X={a,b} Y={x,y} S={1,2} (b,x) (a,x)
(a,xy)
Arcs:
e1=(s1,s2,a,xy) 2
1 e3
e2=(s1,s1,b,x)
(b,y)
e3=(s2,s1,b,y)
e4=(s2,s2,a,x)
(a b b b a a , x y y x x x y x)
54
Construction d’un petit analyseur lexical
. Lecture
. Recherche d’entités
. Formation de la chaîne de sortie
. Elimination des informations inutiles
. Détection de certaines erreurs
55
Entité Code Valeur
Begin 1 -
End 2 -
If 3 -
Then 4 -
Else 5 -
0 8 12
t e s t v a r 1 0 0 m i l i e u
57
(sep,)
(b,) (e,) (i,) (n,) (sep,retourner(1,-))
(g,)
1 2 3 4 5 6 1
(lettre|ch|_ ,)
(sep, retourner(6,ajoutersymb())
(sep,retourner(7,ajoutersymb()))
20 1
(=,retourner(8,6)) (sep,)
(> ,) 25 26 1
(=,retourner(8,5)) (sep,)
1
58