INF5110 V2012 Kapittel 4: Parsering ovenfra-ned

Like dokumenter
Kap. 4 del I Top Down Parsering INF5110 v2006. Stein Krogdahl Ifi, UiO

INF5110 V2013 Stoff som i boka står i kap 4, men som er generelt stoff om grammatikker

Stoff som i boka står i kap 4, men som er. 10. Februar Ifi, UiO

Stoff som i boka står i kap 4, men som er

Kap.4 del I Top Down Parsering INF5110 v2005. Arne Maus Ifi, UiO

Kap. 4, del I: Top Down Parsering Pluss oppgave til kapittel 3 INF5110 V2008

Kap. 4: Ovenfra-ned (top-down) parsering

INF5110, onsdag 19. februar, Dagens tema: Parsering ovenfra-ned (top-down)

Hovedstoffet i kap 4: 16. Februar Ifi, UiO

Hovedstoffet i kap 4:

INF5110, tirsdag 5. februar, Dagens temaer: - Oppgaver til kap. 3 Svar ligger på slutten av foilene, men forsøk deg først selv!!

Kap.4, del 2: Top Down Parsering Kap. 5, del 1: Bottom Up Parsing INF5110, 7/ Legger ut en oppgave til kap. 4 (se beskjed).

Kap.4 del 2 Top Down Parsering INF5110 v2005. Arne Maus Ifi, UiO

Oppgaver til INF 5110, kapittel 4, med svarforslag Gjennomgås tirsdag 21. febr. 2012

Kap. 5, Del 2: INF / (og 2/3 og 3/3)

Dagens Tema: Grammatikker Kap. 3 i K. C. Louden

Kap. 5, Del 2: SLR(1), LR(1)- og LALR(1)-grammatikker INF /2-2011

Oppgaver til INF 5110, kapittel 4, med svarforslag Gjennomgått torsdag 14. febr Disse foilene er justert 15/2, kl. 11

Topic of the day: Ch. 4: Top-down parsing

INF januar Forelesninger fremover:

INF 5110, 3. februar Dette foilheftet: Kapittel 3

Kontekstfrie grammatikker og syntaksanalyse (parsering)

Hvor er vi nå - kap. 3 (+4,5)? Forenklet skisse av hva en parser gjør PARSER. Kontekstfrie grammatikker og syntaksanalyse (parsering)

Kap. 5, del 1: Parsering nedenfra-opp (Bottom up parsing) INF5110. Stein Krogdahl Ifi, UiO

Dagens Tema: Grammatikker Kap. 3 i K. C. Louden

INF / Kap. 5, Del 2 Stein Krogdahl, Ifi, UiO

Oppgave 2. INF5110 oppgave 2 på eksamen v04 med teori. FirstMengder. Arne Maus Ifi. Eks. 4.9 Beregning av First-mengde. terminal

Kap. 5, Del 3: INF5110, fra 1/3-2011

Kap. 5, del 1: Parsering nedenfra-opp (Bottom-up parsering) INF / Stein Krogdahl Ifi, UiO

Dagens Tema: Grammatikker

INF /2, 2015 Kap. 5, Del 2 Stein Krogdahl, Ifi, UiO

INF5110, 15/ Dagens temaer: Avslutning kap. 4 Begynne på kap. 5 Se på oppgave. Stein Krogdahl, Ifi UiO

Kap. 5, del 2 LR(1)- og LALR(1)-grammatikker INF5110 V2008

Dagens Tema: Grammatikker

Kontekstfrie grammatikker og syntaksanalyse (parsering)

Dagens Tema: Grammatikker Kap. 3 i K. C. Louden

Syntaksanalyse. Skanner (repetisjon) Parsering top-down bottom-up LL(1)-parsering Recursive descent Forutsetninger. IN 211 Programmeringsspråk

Bottom up parsering (nedenfra-og-opp) Kap. 5 del 1 Intro til parsering nedenfra-og-opp samt LR(0) og SLR(1) grammatikker INF5110 v2006

INF5110 Kap. 5: Parsering nedenfra-og-opp (Bottom-up parsing) 21/ Stein Krogdahl Ifi, UiO. Angående Oblig 1:

Kap. 5, Del 2: SLR(1), LR(1)- og LALR(1)-grammatikker INF5110 V2009

Semantisk Analyse del I

Dagens tema Syntaks (kapittel Komp. 47, kap. 1 og 2)

