460 likes | 568 Vues
Parsing. Situering Contextvrije grammatica’s Predictive (of recursive-descent) parsing LR-parsing Parser generator: Yacc Error recovery. Situering Contextvrije grammatica’s Predictive (of recursive-descent) parsing LR-parsing Parser generator: Yacc Error recovery. Situering.
E N D
Situering • Contextvrijegrammatica’s • Predictive (of recursive-descent) parsing • LR-parsing • Parser generator: Yacc • Error recovery
Situering • Contextvrijegrammatica’s • Predictive (of recursive-descent) parsing • LR-parsing • Parser generator: Yacc • Error recovery
Situering • Contextvrijegrammatica’s • Predictive (of recursive-descent) parsing • LR-parsing • Parser generator: Yacc • Error recovery
Contextvrijegrammatica’s • Afleidingenstaancentraal • Beschouwvolgende regels: • “S”, “E” en “L” zijn non-terminals • “id”, “print”, “num”, enz. zijn terminals
Afleiding van eenzin: id := num; id := id + (id := num + num, id)
Elimineren van ambiguïteit: Luktnietvoorallecontextvrijetalen!
Situering • Contextvrijegrammatica’s • Predictive (of recursive-descent) parsing • LR-parsing • Parser generator: Yacc • Error recovery
FIRST en FOLLOW sets • FIRST(γ): alle terminals die aan het begin van eenafleidinguitγkunnenstaan • FOLLOW(X): alle terminals die direct kunnenvolgen op eenafleidinguit X • zij X een non-terminal en a een terminal • in S -> αXaβ is a ∈ FOLLOW[X]
Initialiseervoorelke terminal Z: FIRST[Z] = {Z} for alleafleidingsregels X -> Y1Y2… Yk fori = 1..k for j = i+1..k if alle Yizijnnullable thennullable[X] = true if Y1 … Yi-1zijnnullable then FIRST[X] = FIRST[X] ∪ FIRST[Yi] if Yi+1 … Ykzijnnullable then FOLLOW[Yi] = FOLLOW[Yi] ∪ FOLLOW[X] if Yi+1 … Yj-1zijnnullable then FOLLOW[Yi] = FOLLOW[Yi] ∪ FIRST[Yj] Herhaal tot FIRST, FOLLOW ennullablenietzijnveranderdtijdensdezeiteratie
Predictive parsing table voorgaandegrammatica: • Voer regel X -> γ in: • in rij X, kolom T vooralle T ∈ FIRST(γ) • alsγ de lege string kanafleiden, danook in rij X kolom T vooralle T ∈ FOLLOW[X] • Indiener in elkecel maar één regel staat, is de grammatica LL(1)
Error recovery voor predictive parsing • Door invoegenvan geldige token • Gevaarvooroneindiglangefoutherstel • Door verwijderen • Sla tokens over tot een token in FOLLOW bereikt is
Situering • Contextvrijegrammatica’s • Predictive (of recursive-descent) parsing • LR-parsing • Parser generator: Yacc • Error recovery
LR-parsing LR(k)-parsing: onderhoudeen stack, kijk k tokens vooruit in de input Terminologie: • Shift: duw token van input op de stack • Reduce: neem exact die tokens van de rechterzijde van een regel weg van de stack, duwsymbool van linkerzijde van die regel op stack
LR(0) parser generator • Gegevengrammatica:
Beschouw: • Dit is eentoestand: • Eenproductieregel is eenitem • Punt: huidige positive van de parser
Zij I eentoestanden X eensymboolaan de rechterzijde van eenproductieregel: Closure(I) = repeat foralle items A -> α.Xβ in I for alleproductieregels X -> γ I <- I ∪ { X -> .γ } until I verandertniet return I Goto(I,X) = J <- { } foralle items A -> α.Xβ in I J <- J ∪ { A -> αX.β } return Closure(J)
Zij T eenverzamelingtoestanden ComputeR(T) = R <- { } for elketoestand I in T forelke item A -> α. in I R <- R ∪ { (I, A -> α) } Voeg de acties in R toe aan T
Volledigalgoritme Zij T de toestandenen E de bogen T <- { Closure( { S’ -> .S$ } ) } E <- { } repeat for elketoestand I in T for alle items A -> α.Xβ in I J <- Goto(I,X) T <- T ∪ { J } E <- E ∪ { I ->x J } until E en T veranderenniet in dezeiteratie VoerComputeR(T) uit
LR(1) parser generator • Uitbreiding concept van item: • (A -> α.β, x) • αbovenaan de stack, x is lookaheadsymbool
Closure(I) = repeat foralle items (A -> α.Xβ, z) in I for alleproductieregels X -> γ foralle w ∈ FIRST(βz) I <- I ∪ { (X -> .γ, w) } until I verandertniet return I Goto(I,X) = J <- { } foralle items (A -> α.Xβ, z) in I J <- J ∪ { (A -> αX.β, z) } return Closure(J)
ComputeR(T) = R <- { } for elketoestand I in T forelke item (A -> α., z) in I R <- R ∪ { (I, z, A -> α) } Voeg de acties in R toe aan T
LR(1) enambiguïteiten • Beschouw: S -> if E then S else S S -> if E then S S -> other • Hoe het volgendeinterpreteren? if a then if b then s1 else s2
Situering • Contextvrijegrammatica’s • Predictive (of recursive-descent) parsing • LR-parsing • Parser generator: Yacc • Error recovery
Parser generator: Yacc parser declarations %% grammar rules %% programs
Operator precedentie • Bovenaan de stack: E * E, lookahead: + • Shift leidt tot E * (E + E) • Reduce leidt tot (E * E) + E -> wenselijk • Dus: los conflict op door voorkeuraan reduce
Associativeit • Indien links-associativiteitgewenst: reduce • Indien de programmeurexplicietmoetzijn: non-associativiteit • Yacc-directievenvoorprecedentie: %nonassoc EQ NEQ %left PLUS MINUS %left TIMES DIV %right EXP • Volgorde van directieven van belang!
Conflict: booleaansevariabele of arithmetischevariabele? • Semantische analyse moetuitsluitselgeven
Situering • Contextvrijegrammatica’s • Predictive (of recursive-descent) parsing • LR-parsing • Parser generator: Yacc • Error recovery
Error recovery • Local error recovery: introduceer error-recovery productions, bv. in: exp -> ID exp -> exp + exp exp -> ( exps ) exps -> exp exps -> exps ; exp • Voeg toe: exp -> ( error ) exps -> error ; exp
Globaalfoutherstel • Doel: vindkleinste set toevoegingenenverwijderingen om bronstring om tevormen tot syntactischcorrecte string
Burke-Fisher foutherstel • Bijfoutdetectieop positie A: probeerallemogelijkeherstellingen van token A – K tot A • Hersteldattoelaat het versteteparsenna de fout is de beste (men neemtvaakgenoegen met 4 positiesna de fout)
Voorstelexamenvragen • Leg uit hoe Burke-Fisher foutherstelwerkt. Watzoueenmogelijkeredenkunnenzijn om ditteverkiezenbovenlokaalfoutherstel? • (gegeven output in de vorm van eentoestandsmachine door Yacc met een shift/reduce-conflict; er is ookgegevenaanwelkeprecedentieregelsalleoperatorenmoetenvoldoen) Hoe zoujij het conflict gesignaleerd in onderstaandetoestandsmachineoplossen? Leg je redeneringuit. • (gegeveneencontextvrijegrammatica) Is de volgendecontextvrijegrammatica LL(1)? Beargumenteer je antwoord.