Vous êtes sur la page 1sur 34

Generalites

Analyse lexicale
Master Informatique Fondamentale - M1
Compilation
Generalites, Analyse lexicale
Paul Feautrier
ENS de Lyon
Paul.Feautrier@ens-lyon.fr
perso.ens-lyon.fr/paul.feautrier
24 janvier 2007
1 / 34
Generalites
Analyse lexicale
A quoi sert un compilateur

Un ordinateur execute du code binaire

Les programmeurs veulent un langage de haut niveau :

clarte, mnemotechnie, compacite

redondance (permet les verications)

proximite avec les usages (mathematique, transactionnel,


schematique, etc

Il faut une traduction, et donc un programme traducteur.


2 / 34
Generalites
Analyse lexicale
Compilateur ou Interpreteur ?

Un interpreteur simule une machine virtuelle dont le langage


considere est le langage machine.

Il est en general plus facile de fabriquer un interpreteur quun


compilateur, car il est plus facile dexecuter un calcul que de
fabriquer le code qui lexecute.

On utilise en general des schemas mixtes :

Un compilateur verie le code de haut niveau et le transcrit en


binaire, plus compact.

Un interpr`ete execute le code binaire.

Exemples : Java, Ocaml.


3 / 34
Generalites
Analyse lexicale
Comment marche un compilateur
RI
Generation de code
RI
Analyse
Source
Vrification Transformations
Optimisation
Langage machine

Le code source est analyse suivant une grammaire formelle et code en


binaire (representation intermediaire).

On verie que le programme est semantiquement correct. Exemple : un


identicateur est utilise conformement `a sa declaration.

On applique des transformation successives qui rapprochent le programme


de haut niveau dun programme en langage machine. Exemples :

Boucle combinaison de tests et de goto.

Eclatement des expressions complexes : code `a un operateur


par instruction.

Lorsque le code est susamment proche du langage machine, on le


transcrit en langage dassemblage.

Au passage, on essaie dameliorer le programme (optimisation).


4 / 34
Generalites
Analyse lexicale
Pourquoi un cours de compilation ?

Cest un sujet de recherche actif, parce que les processeurs


modernes devienennt de plus en plus complexes, et
demandent des compilateurs de plus en plus sophistiques.

En particulier les processeurs Dual Core et multicore posent


un probl`eme non resolu : paralleliser un programme arbitraire.

Les compilateurs les plus utilises (gcc, javac, ... sont des
logiciels libres.

Beaucoup de probl`emes se resolvent elegamment en


denissant un langage specialise et en ecrivant son
compilateur (exemple : la synth`ese de materiel).
5 / 34
Generalites
Analyse lexicale
Langages formels, I

Un langage est un ensemble de conventions entre un emetteur


et un recepteur qui leur permet de se comprendre.

Emetteur : le programmeur. Recepteur : le compilateur.

Comme le recepteur nest quun programme, le langage doit


etre specie de facon precise : lanage formel.

On distingue :

La syntaxe (ou grammaire) : quel sont les programmes


corrects.

La semantique : quels sont les programmes qui on un sens.

Analogie avec les langues naturelles.


6 / 34
Generalites
Analyse lexicale
Langages formels, II

La syntaxe peut etre enti`erement formalisee `a laide


dautomates mathematiques ou de grammaires formelles.

Il existe des outils permettant de traduire une grammaire


formelle en un programme danalyse grammaticale.

La formalisation de la semantique est beaucoup plus dicile.

Il existe des semantiques formelles (denotationnelles,


operationnelles, axiomatiques, etc, voir les cours
correspondants) mais aucun outils permettant de les exploiter
automatiquement.
7 / 34
Generalites
Analyse lexicale
Langages formels, III

Un langage formel est un sous ensemble de tous les mots


possibles sur un alphabet donne A. Un langage peut etre inni.

Une grammaire est une representation nie dun langage.

Une grammaire formelle se denit `a laide dun alphabet


auxiliaire N (les non terminaux) et de r`egles de reecriture
a b o` u a et b sont des mots sur lalphabet A N.

On passe dun mot u `a un mot v `a laide de la r`egle a b en


trouvant dans u une occurence de a et en la remplacant par b.

Le langage associe est lensemble des mots terminaux


engendres par reecriture `a partir dun non terminal Z
(laxiome).
8 / 34
Generalites
Analyse lexicale
Langages formels, IV : classication

X, Y, Z, ... sont des symboles terminaux,

u, v, w, ... sont des mots terminaux

a, b, c... sont des mots arbitraires.

Grammaires reguli`eres : r`egles X u ou X Yv.

Grammaires algebriques ou hors contexte : r`egles X a.

Grammaires sensibles au contexte : r`egles aXb acb.

Grammaires generales : pas de restrictions sur les r`egles.


Seules les deux premi`eres categories engendrent des langages
decidables.
9 / 34
Generalites
Analyse lexicale
Exemple : la grammaire des identicateurs
I a, . . . I z
I A, . . . I Z
I Ia, . . . I Iz
I IA, . . . I IZ
I I0, . . . I I9
Cest une grammaire reguli`ere.
10 / 34
Generalites
Analyse lexicale
Expressions arithmetiques : une grammaire simpliee
E I
E N
E (E +E)
E (E E)
Cest une grammaire hors contexte. Si lon omet les parenth`eses, la
grammaire devient ambig ue. Il y a plusieurs suites de reecritures
pour engendrer le meme mot.
11 / 34
Generalites
Analyse lexicale
Outillage

Une grammaire peut etre utilisee soit comme generateur, soit


comme analyseur.

Un mot etant donne, reconstituer la suite des productions qui


permet de lengendrer `a partir de laxiome, ou dire quil nest
pas dans le langage.

Ceci nest possible que pour les deux premiers types de


grammaires.

Pour des raisons decacite, on emploie les deux types, bien


que les langages reguliers soient inclus dans les langages hors
contexte.

Mais la puissance des grammaires hors contexte est


insusante pour exprimer toutes les r`egles. On doit
programmer des controles supplementaires.
12 / 34
Generalites
Analyse lexicale
Lec et Yacc

Analyse lexicale = decoupage en mots `a laide de grammaires reguli`eres.

Analyse syntaxique = decoupage en phrases `a laide dune grammaire


hors contexte.

On peut inventer des langages formels permettant de decrire les


grammaires :

liste de productions,

conventions lexicales pour distinguer les terminaux, les non


terminaux et les operateurs propres

On peut ecrire des compilateurs pour ces langages : `a partir de la


grammaire, ils engendrent un analyseur.

Les deux plus connus sont Lex (pour les grammaires reguli`eres) et Yacc
(pour un sous ensemble des grammaires hors contexte).

