Vous êtes sur la page 1sur 30

Analyselexicaleetsyntaxique

Textedeprogramme
letx:floatref=ref0.5inx:=1.+.float_of_int2*.(!x.1.)
Analyselexicale(scanneroulexer)

Suitedelexmes(token)

letx:floatref=ref0.5inx:=1.+.float_of_int2*.(!x.1.)
Analyse
syntaxique
(parser)

Arbredesyntaxeabstraite
let
varx
identref

apply
float0.5

constr

apply

ref constr
float

apply

apply

ident:= identx

apply

ident+. float1.

expressions
types
patterns

motsclefs,oprateurs...
identificateurs
valeursflottantes,entires

ident*.

apply
apply
apply

identfloat_of_int int2

apply
apply float1.
ident.

apply

ident! identx

Planducours

Analyselexicale

Introduction

Expressionsrguliresetautomatesfinis

Analysesyntaxique

Introduction

Grammaireshorscontextesetautomatespile

AnalyseLL(0)

AnalyseLALR

L'analyselexicale
Elletransformeletexteenunesuitedelexmes(tokenenanglais).

Leprogrammeestdcoupenmorceaux(identificateurs,
entierslittraux,ponctuation)
Cesmorceauxsubissentunepremiretransformationsimple:

Leslittraux:nombres,chanes,sonttraduitsenleurvaleur.