Litt om kompilering og interpretering. Dagens tema Syntaks (kapittel Komp. 47, kap. 1 og 2) Syntaks og semantikk

Kontekstfrie grammatikker og syntaksanalyse (parsering)

Kap. 5 del 2: LR(1)- og LALR(1)-grammatikker INF5110 V2005. Stein Krogdahl, Ifi, UiO

INF3110 Programmeringsspråk

Oppgaver til INF 5110, kapittel 5

Statisk semantisk analyse - Kap. 6

Statisk semantisk analyse - Kap. 6

Kap. 5: Oppgaver m.m. (Noen lysark fra tidligere er gjentatt her) Stein Krogdahl, Ifi, UiO 8. Mars 2007

Repetisjon. 1 binærtall. INF3110 Programmeringsspråk. Sist så vi ulike notasjoner for syntaks: Jernbanediagrammer. BNF-grammatikker.

Kap. 5, del 1: Parsering nedenfra-opp (Bottom-up parsering) 16/ Stein Krogdahl Ifi, UiO

Syntax/semantics - I INF 3110/ /29/2005 1

Oppgaver til INF 5110, kapittel 5 Fullt svar på oppgave 5.4, og en del andre oppgaver med svar

Oppgaver til INF 5110, kapittel 5, med svarforslag Gjennomgått torsdag 26. febr Dette er versjon fra 28/7

INF2820 Datalingvistikk V Gang Jan Tore Lønning

INF2820 Datalingvistikk V2012. Jan Tore Lønning

Statisk semantisk analyse - Kap. 6 Foiler ved Birger Møller-Pedersen (Forelest 10/3 og 12/ av Stein Krogdahl)

Spørsmål og svar rundt oblig 1 og verktøy

Med rettelser til oppgave 5.18, gjort 3/3

Syntax/semantics INF 3110/ /8/2004 1

Kodegenerering, del 2: Resten av Kap. 8 pluss tilleggsnotat (fra kap. 9 i ASU ) INF5110 V2007

INF mai 2014 Stein Krogdahl, Ifi, UiO

UNIVERSITETET I OSLO

Språktyper og syntaksanalyseteknikker. Dagens temaer. Hvordan lage en deterministisk automat? Fra jernbanediagram til ID-automat

INF april, 2013 Kap. 8 Noen oppgaver som er meget relevante for Oblig 2

INF2820 Datalingvistikk V Gang Jan Tore Lønning

INF2820 Datalingvistikk V2012

MAT1030 Diskret Matematikk

2/24/2012. Context-Free Grammars. I dag. Avledning. Eksempel: grammar1 PARSING. Jan Tore Lønning

Slides til 12.1 Formelt språk og formell grammatikk

UNIVERSITETET I OSLO

Med Svarforslag UNIVERSITETET I OSLO. Det matematisk-naturvitenskapelige fakultet. 3 sider (side 6, 7 og 8, rives ut, fylles ut og leveres)

Dagens tema: Regulære språk og uttrykk

Oppgave 2. Eksamen INF2820, 2015, oppgave 2. La gramatikk G være:

INF2820 Datalingvistikk V2011. Jan Tore Lønning & Stephan Oepen

INF oktober Stein Krogdahl. Kap 23.5: Trær og strategier for spill med to spillere

Sist forelesning snakket vi i hovedsak om trær med rot, og om praktisk bruk av slike. rot. barn

MAT1030 Diskret matematikk

Anatomien til en kompilator - I

Hjemmeeksamen 1 i INF3110/4110

INF2820 Datalingvistikk V Gang 9.3 Jan Tore Lønning

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Beskrivelse av programmeringsspråket Compila15 INF Kompilatorteknikk Våren 2015

UNIVERSITETET I OSLO

Obligatorisk Oppgave 1

INF Repetisjon: Hvordan bygge treet og analysere? 8. september Typisk situasjon. De problematiske syntaks-diagrammene

INF2820 Datalingvistikk V Gang 9.3 Jan Tore Lønning

INF2820 Datalingvistikk V Gang 26.2 Jan Tore Lønning

6. oktober Dagens program: Første time: Andre time, gjesteforelesning: Uavgjørbarhet. Stein Krogdahl. (Ikke pensum, egne foiler legges ut)

Oppgaver til kodegenerering etc. INF-5110, 12. mai, 2015