Il en existe de nombreuses implementations qui di`erent par le langage


cible (C, Ocaml, Java, ...) et le statut juridique.
13 / 34
Generalites
Analyse lexicale
Le langage Ocaml, I
Le langage Ocaml est particuli`erement bien adapte pour lecriture
de compilateurs. Cest un langage mixte fonctionnel et imperatif
`a typage fort.

Structure de donnees recursives :


type operon = {op : string;
args : expression list;
}
and expression = None
| Var of string
| Const of int
| SubExpression of expression
;;
14 / 34
Generalites
Analyse lexicale
Le langage Ocaml, II

pattern matching
match x with
None -> ...
| SubExpression e -> ... (List.fst e.args) ...
| _ -> ()

recursion, listes, chanes de caract`eres, tableaux, piles, FIFO,


fonctions anonymes, serialisation ...

objets et foncteurs : utilisation delicate


15 / 34
Generalites
Analyse lexicale
Le langage Ocaml, III
Tables hashcodees.
h=f(w1)=f(w2)
w1 w2
d1 d2
Interface :
let h = Hashtbl.create 127;
Hashtbl.add h w d;
let d = try Hashtbl.find h w
with Not_found -> ....
in ...;
16 / 34
Generalites
Analyse lexicale
Automates nis
10
20
A
B C D E
10
10
20 20
10
caf
Lautomate ni de la machine `a cafe.

Un alphabet dentree (ici {10, 20}) et eventuellement un alphabet


de sortie (ici {10, cafe}).

Un ensemble ni detats (ici, {A, B, C, D, E}).

Un etat initial, A qui ici est egalement terminal.

Une relation de transition :


A.10 B A.20 C B.10 C B.20 D
C.10 D C.20 E D A/cafe E D/ 10
17 / 34
Generalites
Analyse lexicale
Denitions

Un mot est accepte par lautomate sil existe un chemin etiquete par les
lettres du mot allant de letat initial `a un etat terminal.