Lessymbolesdeponctuation:(,),:=,=,[,[|,;...etles
identificateurscorrespondantenfaitdesmotsrservs:let,
in,if,then...sonttraduitsenmotsclefs(constructeursd'un
typenumr).

Lesautresidentificateurssontreprsentspardeschanes.

Lesespacesetlescommentaires(cesontaussideslexmes)
sontsupprims

Sparationdessymboles

Chaquetypedesymbole(entier,flottant,identificateur,parenthse
ouvrante,[|,pointvirgule..)estdfiniparunexpressionrgulire:

bracket

:=

(uncaractre)

bracketbar

:=

[|

(squence)

int_literal

:=

(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)* (alternative,rcursion)

float_literal

:=

(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*.(0|1|2|3|4|5|6|7|8|9)*

token

:= bracket|int_literal|ident|...

Formellement,lesexpressionsrguliressontdcritesparla
grammairesuivante:

e:=|c|ee|e|e|e*

(laquelleonajoutesouventquelquesnotationsutilesmaisqui
n'augmententpasleurpuissanceexpressive).

Automatesfinis

Leslangagesdnotspardesexpressionsrguliressont
reconnaissablesparautomatesfinis(dterministes).Onprocde
ainsi:

Onconstruitunautomatenondterministequireconnatle
langagednotparl'expressionrguliretoken.

Ondterminisecetautomate.

Onleminimise

Onobtientalorsunprogrammesimple(automatedterministe)
pourlireleprogrammeetdciderquandonaluunlexme.

Constructiondel'automate
Onconstruitdefaoninductiveunautomatenondterministequia

Unseultatinitial

Unseultatfinal,quideplusestdiffrentdel'tatinitial

motvide

uncaractre

rcursion
e*

squence
ee

alternative

e|e

Dterminisation

L'excutiond'unautomatenondterministeestpossible
(backtrack)maislourde,carilfautmmoriserdesconfigurations,
etlongue:pourunmmemot,onparcourtplusieurschemins.
Onprfredterminiserl'automate.Ide:

Lestatssontdesensemblesd'tatsdel'automateinitial

Qc{q'|qQq*c*q'}

Rappel:latailledel'automateobtenupeuttreexponentielle
(maisenpratique,aresteraisonnable).

Minimisation

Onconsidrelaplusgranderelationd'quivalenceentretatstelle
que:

tatsaccepteursetnonaccepteursnesontjamaisquivalents,et

sis'~setss''alorsilexistes'''telques'''s''ets's'''.

Proprit:

Deuxtatsquivalentsacceptentlesmmesmots.

Onpeutdonclesfusionner,rduisantainsilatailledel'automate.

L'automateainsiobtenuestminimal,etc'estlequotientde
l'automateinitialparlarelationd'quivalence~.

Choixetclassificationetdeslexmes

Quands'arrter?

Leplustardpossible:onslectionnelepluslonglexmepossible(en
continuantjusqu'cequel'automatesebloque)

Quandonestbloqu,onrevientaudernierlexmetrouv.

Queltypedelexmechoisir?

token:=bracket|int_literal|ident|...

Ongardelestatsfinauxdesclassesdelexmes:

Dterminisation:siuntatcontientdeuxtats

bracket
...

ident

bracket
...

ident

finaux,onn'engardequ'un:lepremier(casd'unlexmeambig)

Minimisation:onajouteunecontraintesurlarelationd'quivalence:

deuxtatsfinauxdiffrentsnesontpasquivalents.

Exemple

e=float|int|+
int=cc*
float=cc*.c*

c
c
...

Autableau!

Concrtement:Lex(Flex,Ocamllex)

Oncritdesexpressionsrgulires,muniesdefonctionssimples
pourcalculerlesvaleursassociesauxlexmes:
e= |'['
|['0''9']['0''9']*
|['0''9']['0''9']*'.'['0''9']*
|['a''z']['a''z''A''Z''0''9']*

{BRACKET}
{INT(int_of_stringe)}
{FLOAT(float_of_stringe)}
{tryfindkeyword_tablee
withNot_found>IDENTe}

Aprscompilationparlex(ocamllex)onobtientunprogramme
analyseur,quilitdescaractresdansunfluxd'entreetcritdes
tokendansunfluxdesortie.

Plusexactement,onaunefonctionqu'onappellechaquefois
qu'onveutlireletokensuivant.

L'analysesyntaxique

Ellestructurelasuitedelexmesenfonctiond'unegrammaire:

:=float_literal|int_literal|ident

|E+.E|E*.E|E.E|!E|E:=E|EE|(E)
|letP:T=EinE|
P:=ident|wildcard|P|P|P,P|...

T:=ident|Tident|T*T|...

Ellecalculeunrsultat,partirdesvaleursdeslexmes,etdela
syntaxeinfre:

Unprogrammeexcutable(solutiontrsnave)

Ouunarbredesyntaxeabstraite,utilisparlasuitedela
compilation.

Arbrededrivation
E
let

P
ident
x

T ident
ref

ident
float

E
E E

in

E
E := E

ident float_literal ident


ref
0.5
x

E +.

float_literal
1.

E
E *. E

ident int_literal
float_of_int 2

E . E
! id. float_lit.
x
1.

letx:floatref=ref0.5inx:=1.+.float_of_int2*.(!x.1.)

Grammaireshorscontexte

Unegrammairehorscontexteestladonnede:

Unensembledesymbolesterminaux,pourl'analysesyntaxique,cesont
les(classesde)lexmes
{let,in,:,:=,=,ident,...}

Unensembledesymbolesnonterminaux

{E,P,T}

UnaxiomesouventnotS

Unensembledergles,ouproductionsNLo

Nestunnonterminal

Lestunelistedeterminauxetnonterminaux

Parexemple:

EEE

Pident

EE:=E

EletP:T=EinE

Automatespile

Notation:

AutomatesimplereconnaissantL(G):

Alphabetdepile:symbolesterminauxetnonterminaux

Transitions:

(pile,mot)(pile,mot)

(t::p,t.w)(p,w)

tterminal

(N::p,w)(::p,w)

N productiondeG

Pileinitiale:S::(axiome)

(S,w)(,)ssiwL(G)
Fortementnondterministe(onessaietouslesmotsetonregarde
siwenfaitpartie).

Analysedescendante(topdown)

Automatedesitems

Lesitemssontlesproductions,auxquellesonrajouteunindice
danslemembredroit.Exemple:

LesitemsdelaproductionNAtBsont:

[N.AtB],[NA.tB],[NAt.B],[NAtB.]

OnajoutelaproductionS'S(etlesdeuxitemsassocis)

L'automatedesitems(d'unegrammairehorscontexte):

Alphabetdepile:lesitemsdelagrammaire

Transitions:

([N.t]::p,t.w)([Nt.]::p,w)

([N.N'].p,w)([N'.']::[N.N']::p,w) N''G

([N''.]::[N.N']::p,w)([NN'.]::p,w)

Pileinitiale:[S'.S]::

Pileacceptrice:[S'S.]::

Premier,suivant

Pourunesuitedenonterminaux

premier()estl'ensembledessymbolesterminauxquipeuvent
commencerunechanedrivede,plussi .

suivant()estl'ensembledessymbolesterminauxpouvantsuivre
dansuneprotophrase(phraseobtenuepardrivation),plus$si
peuttermineruneprotophrase.

Cesfonctionsfournissentunmoyendechoisirlaproduction
utiliser,dansl'automatedesitems(expansion).Sileprochain
symbolereconnatreestt,argleN''choisieesttelleque

tpremier('),ou

premier(')ettsuivant(N')

AnalyseetgrammairesLL(1)

Rappel:automatedesitems

([N.t]::p,t.w)([Nt.]::p,w)

([N.N'].p,t.w)([N'.']::[N.N']::p,t.w)si

N''G,et

tpremier('),ou

premier(')ettsuivant(N')

([N''.]::[N.N']::p,w)([NN'.]::p,w)

SilargleN''satisfaitcesconditions,alorsilexisteunmot
t.wquimnel'tataccepteur(autrementdit,onnepeutpas
restreindrepluslechoixenregardantseulementun1symbole).
Dfinition:sipourtousN',tilexisteuneuniquergleN''qui
satisfaitcesconditions,lagrammaireestditeLL(1).L'automate
ainsirestreintestalorsdterministe.

Calculdepremier

Formellement,pourunsymboleterminalounon:

premier(t){t}

premier(N){}

si NG

premier(N)premier(s)

si NN1...NnsG,et

premier(Ni),et

L()

Lafonctionpremierestlapluspetitesolutiondecesinquations.C'est
aussilepluspetitpointfixed'unefonctioncroissantesuruntreillisde
hauteurfinie,donconsaitlacalculer.
Pouruneprotophrasequelconque,ilsuffitd'appliquerunefoisdeplus
latroisimequation.

Calculdesuivant

Formellement,pourunsymbolenonterminal:

suivant(S'){$}

suivant(N)premier()\ siN'NG

suivant(N)suivant(N')

siN'NGetpremier()

Lencore,oncalculelepluspetitpointfixeparitration,aprs
avoircalcullafonctionpremier.
Cesdeuxcalculssontdesanalysesdeflux,d'autrespropritsse
formalisentdelammemanire:

LaquestionL()(utilisepourcalculerpremier)

L'accessibilitd'unnonterminalNpartirdeS

Exemple:expressionsarithmtiques

Grammaire,calculdepremieretsuivant:

S=E

premier={id,(}

suivant={$}

E=TE'

premier={id,(}

suivant={$,)}

E'=|+E

premier={+,}

suivant={$,)}

T=FT'

premier={id,(}

suivant={$,),+}

T'=|*T

premier={*,}

suivant={$,),+}

F=(E)|id

premier={id,(}

suivant={$,*,+,)}

PourE'=|+E:

slectionnepour:

premier()={},suivant(E')={#,)}

#,)

+E:

premier(+E)={+}

Donc:pasdenondterminismesurl'expansiondeE'

AnalysedescendanteLL(1)

Onpeutl'crireavecdesprocduresrcursives:une
procdureparnonterminal.
ProcdureN=

choisiruneproductionNenfonctionduprochaincaractrelire

pourchaquesymboleXde(dansl'ordre):

siXestunnonterminal

appelerlaprocdureX

siX=t

avancerd'uncran

sinon

erreur

Exempleautableau...

Analysemontante(bottomup)

Automatecaractristique

L'automate(pile)desitemspeuttrereprsentparune
automatefininondterministe:

tats:

lesitems

Alphabet: lesterminauxetnonterminaux

Transitions:

(X''=''touN')

[N.N'][N'.']pourN'' G

[N.X]X[NX.]

tatinitial: [S'.S]

tatsfinaux:

lesitemscomplets(lepointestdroite)

Exemple(autableau):

S=E,E=E+T,T=T*F,F=(E)
|T

|F

|id

AnalyseLR(0)

Onpeutdterminisercetautomate:lestatssontalorsdes
ensemblesd'items(l'ideestdediffrerlechoixd'uneproduction
lorsdel'expansion).
Onluiassociealorsunnouvelautomatepilereconnaissantle
langagedeG

Alphabetdepile:lesensemblesd'itemsobtenuspardterminisation

Pileinitiale:{[S'.S]}

Transitionsdedeuxtypes:

Dcalage:(Q::p,t.w)(Q'::Q::p,w)

siQtQ'dansl'automate(cequiimplique[N.t]Q)

Rduction:(Qn...Q1::Q::p,w)(Q'::Q::p,w)

si[N.]Qn,

||=net

QNQ'

Nondterminisme

Ilestdedeuxsortes:

Shiftreduce:

Reducereduce:

si[N.t]Qet[N.]Q,quefaireenvoyantt?
si[N.]Qet[N'.]Q,quefaire?

SiaucuntatQneprsentecerisque,alorsonaunegrammaire
LR(0).

GrammairesSLR,LALR

Sinon:pourchaquetatQetchaqueitem[N.]Q,ondfinit
unensembledeprvision:terminauxdevantlesquelsonpeut
choisircetitempourrduire.

Casgnral:rductionde(Q::...,t.w)par[N.]Q

SLR(1):prvision({[N.],...},[N.])=suivant(N)

rductionde(Q::...,t.w)par[N.]Qsitsuivant(N).

LALR(1):prvision(Q,[N.])={t|onpeutlireuntetaccepter
unmot,sachantqu'onvientdereconnatreunNetqu'onestdansQ}

sitprvision(Q,[N.])

rductionde(Q::...,t.w)par[N.]Qs'ilexisteunedrivation
droiteS*'Ntwavec{[S'.S]}'N*Qdansl'automate.

UnegrammaireestSLR(1)(respectivementLALR(1))sionlve
ainsitouslesconflits.

Concrtement:Yacc,(Bison,Ocamlyacc)

Yacc:Yetanothercompilercompiler
Oncritunegrammaireavecunefonctionassociechaque
production.
expr:
|WHILEexprDOexprDONE
|LPARENexprRPAREN

{Pexp_while($2,$4)}
{$2}

Onobtientunprogrammequiprendunfluxdetokensetretourne
l'attributcalculparlesfonctions(arbredesyntaxeabstraite).
Remarque:cesoutilsacceptentdesdclarationsdeprioritet
associativitquipermettentdelevercertainesambigutssans
changerlagrammaire.

Vous aimerez peut-être aussi