1 / 46

Parsing

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.

Télécharger la présentation

Parsing

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Parsing

  2. Situering • Contextvrijegrammatica’s • Predictive (of recursive-descent) parsing • LR-parsing • Parser generator: Yacc • Error recovery

  3. Situering • Contextvrijegrammatica’s • Predictive (of recursive-descent) parsing • LR-parsing • Parser generator: Yacc • Error recovery

  4. Situering

  5. Situering • Contextvrijegrammatica’s • Predictive (of recursive-descent) parsing • LR-parsing • Parser generator: Yacc • Error recovery

  6. Contextvrijegrammatica’s • Afleidingenstaancentraal • Beschouwvolgende regels: • “S”, “E” en “L” zijn non-terminals • “id”, “print”, “num”, enz. zijn terminals

  7. Afleiding van eenzin: id := num; id := id + (id := num + num, id)

  8. Ambiguïteiten

  9. Elimineren van ambiguïteit: Luktnietvoorallecontextvrijetalen!

  10. Situering • Contextvrijegrammatica’s • Predictive (of recursive-descent) parsing • LR-parsing • Parser generator: Yacc • Error recovery

  11. Predictive (of recursive-descent) parsing

  12. 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]

  13. 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

  14. 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)

  15. Error recovery voor predictive parsing • Door invoegenvan geldige token • Gevaarvooroneindiglangefoutherstel • Door verwijderen • Sla tokens over tot een token in FOLLOW bereikt is

  16. Situering • Contextvrijegrammatica’s • Predictive (of recursive-descent) parsing • LR-parsing • Parser generator: Yacc • Error recovery

  17. 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

  18. LR(0) parser generator • Gegevengrammatica:

  19. Beschouw: • Dit is eentoestand: • Eenproductieregel is eenitem • Punt: huidige positive van de parser

  20. 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)

  21. 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

  22. 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

  23. LR(1) parser generator • Uitbreiding concept van item: • (A -> α.β, x) • αbovenaan de stack, x is lookaheadsymbool

  24. 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)

  25. 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

  26. 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

  27. Situering • Contextvrijegrammatica’s • Predictive (of recursive-descent) parsing • LR-parsing • Parser generator: Yacc • Error recovery

  28. Parser generator: Yacc parser declarations %% grammar rules %% programs

  29. 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

  30. 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!

  31. Syntax vs semantiek

  32. Conflict: booleaansevariabele of arithmetischevariabele? • Semantische analyse moetuitsluitselgeven

  33. Situering • Contextvrijegrammatica’s • Predictive (of recursive-descent) parsing • LR-parsing • Parser generator: Yacc • Error recovery

  34. 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

  35. Globaalfoutherstel • Doel: vindkleinste set toevoegingenenverwijderingen om bronstring om tevormen tot syntactischcorrecte string

  36. 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)

  37. 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.

More Related