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

Like dokumenter
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

INF5110 V2012 Kapittel 4: Parsering ovenfra-ned

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

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

Hovedstoffet i kap 4: 16. Februar Ifi, UiO

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

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

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

Hovedstoffet i kap 4:

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

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

Oppgaver til INF 5110, kapittel 5

INF5110, 15/ Dagens temaer: Avslutning kap. 4 Begynne på kap. 5 Se på oppgave. Stein Krogdahl, 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).

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

Dagens Tema: Grammatikker

Dagens Tema: Grammatikker

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

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

INF 5110, 3. februar Dette foilheftet: Kapittel 3

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

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

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

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

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

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

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)

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

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

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

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

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 3: INF5110, fra 1/3-2011

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

UNIVERSITETET I OSLO

MED SVARFORSLAG UNIVERSITETET I OSLO

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

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

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

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

INF3110 Programmeringsspråk

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

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

Syntax/semantics INF 3110/ /8/2004 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?

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

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

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

Semantisk Analyse del I

MED SVARFORSLAG UNIVERSITETET I OSLO. Det matematisk-naturvitenskapelige fakultet

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

Beskrivelse av programmeringsspråket Simpila INF Kompilatorteknikk Våren 2012

Statisk semantisk analyse - Kap. 6

MAT1030 Plenumsregning 1

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

Statisk semantisk analyse - Kap. 6

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

Plenumsregning 1. Kapittel 1. Roger Antonsen januar Velkommen til plenumsregning for MAT1030. Repetisjon: Algoritmer og pseudokode

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

MAT1030 Diskret Matematikk

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

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

Oversikt Kompilering Syntaksanalyse Java Feilsjekking Oppsummering

Bakgrunnen for INF2100. Velkommen til INF2100. Prosjektet. Hva gjør en kompilator?

Hjemmeeksamen 2 i INF3110/4110

Velkommen til INF2100 Jeg er Dag Langmyhr

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

MAT1030 Forelesning 2

Kontekstfrie grammatikker og syntaksanalyse (parsering)

Velkommen til INF2100

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

MAT1030 Diskret Matematikk

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

Oversikt. INF5110 Obligatorisk Oppgave 1. Andreas Svendsen SINTEF

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

Med rettelser til oppgave 5.18, gjort 3/3

MAT1030 Diskret Matematikk

UNIVERSITETET I OSLO

Plenumsregning 1. MAT1030 Diskret Matematikk. Repetisjon: Algoritmer og pseudokode. Velkommen til plenumsregning for MAT1030

INF 4130 Svarforslag til «Midterm», 01/

Forelesning 33. Repetisjon. Dag Normann mai Innledning. Kapittel 11

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

UNIVERSITETET I OSLO

MAT1030 Diskret matematikk

Innledning. MAT1030 Diskret matematikk. Kapittel 11. Kapittel 11. Forelesning 33: Repetisjon

Velkommen til plenumsregning for MAT1030. MAT1030 Diskret matematikk. Repetisjon: Algoritmer og pseudokode. Eksempel fra boka. Eksempel

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

INF 4130 Oppgavesett 3, 20/ m/løsningsforslag

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

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

KONTROLLSTRUKTURER. MAT1030 Diskret matematikk. Kontrollstrukturer. Kontrollstrukturer. Eksempel (Ubegrenset while-løkke)

Transkript:

Oppgaver til INF 5110, kapittel 4, med svarforslag Gjennomgått torsdag 14. febr. 2008. Disse foilene er justert 15/2, kl. 11 Oppgave 1 (Mye repetisjon): Gitt gram.: exp exp op exp (exp) num op + - * / ** < = a) Grammatikken over er opplagt flertydig. Lag en entydig grammatikk for språket ut fra at følgende tilleggsregler: ** (opphøying) har presedens 3 (høyest) og er høyre-assossiativ * og / har presedens 2, og er venstre-assosiaiv + og - har presedens 1 og er venstre-assosiativ < og = har presedens 0, og er ikke-assosiativ b) Se på grammatikken du fant under a), og skriv et syntaksdiagram (med løkker der det passer) for hver ikke-terminal. Del opp op - terminalene på hensiktsmessig måte. c) Lag recursive-descent prosedyrer for å sjekke programmet (med while-setninger der det passer) ut fra grammatikken fra b). Du kan bruke både match(token) og gettoken() fra boka (som begge setter neste symbol inn i variablen token ). d) Ut fra svaret på c), legg til trebyggings-setninger i prosedyren som behandler en sekvens av **, slik at treet får riktig høyre-assosiativ form. e) Ta hele grammatikken fra a), og gjør den fri for venstreassosiativitet, og gjør all mulig venstrefaktorisering (men behold entydighet). f) Sjekk om grammatikken fra e) er LL(1). Oppgave 2: Skriv om prosedyrene midt på side 162, slik at de produserer trær (og ikke tall) Oppgave 3: Sjekk om grammatikken S ( S ) S ε er LL(1) Oppgave 4: Gitt gram.: exp exp + exp (exp) if exp then exp else exp var a) Lag en entydig grammatikk for dette språket, der + skal være venstreassosiativ, og der if x then y else z+u skal bety if x then y else (z+u). Forsøk også å lage en grammatikk med den motsatte tolkningen: at det betyr (if x then y else z)+u. b) Hvorfor får vi ikke noe dangling else -problem her?

