Hovedstoffet i kap 4:

Like dokumenter
Hovedstoffet i kap 4: 16. Februar Ifi, UiO

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

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

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 I: Top Down Parsering Pluss oppgave til kapittel 3 INF5110 V2008

INF5110 V2012 Kapittel 4: Parsering ovenfra-ned

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

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

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

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

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

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

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

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

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

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)

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

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

INF januar Forelesninger fremover:

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

Kontekstfrie grammatikker og syntaksanalyse (parsering)

INF 5110, 3. februar Dette foilheftet: Kapittel 3

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

Dagens Tema: Grammatikker

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

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

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

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

Dagens Tema: Grammatikker

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

INF april, 2013 Kap. 8 kodegenerering

INF og 23. april, 2014 Kap. 8 kodegenerering

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

Semantisk Analyse del I

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

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

Kontekstfrie grammatikker og syntaksanalyse (parsering)

Statisk semantisk analyse - Kap. 6

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

Statisk semantisk analyse - Kap. 6

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

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

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

UNIVERSITETET I OSLO

INF april, 2015 Kap. 8 kodegenerering. Del 2

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

Kontekstfrie grammatikker og syntaksanalyse (parsering)

Dagens tema. Hva er kompilering? Anta at vi lager dette lille programmet doble.rusc (kalt kildekoden): Hva er kompilering?

Kap. 8 del 1 kodegenerering INF5110 Vår2007

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

INF3110 Programmeringsspråk

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

Dagens tema. Hva er kompilering? Anta at vi lager dette lille programmet (kalt kildekoden): Hva er kompilering?

Obligatorisk Oppgave 1

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

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

Syntaksanalyse. Dagens tema: Språkdiagrammene Jernbanediagrammene er et ypperlig utgangspunkt for å analysere et program: INF2100 INF2100 INF2100

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

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

Obligatorisk Oppgave 1

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

Hva er kompilering? Dagens tema. En kompilator En kompilator leser Minila koden og lager Flok koden.

Dagens tema: INF2100. Syntaksanalyse. Hva annet gjør en kompilator? Sjekking av navnebruk. Testutskrifter

Pensumoversikt - kodegenerering. Kap. 8 del 1 kodegenerering INF5110 v2006. Hvordan er instruksjonene i en virkelig CPU? Arne Maus, Ifi UiO

Syntax/semantics INF 3110/ /8/2004 1

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

Oppgaver til INF 5110, kapittel 5

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

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

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

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

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

Oversikt Kompilering Syntaksanalyse Java Feilsjekking Oppsummering

UNIVERSITETET I OSLO

INF april, 2015 Stein Krogdahl Ifi, UiO. Svar på oppgaver til kap. 8. Ble lagt ut 24. april

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

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

Kap. 8 del 1 kodegenerering INF april, 2008

INF april, 2014 Stein Krogdahl Ifi, UiO. Svar på oppgaver til kap. 8

INF Noen oppgaver til kap. 8

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

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

INF Noen oppgaver til kap. 8

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Dagens tema: Sjekking

UNIVERSITETET I OSLO

Hjemmeeksamen 2 i INF3110/4110

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

Anatomien til en kompilator - I

Oppgaver til kodegenerering etc. INF-5110, 16. mai, 2014

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme

INF og 13. april, Stein Krogdahl, Ifi UiO

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

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

INF mai 2014 Stein Krogdahl, Ifi, UiO

Transkript:

INF5110, 15. februar 2011 Hovedstoffet i kap 4: Parsering ovenfra-ned ( top down ) Stein Krogdahl Ifi, UiO Forbedret endelig utgave, lagt ut 16/2 Oppgaver som gjennomgås i dag: -Spørsmålene på de to siste foilene fra tirsdag 8/2 (Bl.a. Lag et subklassehierarki som ville passe for nodene i et abstrakt syntakstre for Tiny) -Finn First- og Follow -mengdene til grammatikken i eksempelet på side 160 etter at venstre-rekursjon er fjernet (se også foil 16 fra 9/2) - Beskriv en algoritme som bare finner de utnullbare ikke-terminaler 1

Noen spørsmål om Tiny-grammatikken - Er grammatikken entydig? - Hva om vi vil tillate tomme setninger - Hva om vi vill ha semikolon etter og ikke mellom setningene? - Hva slags assossiativitet og presedens er det for operatorene? 2

Svar på spørsmålene på forrige foil Er grammatikken entydig? Dette er generelt uavgjørbart for generelle BNF-grammatikker Vi skal se på metode for å avgjøre det for mange praktiske grammatikker Denne er ihvertfall delt opp i presedens-nivåer, og har assossiativites- angivelse, og er nok derved entydig. If-setninger med både else og end er ikke noe problem for entydigheten (her sa jeg feil på forelesningen!). Hva om vi vil tillate tomme setninger Det er bare å sette til et tomt alternativ for statement Den ser ut til fremdeles å være entydig Hva om vi vil ha semikolon etter og ikke mellom setningene? Bytt ut reglen for stmt-sequence med: stmt-sequence - > stmt-sequence statement ; statement ; Hva slags assosiativitet og presedens er det for operatorene? Høyest presedens * / Venstre-assossiativ Midlere e presedens s + - Venstre-assossiativ e at Lavest presedens < = Ikke-assossiativitet (bare to operander) Kunne altså brukt flertydig grammatikk, med disse tilleggs-reglene 3