INF2820 Datalingvistikk V2011. Jan Tore Lønning & Stephan Oepen

Obligatorisk oppgave 1 INF Kompilatorteknikk Våren 2012 Frist mandag 19. mars

INF Algoritmer og datastrukturer

INF2820 Datalingvistikk V2012. Jan Tore Lønning

Oversikt. Praktisk. Litt om meg. Obligatorisk oppgave 1 - Kort om oppgaven og verktøyene. Fredrik Sørensen OMS-gruppen, IfI.

INF INF1820. Arne Skjærholt INF1820. Dagens språk: Russisk. dyes yataya l yektsiya. Arne Skjærholt. десятая лекция

Transkript:

INF5110 V2012 Kapittel 4: Parsering ovenfra-ned (top-down) Tirsdag 7. februar Stein Krogdahl, Ifi, UiO Oppgaver som gjennomgås i morgen, onsdag: -Spørsmålene på de to siste foilene fra onsdag 1/2 (Bl.a. lag et subklassehierarki som ville passe for nodene i et abstrakt syntakstre for Tiny) -Formuler en entydig uttrykks-grammatikk som også har (høyreassosiativ) eksponering - Beskriv en algoritme som finner alle de ikke-terminaler som kan produsere den tomme streng (uten også å finne First-mengden). Vi kaller dem utnullbare. 1

Dagens temaer Noe avsluttende fra sist (se lysark fra da) First og Follow-mengder Vi tar det i en litt annen rekkefølge øg enn i boka Vi starter i dag med First-mengder Follow-mengder kommer kanskje ikke i dag Begynnende om parsering ovenfra-ned (top-down) Recursive descent-metoden To greie transformasjoner på grammatikker Fjerning av venstre-rekursjon Venstre-faktorisering 2

Litt om kapittel 4, og LL(1)-grammatikker Det under bør leses om igjen etter hele kapittel 4! LL(1)-parsering og boka og pensum: Det som i boka kalles LL(1)-parsering (4.2.1, 4.2.2 og 4.2.4) er en metode for top-down parsering med en eksplisitt stakk. Dette er ikke med som pensum. Vi ser i dette kapittelet mest på recursive descent -parsering, en intuitiv metode som mange sikkert har vært litt borti (INF2100, ++) Ofte brukes betegnelsen LL(1)-parsering også om rec. desc. - metoden brukt ut fra syntaksdiagrammer, EBNF eller ren BNF, men man har da gjerne et ikke-teknisk forhold til om ting helt sikkert fungerer riktig. Vi skal se på det tekniske kravet for at en ren BNF-grammatikk kan parseres rett fram med rec. desc. -metoden. LL(1)-grammatikk i vår betydning: Det er en ren BNF-grammatikk som tilfredstiller kravet fra forrige punkt 3

