De presentatie wordt gedownload. Even geduld aub

De presentatie wordt gedownload. Even geduld aub

Parsing 1. Situering Contextvrije grammatica’s Predictive (of recursive-descent) parsing LR-parsing Parser generator: Yacc Error recovery 2.

Verwante presentaties


Presentatie over: "Parsing 1. Situering Contextvrije grammatica’s Predictive (of recursive-descent) parsing LR-parsing Parser generator: Yacc Error recovery 2."— Transcript van de presentatie:

1 Parsing 1

2 Situering Contextvrije grammatica’s Predictive (of recursive-descent) parsing LR-parsing Parser generator: Yacc Error recovery 2

3 Situering Contextvrije grammatica’s Predictive (of recursive-descent) parsing LR-parsing Parser generator: Yacc Error recovery 3

4 Situering 4

5 Contextvrije grammatica’s Predictive (of recursive-descent) parsing LR-parsing Parser generator: Yacc Error recovery 5

6 Contextvrije grammatica’s Afleidingen staan centraal Beschouw volgende regels: 6 “S”, “E” en “L” zijn non-terminals “id”, “print”, “num”, enz. zijn terminals

7 Afleiding van een zin: id := num; id := id + (id := num + num, id) 7

8 Ambiguïteiten 8

9 Elimineren van ambiguïteit: Lukt niet voor alle contextvrije talen! 9

10 Situering Contextvrije grammatica’s Predictive (of recursive-descent) parsing LR-parsing Parser generator: Yacc Error recovery 10

11 Predictive (of recursive-descent) parsing 11

12 FIRST en FOLLOW sets FIRST(γ): alle terminals die aan het begin van een afleiding uit γ kunnen staan FOLLOW(X): alle terminals die direct kunnen volgen op een afleiding uit X – zij X een non-terminal en a een terminal – in S -> αXaβ is a ∈ FOLLOW[X] 12

13 Initialiseer voor elke terminal Z: FIRST[Z] = {Z} for alle afleidingsregels X -> Y 1 Y 2 … Y k for i = 1..k for j = i+1..k if alle Y i zijn nullable then nullable[X] = true if Y 1 … Y i-1 zijn nullable then FIRST[X] = FIRST[X] ∪ FIRST[Y i ] if Y i+1 … Y k zijn nullable then FOLLOW[Y i ] = FOLLOW[Y i ] ∪ FOLLOW[X] if Y i+1 … Y j-1 zijn nullable then FOLLOW[Y i ] = FOLLOW[Y i ] ∪ FIRST[Y j ] Herhaal tot FIRST, FOLLOW en nullable niet zijn veranderd tijdens deze iteratie 13

14 Predictive parsing table voorgaande grammatica: 14 Voer regel X -> γ in: in rij X, kolom T voor alle T ∈ FIRST(γ) als γ de lege string kan afleiden, dan ook in rij X kolom T voor alle T ∈ FOLLOW[X] Indien er in elke cel maar één regel staat, is de grammatica LL(1)

15 Error recovery voor predictive parsing Door invoegen van geldige token – Gevaar voor oneindig lange foutherstel Door verwijderen – Sla tokens over tot een token in FOLLOW bereikt is 15

16 Situering Contextvrije grammatica’s Predictive (of recursive-descent) parsing LR-parsing Parser generator: Yacc Error recovery 16

17 LR-parsing LR(k)-parsing: onderhoud een 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, duw symbool van linkerzijde van die regel op stack 17

18 18

19 19

20 LR(0) parser generator Gegeven grammatica: 20

21 Beschouw: 21 S’ ->.S$ S ->.x S ->.(L) Dit is een toestand: Een productieregel is een item Punt: huidige positive van de parser

22 Zij I een toestand en X een symbool aan de rechterzijde van een productieregel: Closure(I) = repeat for alle items A -> α.Xβ in I for alle productieregels X -> γ I.γ } until I verandert niet return I Goto(I,X) = J <- { } for alle items A -> α.Xβ in I J αX.β } return Closure(J) 22

23 Zij T een verzameling toestanden ComputeR(T) = R <- { } for elke toestand I in T for elke item A -> α. in I R α) } Voeg de acties in R toe aan T 23

24 Volledig algoritme Zij T de toestanden en E de bogen T.S$ } ) } E <- { } repeat for elke toestand I in T for alle items A -> α.Xβ in I J <- Goto(I,X) T <- T ∪ { J } E x J } until E en T veranderen niet in deze iteratie Voer ComputeR(T) uit 24

25 25

26 26

27 LR(1) parser generator Uitbreiding concept van item: – (A -> α.β, x) – α bovenaan de stack, x is lookahead symbool 27

28 Closure(I) = repeat for alle items (A -> α.Xβ, z) in I for alle productieregels X -> γ for alle w ∈ FIRST(βz) I.γ, w) } until I verandert niet return I Goto(I,X) = J <- { } for alle items (A -> α.Xβ, z) in I J αX.β, z) } return Closure(J) 28

29 ComputeR(T) = R <- { } for elke toestand I in T for elke item (A -> α., z) in I R α) } Voeg de acties in R toe aan T 29

30 30

31 LR(1) en ambiguïteiten Beschouw: S -> if E then S else S S -> if E then S S -> other Hoe het volgende interpreteren? if a then if b then s1 else s2 31

32 Situering Contextvrije grammatica’s Predictive (of recursive-descent) parsing LR-parsing Parser generator: Yacc Error recovery 32

33 Parser generator: Yacc parser declarations % grammar rules % programs 33

34 34

35 35

36 Operator precedentie 36 Bovenaan de stack: E * E, lookahead: + Shift leidt tot E * (E + E) Reduce leidt tot (E * E) + E -> wenselijk Dus: los conflict op door voorkeur aan reduce

37 Associativeit Indien links-associativiteit gewenst: reduce Indien de programmeur expliciet moet zijn: non-associativiteit Yacc-directieven voor precedentie: %nonassoc EQ NEQ %left PLUS MINUS %left TIMES DIV %right EXP Volgorde van directieven van belang! 37

38 38

39 Syntax vs semantiek 39

40 Conflict: booleaanse variabele of arithmetische variabele? Semantische analyse moet uitsluitsel geven 40

41 Situering Contextvrije grammatica’s Predictive (of recursive-descent) parsing LR-parsing Parser generator: Yacc Error recovery 41

42 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 42

43 Globaal foutherstel Doel: vind kleinste set toevoegingen en verwijderingen om bronstring om te vormen tot syntactisch correcte string 43

44 Burke-Fisher foutherstel Bij foutdetectie op positie A: probeer alle mogelijke herstellingen van token A – K tot A Herstel dat toelaat het verste te parsen na de fout is de beste (men neemt vaak genoegen met 4 posities na de fout) 44

45 45

46 Voorstel examenvragen Leg uit hoe Burke-Fisher foutherstel werkt. Wat zou een mogelijke reden kunnen zijn om dit te verkiezen boven lokaal foutherstel? (gegeven output in de vorm van een toestandsmachine door Yacc met een shift/reduce-conflict; er is ook gegeven aan welke precedentieregels alle operatoren moeten voldoen) Hoe zou jij het conflict gesignaleerd in onderstaande toestandsmachine oplossen? Leg je redenering uit. (gegeven een contextvrije grammatica) Is de volgende contextvrije grammatica LL(1)? Beargumenteer je antwoord. 46


Download ppt "Parsing 1. Situering Contextvrije grammatica’s Predictive (of recursive-descent) parsing LR-parsing Parser generator: Yacc Error recovery 2."

Verwante presentaties


Ads door Google