Gitt grammatikken: exp exp op exp (exp) num op + - * / ** < = a) Grammatikken over er opplagt flertydig. Lag en entydig grammatikk for språket ut fra at følgende tilleggsregler: ** (opphøying) har presedens 3 (høyest) og er høyre-assossiativ * og / har presedens 2, og er venstre-assosiaiv + og - har presedens 1 og er venstre-assosiativ < og = har presedens 0, og er ikke-assosiativ Svarforslag: Vi må lage en ny ikke-terminal for hvert presedens-nivå. Vi velger fra laveste til høyeste: exp som den er i oppgaven exp1 for operander foran og bak < og = exp2 for operander mellom, foran og bak + og (term) exp3 for operander mellom, foran og bak * og / (faktor) exp4 for operander mellom, foran og bak ** (opphøying) Grammatikken blir: exp exp1 RELOP exp1 exp1 RELOP dekker < og =, men kommer som samme token exp1 exp1 ADDOP exp2 exp2 Tilsvarende for + og - exp2 exp2 MULOP exp3 exp3 Tilsvarende for * og / exp3 exp4 EXPOP exp3 exp4 Tilsvarende, men snudd, for ** exp4 ( exp ) num

Svarforslag til b) exp exp1 RELOP exp1 exp1 exp2 ADDOP exp2 exp3 MULOP exp3 exp4 EXPOP Alternativ exp3 (Også grei for rec. descent) exp4 EXPOP exp3 exp4 ( exp ) num