Lensemble des mots acceptes est le langage reconnu par lautomate.

Le mot de longueur nulle se note .

Un automate ni est deterministe si la relation de transition est une


fonction.

Un automate peut avoir des -transitions ; il est alors indeterministe.

Un etat est accessible sil existe un chemin passant par cet etat et allant
de letat initial `a un etat terminal. On peut eliminer les etats non
accessibles.

Un automate est complet si pour tout etat il y a au moins une transition


par lettre de lalphabet. En general, on compl`ete un automate par des
transitions vers un etat derreur.
18 / 34
Generalites
Analyse lexicale
Notations
Un automate ni est un tuple {A, Q, i , T, }.

A lalphabet (dentre).

Q lensemble (ni) des etats.

i Q letat initial.

T Q lensemble des etat terminaux.

Q A Q la relation de transition.

On note p.a q pour p, a, q .

Si w est un mot sur A de longueur n, on note p.w q pour


p.w
1
q
1
, . . . , p
n1
.w
n
q
n
= q.
En particulier, p. p.
19 / 34
Generalites
Analyse lexicale
Lemme de pompage
u
v
w

Si le graphe de lautomate est acyclique,


lensemble des mots est ni.
Dans un graphe acyclique on peut
denir un plus long chemin, et
lensemble des mots de longueur
bornee est ni.

On suppose maintenant que le graphe


contient un cycle accessible. Il existe trois
mots u allant de letat initial en un point
du cycle, v le mot du cycle et w allent du
point initial du cycle `a letat terminale.
Alors tous les mots u.v
n
.w sont dans le
langage de lautomate (lemme de
pompage).

Un automate ni ne sait pas compter.


20 / 34
Generalites
Analyse lexicale
Le langage de Dick
Un exemple de ce quil est impossible de faire avec un automate
ni : verier quun syst`eme de parenth`eses est bien equilibre.
u
v
w
((((((((
((((

On choisit un mot u.v commencant par


plus de parenth`eses ouvrantes que
lautomate na detat.

On revient donc necessairement `a un etat


deja vu.

Soit w un mot allant de cet etat `a letat


terminal.

Si u.w est equilibre, u.v.w ne peut pas


etre equilibre.
21 / 34
Generalites
Analyse lexicale
Expression reguli`eres
Syntaxe abstraite :
E L E E.E
E E

E E|E
La syntaxe est abstraite parce que lon suppose que les termes sont
des arbres et non des chanes de caract`eres.

L est lensemble des lettres de lalphabet.

Le point represente la concatenation.

La barre represente lalternation.

Letoile represente literation.

a.(a + b)

se lit un a suivi dun nombre arbitraire de a ou de


b et designe donc les mots sur lalphabet {a, b} qui
commencent par un a.

on va montrer que les automates nis et les expressions


reguli`eres denissent la meme classe de langages.
22 / 34
Generalites
Analyse lexicale
Identites remarquables

La concatenation est associative.

Elle distribue par rapport `a lalternation.

Lalternation est associative et commutative.

= |(X.X

).
23 / 34
Generalites
Analyse lexicale
Equivalence, I
Etant donne un automate ni, trouver lexpression rationelle
equivalente.

Pour chaque transition p.a q, ecrire une equation p = aq.

Resoudre par la methode de Gauss.

A chaque etape, les equations sont de la forme


p = e
1
q
1
|e
2
q
2
| . . . |e
n
q
n
o` u les e
i
sont des expressions rationelles.

Si p = q
k
, alors p = e

k
.(e
1
q
1
| . . . |e
n
q
n
).

Si p est dierent de tous les q


k
, alors on peut leliminer en le
remplacant par sa valeur dans toutes les equations.

Lalgorithme se termine quand tous les etats restants sont


terminaux.

La complexite du resultat peut etre exponentielle.


24 / 34
Generalites
Analyse lexicale
Equivalence, II
Etant donne une expression rationelle, trouver lautomate ni
equivalent.
On proc`ede par induction sur la structure de lexpression rationelle.
a
e
f
e.f
f
e|f
e