Abstrakt syntakstre for Tiny-programmet: Finn et klassehierarki for nodeklassene til en obj.-ori. utgave av dette treet! 4

Nodestruktur i C for Tiny If, Repeat, Assign, Read, Write - tegnes: Op, Const, id - tegnes: kind: attr: stm-kind / expr.-kind op p/ val / name Brukes bare for exp-kind Denne nodestrukturen passer enda bedre med et OO-språk med klasser /sublklasser som implementasjonsspråk. lineno: type: child: sibling: 5

Nodeklasser for OO-utgave av abst.-synt.-tre for Tiny-språket Merk: Dette er altså en fast subklasse-struktur i kompilatoren, og må ikke forveksles med det abstrakte syntaks-treet treet for et gitt program TreeNode int lineno Program Stmt firststmt Stmt Stmt nextstmt Expr Char type IfStmt Expr cond Stmt thenstmts Stmt elsestmts RepStmt Stmt stmt Expr cond AssStmt Ident id Expr ex ReadStmt Ident id WriteStmt Expr ex Const Int value Ident String name BinOp Char op Expr left Expr right Kan også ha (gjerne virtuelle) metoder i nodene, f.eks: - dosemanalyses(); Gjør semantisk analyse av noden, og av subtreet det er rot i - generatecode(); Genererer kode for noden, og for subtreet det er rot i 6

Tiny-grammatikken 7

Program lnr = 1 firststmt ReadStmt IfStmt lnr = 1 lnr = 2 nextstm nextstm x cond stm1 stmt2 Const lnr = 2 (type) 0 BinOp lnr = 2 (type) left < right Ident lnr = 2 (type) x lnr = 3 Assign nextstm fact ex lnr = 3 (type) 0 Merk at typen vanligvis ikke blir satt på før under semantikkanalysen, så den vil her stå tom. Ident = fact Assign lnr = 5 nextstm fact ex BinOp lnr = 5 (type) left * right RepStm lnr = 4 nextstm stm cond Ident= x Ident= x Assign lnr = 6 nextstm WriteStm lnr = 8 x ex BinOp lnr = 6 (type) nextstm ex left - right Const= 1 Ident lnr = 8 (type) fact 8

Abstrakt syntakstre for Tiny-programmet: 9

First og follow for transformert uttr.gram. Har fjernet venstre- rekursjon: Vi får da følgende First- og Follow-mengder: 10

Algoritme for å beregne mengden av utnullbare ikke-teminaler (kan gjøres først) Vi skal ha en mengde UNB av ikke-terminaler: Er fra starten tom Skal få nye elementer etter en regel 1 og 2 under Når den ikke øker mer er vi ferdig 1. Først legges alle ikke-terminaler A som har en produksjon A ->, inn i UNB 2. (Gjentas til det ikke blir mer forandring): Om en ikke-terminal A har en produksjon A -> B... D der alle B... D er ikke-terminaler som allerede er med i UNB, så legg også A inn i UNB. 11

Kap. 4: Parsering ovenfra-ned (top-down) Dette bør leses om igjen etter kapittelet: First og Follow-mengder Boka tar det et stykke uti kap 4, vi tok det først (forrige gang) 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 konsentrerer oss i dette kapittelet om 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 12

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, som blir veldig enkel. Sjekker at angitt terminal kommer, og leser til neste. Brukes ofte bare for å lese (sjekken må slå til). Da er det egentlig nok å kalle gettoken (men her kalles alltid match ) 13

Situasjonen under rekursiv parsering Kalles altså top down -parsering (ovenfra-ned-parsering) Trekantene er metode-kall S LL(1)-filosofi: Hver metode kan alltid ved hjelp av (bare) C førstkommende token, avgjøre hvilket alternativ som skal B brukes for den aktuelle ikke-terminalen i (her A) A Hvilket alternativ for A? Input Analysert og funnet OK token Skal matches mot resten av det valgte alternativ for A 14

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 15

Venstre-rekursjon gir problemer ved ren BNF. Men går ofte med EBNF Gir uendelig mange rekursive kall NB: Kan også fjerne venstre-rekursjon på trad. måte, se neste foil. exp exp addop term term Bruker EBNF: term term multop factor factor exp term + - term factor *

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

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 18

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 19

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 22

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 23

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

LL(1) grammatikk 1. Altså, dersom a First( ) så legg legg LL(1) -kravet for en ren BNF-grammatikk : A -> inn i M[A, a] Det som kreves for at en rek. descent-parsering skal fungere direkte fra grammatikken uten omskrivninger. For å avgjøre om en grammatikk er LL(1) : Sett opp tabell M[N,T] med mulige aksjoner for alle mulige situasjoner, slik: Definisjon av LL(1): En grammatikk er LL(1) dersom M[A,a] er entydig for alle situasjoner (eller angir error ) 2. Altså, dersom: er utnullbar, og a Follow(A ) så legg A -> inn i M[A, a] 25

