Cours Analyse Lexicale Et Syntaxique
description
Transcript of Cours Analyse Lexicale Et Syntaxique
-
Analyselexicaleetsyntaxique
-
letx:floatref=ref0.5inx:=1.+.float_of_int2*.(!x.1.)
letx:floatref=ref0.5inx:=1.+.float_of_int2*.(!x.1.)
let
varx apply
identref float0.5
apply
apply apply
ident:= identx
ident+.
Textedeprogramme
Suitedelexmes(token)
motsclefs,oprateurs...identificateursvaleursflottantes,entires
Arbredesyntaxeabstraite
apply
float1. apply
apply
constr
ref
ident*. apply
identfloat_of_int int2
apply
ident.
apply float1.
apply
ident! identx
float
constr
expressionstypespatterns
Analyselexicale(scanneroulexer)
Analysesyntaxique(parser)
-
Planducours
Analyselexicale Introduction
Expressionsrguliresetautomatesfinis
Analysesyntaxique Introduction
Grammaireshorscontextesetautomatespile
AnalyseLL(0)
AnalyseLALR
-
L'analyselexicaleElletransformeletexteenunesuitedelexmes(tokenenanglais).
Leprogrammeestdcoupenmorceaux(identificateurs,entierslittraux,ponctuation)
Cesmorceauxsubissentunepremiretransformationsimple:
Leslittraux:nombres,chanes,sonttraduitsenleurvaleur.
Lessymbolesdeponctuation:(,),:=,=,[,[|,;...etlesidentificateurscorrespondantenfaitdesmotsrservs:let,in,if,then...sonttraduitsenmotsclefs(constructeursd'untypenumr).
Lesautresidentificateurssontreprsentspardeschanes.
Lesespacesetlescommentaires(cesontaussideslexmes)sontsupprims
-
Sparationdessymboles
Chaquetypedesymbole(entier,flottant,identificateur,parenthseouvrante,[|,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,lesexpressionsrguliressontdcritesparlagrammairesuivante:
e:=|c|ee|e|e|e*
(laquelleonajoutesouventquelquesnotationsutilesmaisquin'augmententpasleurpuissanceexpressive).
-
Automatesfinis
Leslangagesdnotspardesexpressionsrguliressontreconnaissablesparautomatesfinis(dterministes).Onprocdeainsi:
Onconstruitunautomatenondterministequireconnatlelangagednotparl'expressionrguliretoken.
Ondterminisecetautomate.
Onleminimise
Onobtientalorsunprogrammesimple(automatedterministe)pourlireleprogrammeetdciderquandonaluunlexme.
-
Constructiondel'automateOnconstruitdefaoninductiveunautomatenondterministequia
Unseultatinitial
Unseultatfinal,quideplusestdiffrentdel'tatinitial
c c
e eee
e e|e
e
motvide
uncaractre
squence
alternative
ee*
rcursion
-
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'quivalenceentretatstelleque:
tatsaccepteursetnonaccepteursnesontjamaisquivalents,et
sis'~setss''alorsilexistes'''telques'''s''ets's'''. Proprit:
Deuxtatsquivalentsacceptentlesmmesmots.
Onpeutdonclesfusionner,rduisantainsilatailledel'automate.
L'automateainsiobtenuestminimal,etc'estlequotientdel'automateinitialparlarelationd'quivalence~.
-
Choixetclassificationetdeslexmes Quands'arrter?
Leplustardpossible:onslectionnelepluslonglexmepossible(encontinuantjusqu'cequel'automatesebloque)
Quandonestbloqu,onrevientaudernierlexmetrouv.
Queltypedelexmechoisir?
token:=bracket|int_literal|ident|...
Ongardelestatsfinauxdesclassesdelexmes:
Dterminisation:siuntatcontientdeuxtats
finaux,onn'engardequ'un:lepremier(casd'unlexmeambig)
Minimisation:onajouteunecontraintesurlarelationd'quivalence:
deuxtatsfinauxdiffrentsnesontpasquivalents.
bracket
ident ...
bracket
ident...
-
Exemplee=float|int|+int=cc*float=cc*.c*
c
c
...
Autableau!
-
Concrtement:Lex(Flex,Ocamllex)
Oncritdesexpressionsrgulires,muniesdefonctionssimplespourcalculerlesvaleursassociesauxlexmes:
Aprscompilationparlex(ocamllex)onobtientunprogrammeanalyseur,quilitdescaractresdansunfluxd'entreetcritdestokendansunfluxdesortie.
Plusexactement,onaunefonctionqu'onappellechaquefoisqu'onveutlireletokensuivant.
e= |'[' {BRACKET}|['0''9']['0''9']* {INT(int_of_stringe)}|['0''9']['0''9']*'.'['0''9']* {FLOAT(float_of_stringe)}|['a''z']['a''z''A''Z''0''9']* {tryfindkeyword_tablee
withNot_found>IDENTe}
-
L'analysesyntaxique Ellestructurelasuitedelexmesenfonctiond'unegrammaire:
E :=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,etdelasyntaxeinfre:
Unprogrammeexcutable(solutiontrsnave)
Ouunarbredesyntaxeabstraite,utilisparlasuitedelacompilation.
-
Arbrededrivation
letx:floatref=ref0.5inx:=1.+.float_of_int2*.(!x.1.)
E
let P : T = E in Eidentx
T
identfloat
identref
E E E E:=
float_literal0.5
identref
identx
E +. E
float_literal1.
E *. E
int_literal2
E E
identfloat_of_int
( E )
E . E
! id.x
float_lit.1.
-
Grammaireshorscontexte
Unegrammairehorscontexteestladonnede:
Unensembledesymbolesterminaux,pourl'analysesyntaxique,cesontles(classesde)lexmes {let,in,:,:=,=,ident,...}
Unensembledesymbolesnonterminaux {E,P,T}
UnaxiomesouventnotS E
Unensembledergles,ouproductionsNLo Nestunnonterminal Lestunelistedeterminauxetnonterminaux
Parexemple: EEE Pident EE:=E EletP:T=EinE
-
Automatespile
Notation: (pile,mot)(pile,mot)
AutomatesimplereconnaissantL(G):
Alphabetdepile:symbolesterminauxetnonterminaux
Transitions:
(t::p,t.w)(p,w) tterminal (N::p,w)(::p,w) N productiondeG
Pileinitiale:S::(axiome)
(S,w)(,)ssiwL(G)
Fortementnondterministe(onessaietouslesmotsetonregardesiwenfaitpartie).
-
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) ([N N'. ]::p,w)
Pileinitiale:[S' .S]::
Pile acceptrice :[S' S.]::
-
Premier,suivant Pourunesuitedenonterminaux
premier()estl'ensembledessymbolesterminauxquipeuventcommencerunechanedrivede,plussi .
suivant()estl'ensembledessymbolesterminauxpouvantsuivredansuneprotophrase(phraseobtenuepardrivation),plus$sipeuttermineruneprotophrase.
Cesfonctionsfournissentunmoyendechoisirlaproductionutiliser,dansl'automatedesitems(expansion).Sileprochainsymbolereconnatreestt,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 t premier( ' ),ou premier( ' )ett suivant( N')
([N' '.] ::[N.N' ]::p,w) ([N N'. ]::p,w)
SilargleN''satisfaitcesconditions,alorsilexisteunmott.wquimnel'tataccepteur(autrementdit,onnepeutpasrestreindrepluslechoixenregardantseulementun1symbole).
Dfinition:sipourtousN',tilexisteuneuniquergleN''quisatisfaitcesconditions,lagrammaireestditeLL(1).L'automateainsirestreintestalorsdterministe.
-
Calculdepremier
Formellement,pourunsymboleterminalounon:
premier(t) {t}
premier(N) { } si N G
premier(N) premier(s) si N N1...Nns G,et
premier(Ni),et
L()
Lafonctionpremierestlapluspetitesolutiondecesinquations.C'estaussilepluspetitpointfixed'unefonctioncroissantesuruntreillisdehauteurfinie,donconsaitlacalculer.
Pouruneprotophrasequelconque,ilsuffitd'appliquerunefoisdepluslatroisimequation.
-
Calculdesuivant
Formellement,pourunsymbolenonterminal:
suivant(S'){$}
suivant(N)premier( )\ siN' N G
suivant(N)suivant(N') siN' N G et premier( ) Lencore,oncalculelepluspetitpointfixeparitration,aprs
avoircalcullafonctionpremier.
Cesdeuxcalculssontdesanalysesdeflux,d'autrespropritsseformalisentdelammemanire:
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:uneprocdureparnonterminal.
ProcdureN=
choisiruneproductionNenfonctionduprochaincaractrelire
pourchaquesymboleXde(dansl'ordre):
siXestunnonterminal : appelerlaprocdureX siX=t : avancerd'uncran sinon : erreur
Exempleautableau...
-
Analysemontante(bottomup)
-
Automatecaractristique
L'automate(pile)desitemspeuttrereprsentparuneautomatefininondterministe:
tats: lesitems
Alphabet: lesterminauxetnonterminaux
Transitions: [N.X]X[NX.] (X''=''touN')
[N.N'][N'.']pourN' ' G tatinitial: [S' .S]
tatsfinaux: lesitemscomplets(lepointestdroite)
Exemple(autableau):
S=E,E=E+T,T=T*F,F=(E)
|T |F |id
-
AnalyseLR(0)
Onpeutdterminisercetautomate:lestatssontalorsdesensemblesd'items(l'ideestdediffrerlechoixd'uneproductionlorsdel'expansion).
OnluiassociealorsunnouvelautomatepilereconnaissantlelangagedeG
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:
si[N.t]Qet[N.]Q,quefaireenvoyantt? Reducereduce:
si[N.]Qet[N'.]Q,quefaire? SiaucuntatQneprsentecerisque,alorsonaunegrammaire
LR(0).
-
GrammairesSLR,LALR
Sinon:pourchaquetatQetchaqueitem[N.]Q,ondfinitunensembledeprvision:terminauxdevantlesquelsonpeutchoisircetitempourrduire.
Casgnral:rductionde(Q::...,t.w)par[N.]Q
sitprvision(Q,[N.]) SLR(1):prvision({[N.],...},[N.])=suivant(N)
rductionde(Q::...,t.w)par[N.]Qsitsuivant(N).
LALR(1):prvision(Q,[N.])={t|onpeutlireuntetaccepterunmot,sachantqu'onvientdereconnatreunNetqu'onestdansQ}
rductionde(Q::...,t.w)par[N.]Qs'ilexisteunedrivationdroiteS * 'Ntwavec{[S' .S ]}'N * Qdansl'automate.
UnegrammaireestSLR(1)(respectivementLALR(1))sionlveainsitouslesconflits.
-
Concrtement:Yacc,(Bison,Ocamlyacc)
Yacc:Yetanothercompilercompiler
Oncritunegrammaireavecunefonctionassociechaqueproduction.
Onobtientunprogrammequiprendunfluxdetokensetretournel'attributcalculparlesfonctions(arbredesyntaxeabstraite).
Remarque:cesoutilsacceptentdesdclarationsdeprioritetassociativitquipermettentdelevercertainesambigutssanschangerlagrammaire.
expr:|WHILEexprDOexprDONE {Pexp_while($2,$4)}|LPARENexprRPAREN {$2}