e*
e
25 / 34
Generalites
Analyse lexicale
Exemple, I
a.(a|b)

3
7
2
1
5 6
4
a
a
b

Lautomate obtenu nest pas deterministe.


26 / 34
Generalites
Analyse lexicale
Determination

On construit un autre automate dont les etats sont les


ensembles detats de lautomate initial.

Un etat P est -clos ssi x P, x. y y P. On ne


consid`ere que les etats -clos. Il existe une operation notee E
qui calcule la cloture.

Letat initial est E(i ).

Un etat est terminal sil contient un etat terminal de


lautomate initial.

On cree une transition etiquetee par a entre P et


E({y | x P : x.a y}).
27 / 34
Generalites
Analyse lexicale
Exemple, II
3
7
2
1
5 6
4
a
a
b

A
S
I
T
a
a
b
a
b
b a
I = {1}, I .a {2, 3, 5} = A, A.a {4, 7, 2, 3, 5} = S
A.b {6, 7, 2, 3, 5} = T, S.a S, S.b T
T.a S, T.b T
Lautomate resultant nest pas minimal.
28 / 34
Generalites
Analyse lexicale
Minimisation : Equivalence de Nerode

Langage engendre par un sommet :


L(p) = {w | p.w q, q T}

Equivalence de Nerode : p q L(p) = L(p).

Cest une equivalence, comme toute relation image inverse de


legalite.
29 / 34
Generalites
Analyse lexicale
Automate minimal dun automate deterministe

On consid`ere lautomate quotient dont les etats sont Q/ ...

Il y a un arc de p vers q etiquete par a, si il existe


p p, q q, p.a q.

Si lautomate de depart est deterministe, lautomate quotient


lest aussi.

Lautomate quotient engendre le meme langage que


lautomate initial.

Lautomate quotient est minimum.


30 / 34
Generalites
Analyse lexicale
Calcul de lequivalence de Nerode par approximation
successives
On pose :
L
k
(p) = {w | p.w q, q T, |w| k}
p
k
q L
k
(p) = L
k
(q)
On a :
L
k
(p) = L
k1
(p)

a
a.L
k1
(p.a)
De plus, la decomposition est unique. Il sen suit
p
k
q p
k1
q &

a
p.a
k1
q.a
31 / 34
Generalites
Analyse lexicale
Calcul de lequivalence de Nerode, II

Lequivalence
0
divise lensemble des etat en 2, les
terminaux et les non terminaux.

Connaissant
k1
on peut calculer
k
par la formule
ci-dessus.

Si
k
=
k1
on a atteint un point xe.

Sinon le nombre de classe a augmente, et comme il est borne


par le nombre detats, on niit toujours par sarreter.

On peut accelerer lalgorithme :

On ne calcule p
k
q que si p
k1
q.

On ne calcule pas p
k
q si on peut le deduire par transitivite
de couples deja calcules (algorithme de Fisher-aller).
32 / 34
Generalites
Analyse lexicale
Lex, ex, ocamllex

Classication : on se donne une chane de caract`eres et une


liste dexpressions rationelles.

Partitionner la chane en jetons dont chacun est une


instance de lune des expressions rationelles.

Il ne doit pas y avoir de portion de chane non classiee.

Pour chaque jeton, indiquer le nom de lexpression


rationelle en cause et le texte du jeton (sauf sil ny a aucune
ambiguite).

Methode : construire et minimiser lautomate qui reconnait


(e
1
|e
2
| . . . |e
N
)

et signaler un jeton chaque fois que lon passe


par letat terminal.
33 / 34
Generalites
Analyse lexicale
Expressions reguli`eres augmentees

Le programme soumis `a lex est de la forme :


e
1
{j
1
}
| e
2
{j
2
}
| . . .

Les expressions rationelles e


i
utilisent des raccourcis. Par
exemple, a-z represente a | b | c ... | z.

Le jeton est decrit par un bout de code dans le langage hote.

Lautomate est construit, determinise, minimise et implemente


sous forme de tables.

Attention, la taille de lautomate croit tr`es vite avec la


longueur des expressions rationelels e
i
. Utiliser des astuces
(table de mots clef)
34 / 34

Vous aimerez peut-être aussi