First og Follow-mengder, hvorfor? For visse typer syntaksanalyse er det nødvendig å vite hvilke terminalsymboler l som kan komme først i strenger som er avledet fra en ikketerminal A. Denne mengden kalles First(A). F.eks. vil First(if-setning) i de fleste språk være bare nøkkelordet if, mens First(tilordning) ofte vil være mengden {navn, ( } Tilsvarende vil vi få behov for å vite hvilke terminaler som kan følge etter en gitt ikketerminal A i en eller annen setningsform (= halvutviklet setning ) i språket. Denne mengden kalles Follow(A) F.eks vil Follow(statement) i Tiny-språket (eller snarere i den gitte grammatikken for Tiny-språket) være mengden { ;, end, else, until } Vi skal se på generelle algoritmer for å finne First- og Follow-mengdene for alle ikke-terminaler i en gitt grammatikk Det som kompliserer disse algoritmene noe er produksjoner av typen A ε, som også gjør at vi kan få B * ε, selv om ikke B εdirekte. Slike ikketerminaler A eller B sies å være utnullbare ( nullable ) 4

Enkel og kompliserte situasjoner: First-mengder a First(A) a First(A) A A C D E F G H a L J K B C D E M N ε ε ε F G H ε a J K Her er både B, M, N, C og F utnullbare. Vi markerer det ved å la deres First-mengde Angir informasjonsflyt fl inneholde ε under algoritmen

First-mengder terminal { First (A) = { a finnes avledning A * a α } Def.: Dessuten: Om A er utnullbar, så er ε First(A) Pr. def. For terminal-symboler: First(a) = { a} Def.: A er utnullbar hvis og bare hvis A * ε Tar vi som algoritme for å finne First( ), se nederst. Algoritme: Gjør steg 1. Gjenta steg 2 til alle Firstmengdene har stabilisert seg. Vi snakker altså også om First av en hel streng α av terminaler og ikketerminaler 6

Eks. 4.9 Beregning av First-mengde Kan fylle ut en tabell: exp addop + term multop * factor ( n First ( n ( n NB: Kan godt ta reglene i vilkårlig rekkefølge, frem og tilbake til det roer seg.

Eksempel: Rec. desc. av ren BNF Neste token Global variabel if a + b * ( c + d ) <= Hoved-idé: Skriv en funksjon/ prosedyre/metode for hver ikke-terminal La denne finne riktig alternativ (helst fra bare førstkommende token), og gjør parsering av den videre input ut fra det Typisk rec.decentprosedyre for siste produksjon over, og den blir veldig enkel. Sjekker at angitt terminal kommer, og om OK, leser inn neste. Brukes ofte for bare å lese (vet riktig tegn kommer). Da er det egentlig nok å kalle gettoken (men i boka kalles alltid match ) 8

Situasjonen under rekursiv parsering Kalles altså top down -parsering (ovenfra-ned-parsering) Trekantene er metode-kall S C B A LL(1)-filosofi: Metoden for en ikke- terminal (her A) kan alltid, ved hjelp av (bare) inneværende token, avgjøre hvilket alternativ som skal brukes for den aktuelle ikke-terminalen. Vi må da formelt sett se på First-mengdene til hvert alternativ. Mer om det siden. Hvilket alternativ for A? Input Analysert og funnet OK token Skal matches mot resten av det valgte alternativ for A 9

Ved litt mer kompliserte tilfeller virker ikke ren BNF bra, men med venstrefaktorisering eller EBNF går det her greit Opprinnelig Skrives ut som: R-D-prosedyre: NB: Kunne også bruke venstre-faktorisering. Da ville dette bli en egen prosedyre elsepart : ifstmt if (exp) stmt elsepart elsepart ε else stmt 10

Venstre-rekursjon gir problemer ved ren BNF. Men ofte bedre med EBNF Gir lett uendelig mange rekursive kall ( rekursjons-brønn ) rekursjonsbrønn exp exp addop term term Bruker EBNF: term term multop factor factor exp term + - term factor *

Hvordan lage noe under rec.-decent parsering? Mål: Ønsker å bygge abstrakt syntaks-tre tre Men foreløpig (som kan være forvirrende!): beregner verdien av et uttrykk (med venstre-assosiativitet) Kall! Kan lett bygges ut til full kalkulator 3 + 4 + 5 12

Bygging g av abstrakt syntaks-tre NB: Kall Alternativt: newtemp.leftchild NB: Kall Merk: Dersom det bare er én term, så lages ingen ny node. Vi leverer den vi har fått 13

Skriv prosedyre med trebygging g for: factor (exp) number function factor: syntaxtree; var fact: syntaxtree; begin case token of ( : number : else error(...) ; end case; return fact; end factor;

Prosedyre med trebygging g for: factor (exp) number function factor: syntaxtree; var fact: syntaxtree; begin case token of ( : match ( ( ( ); fact = exp ; match ( ) ) ; number : fact = makenumbernode(number) ; match (number ); else error(...) ; end case; return fact; end factor; Gir dummy-test

Parsering av if-setning, med tre-generering g if-stmt -> if (exp) stmt [else stmt] StmntNode (if) testchild thenchild elsechild := nil a b c + b 1 16

Et par greie transformasjoner For noen typer syntaksanalyse er det altså visse krav til grammatikken for at metoden skal fungere. To vanlige krav er: Grammatikken må ikke ha venstrerekursjon Altså, det må ikke finnes produksjoner av typen: A A α F.eks. går da ikke: expr expr + term term Grammatikken må ikke ha noen B (ikke-terminal), slik at to alternativer for B starter på samme måte. Altså, det må ikke finnes slike: B α β α γ α ε F.eks. går da ikke: if-setn if (bet) setn-sekv end if (bet) setn-sekv else setn-sekv end 17

Fjerning av venstre-rekursjon - case 1 Kan skrives på EBNF A Aα β A β {α} Eksempel: A A A α β A A α α A A α α A A β A A αa ε β ε NB: Litt dumt, siden den opprinnelige venstreassossiative strukturen forsvinner. Må ev. korrigeres for. 18

Fjerning av venstre-rekursjon case 2 Case 2: Kan skrives: A -> ( β1 β2 βm) ( α1 α2 αn ) * 19

Eks. side 160 Fjerning av venstre-rekursjon Den tradisjonelle entydige grammatikken A Aα β A β A A αa ε Med fjernet venstre-rekursjon (beholder entydigheten, men ikke assossiativiteten): 20

Case 3 (indirekte venstre-rekursjon) A Ba Aa c B Bb Ab d Her er det feil i boka i algoritmen s.159 Ikke med som pensum Egner seg bare til maskinell behandling 21

Venstrefaktorisering, problemet B α β αγ Blir til: ------------------------------------------------------------ if-setn if (bet ) setn-sekv end if (bet ) setn-sekv else setn-sekv end Blir til: if-setn if (bet ) setn-sekv sek else-eller-endelle end else-eller-end else setn-sekv end end Blir til: ------------------------------------------------------------- if-setn if (bet ) setn end if (bet ) setn else setn if-setn if (bet ) setn else-eller-tomeller else-eller-tom else setn ε 22

Avansert venstre-faktorisering. Ikke pensum! Et litt mer komplisert tilfelle: A abcb abc ae abc ae Etter steg 1: A ab A ae A cb C Etter steg 2 A a A (og ferdig): A b A E A c B C } Gjenta så lenge det er muligheter } Velg lengst mulig prefiks Gjør som over. Pass på å få med alle alternativer med dette prefikset 23

Rec.decent etter tradisjonell fjerning av venstre-rekursjon (Treet blir nå høyre assosiativt istedenfor venstre. Det må korrigeres for, se senere) Uttrykk: 3 4 5 Det abstrakte syntakstreet vi Egentlig ønsket ønsket å lage: 24

Rec.decent etter tradisjonell fjerning av venstre-rekursjon Treet er nå høyre assosiativt istedenfor venstre. Det må korrigeres for. Lage tre eller beregne verdi : 3 4 5-6 3-6 4-1 -6 Det abstrakte syntakstreet vi ønsker å lage: 5-6 Parameter valuesofar til prosedyren exp For trebygging g ville den være: rootoftreesofar 25

Prosedyrer for beregning av verdi (tre-bygging g tilsvarende) Bare analyse Med beregning (trebygging g tilsvarende) NB.: Parameter ε -alternativet Leverer verdien uendret oppover igjen. 26

Vi har tatt First-mengder. Nå: Follow-mengder a First(A) A C D E F G H a L J K Angir informasjonsflyt under algoritmene a Follow(A) S $ B B C D E G H J K A a $ Follow(B) Det at B kan stå på slutten av en setnings-form markeres ved å la Follow-mengden til B inneholde $. Terminal-symbolet $ tenkes altså å stå på slutten av enhver setning. Vet fra før at a First(E) Merk: $ er alltid med i Followmengden til startsymbolet 27

Kompliserte situasjoner: First- og Follow-mengder a First(A) a Follow(A) A S $ B C D E M N ε ε ε F G H ε a J K B A C D E Her er både B, M, N, C og F utnullbare. Vi markerer det ved ål la deres First-mengde inneholde ε F G H J ε ε K A ε a 28

Beregning g av Follow-mengder β og γ er virkårlige strenger Def: Follow (A) = { a finnes avledning S * β A a γ } For stratsymbolet S er $ med i followmenden Dvs.: Det finnes en avledning fra setningsformen S $ til en setningsform hvor A kommer rett før a (a er en terminal) γ er utnullbar Algoritme: Gjør steg 1. Gjenta steg 2 og 3 til alle Follow- mengdene har stabilisert t seg. NB: Man må altså gjøre dette samlet for alle ikke-terminaler 29

Fra tidligere: Beregning av First-mengde Kan fylle ut en tabell: exp addop + term multop * factor ( n First ( n ( n NB: Kan godt ta reglene i vilkårlig rekkefølge, frem og tilbake til det roer seg.

Eksempel: Beregning av Follow-mengder mengder, 4.12 Kan fylle ut en tabell ved å gå fram og tilbake i grammatikken til det stopper: Follow exp $+ ) addop ( n term $ + * ) multop ( n factor $ + * ) 31