c) Lag recursive-descent prosedyrer for å sjekke programmet (med while-setninger der det passer) ut fra grammatikken fra b). Du kan bruke både match(token) og gettoken() fra boka (som begge setter neste symbol inn i variablen token ). exp1(); procedure exp() { if token = RELOP then { gettoken() exp1(); procedure exp1() { exp2; while token = ADDOP do { exp2(); Både exp2 og exp3 blir helt tilsvarende til exp1() procedure exp4() { if token = LPAR then { expr(); match( RPAR ) else { match( NUM );

d) Ut fra svaret på c), legg til trebyggings-setninger i prosedyren som behandler en sekvens av **, slik at treet får riktig høyre-assosiativ form. procedure exp3(): TreeNode { Treenode root, newright; OpNode opnode, oldopnode; root = exp4(); if token = EXPOP then { newright = exp4(); opnode = new OpNode( **, root, newright); root = opnode; while token = EXPOP do { newright = exp4(); oldopnode = opnode; opnode = new OpNode( **, oldopnode.right, newright); oldopnode.right = opnode; return root; Lagt til etter gjennomgåelsen: Om exp er det faktisk ytterste startsymbolet, så legger man gjerne på en ytterste rec.descent-prosedyre som får det hele riktig i gang, og som sjekker at det ikke er noe grums etter programmet. Den kan f.eks. være slik: procedure expression() { exp(); if token!= $ then {error( grums etter uttrykket ); Men merk at man godt kan bruke den alternative syntaksen (den i rødt, som ikke er venstre-rekursiv) for denne operatoren. Da får man enklere prosedyre, omtrent slik: procedure exp3(): TreeNode { TreeNode root; OpNode opnode; root = exp(4); if token = EXPOP then { newright = exp3(); opnode = new OpNode( **, root, newright); return root;

e) Ta hele grammatikken fra a), og gjør den fri for venstreassosiativitet, og gjør all mulig venstrefaktorisering (men behold entydighet). exp exp1 RELOP exp1 exp1 RELOP dekker < og =, men er samme token exp1 exp1 ADDOP exp2 exp2 Tilsvarende for + og - exp2 exp2 MULOP exp3 exp3 Tilsvarende for * og / exp3 exp4 EXPOP exp3 exp4 Tilsvarende for ** exp4 ( exp ) num exp exp1 expx expx RELOP exp1 ε exp1 exp2 exp1x exp1x ADDOP exp2 exp1x ε exp2 exp3 exp2x exp2x MULOP exp3 exp2x ε exp3 exp4 exp3x exp3x EXPOP exp3 ε exp4 ( exp ) num Lagt til etter gjennomgåelsen: At vi faktisk beholder entydighet er ikke uten videre greit å se, men det blir klart i oppgave f), siden vi der finner at grammatikken er LL(1). Alle grammatikker som er LL(1) er entydige.

Det i rødt er lagt til etter gjennomgåelsen f) Sjekk om grammatikken fra e) er LL(1). Vi beregner først First og Follow (Fi og Fo). FiU er Fi uten ε exp exp1 expx Legger Fo(exp) inn i Fo(expx) og inn i Fo(exp1). Legger FiU(expx) inn i Fo(exp1) expx RELOP exp1 ε Legger Fo(expx) inn i Fo(exp1) exp1 exp2 exp1x Legger Fo(exp1) inn i Fo(exp1x) og inn i Fo(exp2). Legger FiU(exp1x) inn i Fo(exp2) exp1x ADDOP exp2 exp1x ε Legger Fo(exp1x) inn i Fo(exp2). Legger FiU(exp1x) inn i Fo(exp2) exp2 exp3 exp2x Legger Fo(exp2) inn i Fo(exp2x) og inn i Fo(exp3). Legger FiU(exp2x) inn i Fo(exp3) exp2x MULOP exp3 exp2x ε Legger Fo(exp2x) inn i Fo(exp3). Legger FiU(exp1x) inn i Fo(exp3) exp3 exp4 exp3x Legger Fo(exp3) inn i Fo(exp3x) og inn i Fo(exp4). Legger FiU(exp3x) inn i Fo(exp4) exp3x EXPOP exp3 ε Legger Fo(exp3x) inn i Fo(exp3). exp4 ( exp ) num Legger ) inn i Fo(exp) First Follow exp num ( $ ) Legger først $ inn i Follow(exp) (siden exp er startsymbolet) expx ε RELOP $ ) exp1 num ( $ ) RELOP exp1x ε ADDOP $ ) RELOP exp2 num ( $ ) RELOP ADDOP exp2x ε MULOP $ ) RELOP ADDOP exp3 num ( $ ) RELOP ADDOP MULOP Exp3x ε EXPOP $ ) RELOP ADDOP MULOP exp4 num ( $ ) RELOP MULOP ADDOP EXPOP RELOP ADDOP MULOP EXPOP num ( ) $ exp exp1 expx exp1 expx expx RELOP exp1 ε ε exp1 exp2 exp1x exp2 exp1x exp1x ε ADDOP exp2 exp1x ε ε exp2 exp3 exp2x exp3 exp2x exp2x ε ε MULOP exp3 exp2x ε ε exp3 exp4 exp3x exp4 exp3x exp3x ε ε ε EXPOP exp3 ε ε exp4 num ( exp ) Dermed, siden det ikke er konflikter: Den er LL(1)! Og altså: Dermed også entydig.

Oppgave 2 Skriv om prosedyrene midt på side 162, slik at de produserer trær (og ikke tall). Dette er på en måte det omvendte av det i oppgave 1d. function exp(): TreeNode; var temp: TreeNode; begin temp = term(); return exp (temp); end; function exp (treelsofar: TreeNode) begin if token == + or token == - then case token of +: match( + ); treesofar = new OpNode( +, treesofar, term()); - : match( - ); treesofar = new OpNode( -, treesofar, term()); end case; return exp (treesofar); else return treesofar; end; end

Oppgave 3 Sjekk om grammatikken S ( S ) S ε First Follow --------------------------------------- S ε ( $ ) --------------------------------------- Tabellen for valg av alternativ blir dermed: ( ) $ --------------------------------------------------------------- S S ( S ) S S ε S ε --------------------------------------------------------------- Og denne tabellen er entydig, altså er den LL(1). er LL(1) For interesserte: Grammatikken: S S ( S ) ε (som gir samme språk) er derimot ikke LL(1). Vi får her: First Follow --------------------------------------- S ε ( $ ( ) --------------------------------------- Dermed blir det konflikt for ( En recursive descent prosedyre kunne bli (ikke spurt om i oppgaven): procedure S() { if token = ( then { S(); match( ) ); S(); else { // ingen ting // Lagt til etter gjennomgåelsen

Oppgave 4 Gitt gram.: exp exp + exp (exp) if exp then exp else exp var a) Lag en entydig grammatikk for dette språket, der + skal være venstreassosiativ, og der if x then y else z+u skal bety if x then y else (z+u). Forsøk også å lage en grammatikk med den motsatte tolkningen: at det betyr (if x then y else z)+u. exp exp + exp1 exp1 exp1 if exp then exp else exp ( exp ) var Etter gjenomgåelsen: Denne er entydig (den er SLR(1)). Merk at vi f.eks. kan ha setningen: a + b + if c then d else e + f. Denne vil bli tolket slik: (a + b) + (if c then d else (e + f)). Setningen: (a + b) + (if c then d else (if g then h else (e + f))) får den betydningen som angitt om den skrives helt uten parenteser. Grammatikken under er også entydig, og gjør det den skal. Den motsatte grammatikken gir et veldig rart språk, siden vi kan bruke + inni if- og elseuttrykket, men ikke inni then-uttrykket. Men følgende grammatikk vill gjøre susen: exp exp + exp1 exp1 exp1 if exp then exp else exp1 ( exp ) var b) Hvorfor får vi ikke noe dangling else -problem her? Det kommer av at det ikke er noe tvil om det skal være med en else eller ikke til en if-then. Det skal alltid være med en else!