Oppsett av LL(1) tabell First Follow - Venstre-faktorisering utført - Er ikke vestrerekursiv statement other, if $, else if-stmt if $, else else-part else, $, else exp 0, 1 ) Merk: Selv om man -fjerner venstre-rek. - Utfører venstre-fakt. - er det generelt ikke nok til å garantere LL(1)-grammatikk. For tabellen ble ikke entydig her 26

Kan også være greit å snakke om den utvidede startmengden, Efirst, til en produksjon NB: Ikke i boka, men er pensum! Den utvidede startmengden, Efirst, til en produksjon det som kan ligge som førstkommende token i input dersom A et riktig valg på dette stadiet under parseringen. Her må man også tenke på tilfellet at kan være utnullbar, og da kan også Follow(A) komme som førstkommende token Mengden kan beregnes slik: Efirst (A )= First( ), pluss, om er utnullbar, Follow(A). Vi ser da at produksjonen A skal inn i M[A, a] hvis og bare hvis a Efirst (A ) Dermed, får vi en alternativ definisjon av LL(1): På forrige side vil da både Anta at: A 1 2 3... n Da må alle: Efirst (A 1 ), Efirst(A 2 ),..., Efirst(A n ) være parvis disjunkte. Merk at dette også innebærer at bare ett av alternativene er utnullbare Efirst( else-part -> else statmt ) og Efirst(else-part -> ) inneholde else Dermed er grammatikken ikke LL(1) 27

Tidligere foil: Situasjonen under rekursiv parsering Trekantene er metode-kall S LL(1)-filosofi: Hver metode kan alltid ved hjelp av (bare) C førstkommende token, avgjøre hvilket alternativ som skal B brukes for den aktuelle ikke-terminalen i (her A) A Hvilket alternativ for A? Input Analysert og funnet OK token Skal matches mot resten av det valgte alternativ for A 28

LL(1) tabell for uttrykks-grammatikk Har fjernet venstre- rekursjon: Vi får da følgende First- og Follow-mengder: 29

Har fjernet venstre-rekursjon: 30

Når kompilatoren oppdager feil Minstekrav: Tester løpende at programmet er OK, og gir fornuftig feilmelding ved feil (men stopper) Vanlig krav ved feil ( error recovery ): Gir fornuftig feilmelding. Blar forbi feilen og fortsetter kompileringen (blar forbi så lite som mulig). Vanligvis vil man slutte å lage maskinkode etter feil (Men noe feilrettende kompilatorer forsøker det lite brukt) Det er for syntaksfeil det er vanskeligst å ta opp tråden etter feil. Viktig: Forsøke å unngå feilmeldinger som bare er følgefeil Rapportere feil så tidlig som mulig, helst så snart det man har lest ikke kan forlenges til et riktig program Man må passe på at man ikke blir gående i løkke rapportere feil uten å lese noe fra input. 31

Behandling av Syntaksfeil ved recursive decent parsering. Metode: Panic mode og synkroniserings-mengde i <program> begin <deklsekv>; <setningssekv> end; Synchset (stakk eller parameter): end <stmnt>; <stmnt>; <stmnt>;... ; First(stmt) navn if while for if <expr> then <stmnt> [ else <stmnt> ] then First(stmt) else <term> <term> <term>... <factor> * <factor> *<factor>... (<expr>) + - First(term) * First(factor) ) ( tall navn <term> <term> <term>... + - ( tall navn 32

Syntaksfeil ved rec. descent 2 Ut fra skissen er det greit å finne: - hvem som skal ta opp tråden - hvor denne skal fortsette eksekveringen Vi antar at $ bare legges på stakken av start-symbol-metoden symbol metoden Unionen av alle på stakken kalles synkroniseringsmengden, SM Algoritme: For hvert input-symbol framover, test om det er med i SM I så fall: Let gjennom SM-stakken, og finn den metoden som sist ble kalt, og som kan ta opp tråden på dette input-symbolet Denne metoden vet selv hvor den skal fortsette, ut fra inputsymbolet Det som ikke er greit, er å programmere dette uten at den vakre strukturen ved rec. descent blir helt ødelagt. 33

Uttrykksprosedyrer ved error recovery Filosofien her er litt annerledes (og noe uklar?) Også { +, - }?? Hovedfilosofi: checkinput kalles to ganger: Først for å sjekke at konstruksjonen starter riktig, etterpå for å sjekke at symbolet etter konstruksjonen er lovlig. if token in {(,number} then Bruker parameter, ikke stakk Prosedyrene må selv ta opp tråden riktig når de får igjen kontrollen: match(t) er som før: - tester input mot t -kaller eventuelt error (som nå returnerer!) - kaller ikke scanto(...) Hvorfor ikke også synchset? 34