Eksmen i : MED SVARFORSLAG UNIVERSITETET I OSLO Det mtemtisk-nturvitenskpelige fkultet INF5110 - Kompiltorteknikk Eksmensdg : Onsdg 6. juni 2012 Tid for eksmen : 14.30-18.30 Oppgvesettet er på : Vedlegg : Tilltte hjelpemidler : 6 sider (pluss vedlegg) 1 side (side 7 rives ut, fylles ut og leveres i hvit besvrelse) Alle trykte og skrevne Les gjennom hele oppgvesettet før du begynner å løse oppgvene. Dersom du svner opplysninger i oppgvene, kn du selv legge dine egne forutsetninger til grunn og gjøre rimelige ntgelser, så lenge de ikke bryter med oppgvens "ånd". Gjør i så tilfelle rede for disse forutsetningene og ntgelsene. Deler v oppgve 3 besvres ved bruk v vedlegg. Oppgve 1 (25%) Vi skl se på følgende grmmtikk G1: S S S S S Her er S strtsymbol og eneste ikke-terminl, mens, og (smt vslutnings-symbolet $) er teminlsymboler. 1. Gi en konkret begrunnelse for t G1 er flertydig. Svr 1. Definisjonen v t en grmmtikk er flertydig er t det finnes en setning generert v grmmtikken (ltså i L(G1)) som hr minst to konkrete syntkstrær (prseringstrær). Vi legger legger merketil t denne likner veldig på flertydig utgve v uttrykk med + og *, og vi kn her se på setningen:, som hr de to syntkstrærne under. Mn kunne like gjerne brukt f.eks.: S S S S S S S S S S S S S S S
1.b Ant t: - Opersjonen hr lv presedens, og er høyressositiv - Opersjonen hr høy presedens, og er venstressositiv Angi en ny grmmtikk G2 som er entydig, som beskriver smme språket som G1 og som gir et syntks-tre som følger de to reglene over. Du kn innføre nye ikke-terminler, og du behøver ikke rgumentere for t G2 er entydig ut over å vise til t den likner tilsvrende entydige grmmtikker i pensum. Svr 1.b Det er to rimelige svr, som er like gode: S -> T S T T -> T F F F -> S -> T S T T -> T Disse, og spesielt det til venstre, er stt opp etter smme prinsipp som på side 119 i lærebok 1.c Vi ser på grmmtikkene G1, G2, smt følgende grmmtikk G3 (der + er et nytt terminl-symbol): S S S S S + S + Angi for hver v språkene L(G1), L(G2) og L(G3) om de er eller ikke er regulære. Forklr, og ngi et regulært uttrykk for de som eventuelt er regulære. Svr 1.c G1 og G2 er jo smme språket, og det er regulært og kn beskrives f.eks. slik: ( ( ) )* For G3 er lle setninger som kn dnnes med bre «+» og følgende: ++ ++++ ++++++ Det må her ltså være like mnge «+»-er både forn og bk -en. Det er kjent fr pensum t et slikt språk ikke er regulært. Ser mn på hele språket til G3 vil setningene også inneholde og, men «+»-ene vil komme inn på en liknende måte som over, så språket er ikke regulært. 1.d Tegn opp LR(0)-DFA en til den flertydige grmmtikken G1 (med vnlig bruk v S ). 2
Svr 1.d 0 S ->.S S ->. S 3 1 S -> S.S S ->. S -> S. 4 S -> S.S S ->. G1: S S S S S S S 2 S ->. 5 S S 6 S -> S S. S -> S S. 1.e Beregn First og Follow til S i G1 (med vnlig bruk v $). Angi så hvilke tilstnder i DFA en fr 1.d som hr: A. konflikter som ikke kn løses med LR(0)-betrkninger, men som kn løses med SLR(1)- betrkninger. Forklr. B. konflikter som ikke kn løses med SLR(1)-betrkninger. Forklr. Svr 1.e First(S) = { First(S ) = First(S) Follow (S) = { $ Follow(S ) = { $ A. Det er en LR(0)-konflikt i tilstnd 1, som kn løses i SLR(1) ved t mn reduserer ( ccept er reduksjon med S -> S) ved $, og skifter ved og B. Det er LR(0)-konflikter både i tilstnd 5 og 6. Disse kn ikke løses med SLR-betrkninger siden det er ktuelt både å skifte og redusere for og (men om det kommer $ vet vi t det skl reduseres). Kommentr: Vi visste t det her ville bli konflikter som ikke er løselige v noen type LRbetrktninger, siden grmmtikken er flertydig. 1.f For tilstndene under punkt B i spørsmål 1.e, ngi hvordn du ville løse konfliktene i disse «for hånd», om du skl få den presedensen og ssositiviteten som er ngitt i 1.b? Svr 1.e Gjelder lltid for S Tilsnd 5: Her ligger nå S S på toppen v stkken. Derfor: For : Reduser, siden binder sterkere enn For : Reduser, fordi er venstressositiv For $: Reduser (ingen konflikt) 3 G1: S S S S S S S
Tilsnd 6: Her ligger nå S S på toppen v stkken. Derfor: For : Skift, siden er høyressossitiv For : Skift, fordi binder sterkere enn For $: Reduser (ingen konflikt) 1.g Sett opp en SLR(1)-prseringstbell for L(G1) ut fr svret på spørsmålene 1.d og 1.f. Tbellen skl ltså h mks én ksjon i hver rute, og den resulterende syntksnlysen skl ltså følge reglene fr 1.b. Svr 1.g Her er LR(0)-DFA en fr 1.d: 0 2 S ->.S S ->. S ->. S 3 5 1 S -> S.S S ->. S -> S S. S -> S. 4 S -> S.S S ->. S S 6 S -> S S. G1: S S S S S S S $ S 0 s2 1 1 s4 s3 cc. 2 r(s -> ) r(s -> ) r(s -> ) 3 s2 5 4 s2 6 5 r(s->s S) r(s->s S) r(s->ss) 6 s4 s3 r(s->s S) Oppgve 2 (25%) Oppgve 3 (25%) 4
Oppgve 4 (25%) En metode med to vlue-prmetere er overstt til følgende sekvens v TA-instruksjoner. Den eneste typen i språket er heltll. x = <verdien v første ktuelle prmeter> (Du kn skrive dette slik: «x = pr1») y = <verdien v ndre ktuelle prmeter> (Tilsvrende) z = x + y lbel L1 u = x + 1 if (y < x) goto L4 // Vi ntr t det finnes en TA-instruksjon v denne formen y = u + 1 u = y + x lbel L2 z = 5 if (x < u) goto L1 v = x + y u = v + 1 goto L5 lbel L4 v = z + 3 x = y + u lbel L5 z = v + 4 z = x + z return z 4. Del progrmmet opp i bsle blokker, og tegn opp flyt-grfen for progrmmet. Sett nvnene B0, B1, osv. på blokkene. Svr, se lenger ned. 4.b For hver bsl blokk, finn hvilke vrible som fktisk er i live både forn og etter blokk (ltså inlive og outlive for blokk). Du kn bruke metoden fr pensum til å finne svret, eller gjøre egne betrktninger. Det er greit å enten gi svret direkte på flytgrfen fr 4., eller du kn tegne opp flytgrfen en gng til (gjerne uten kode i nodene) med lle mengdene inlive og outlive stt på der de hører hjemme. Svr, se lenger ned. 4.c Ut fr informsjonen fr 4.b og detljene i TA-instruksjonene er det mulig å se (1) om noen v TA-instruksjonene i progrmmet kn fjernes uten t det forndrer sluttresulttet når progrmmet utføres. Angi i så fll disse (2) om det er vrible som, i en eller nnen eksekvering, kn bli brukt før de hr fått verdi. Angi i så fll disse. Om du ikke hr fått til 4.b kn du likevel forsøke å svre på denne oppgven enten direkte fr progrmmet, eller fr flyt-grfen. Svr, se lenger ned. 5
Svr 4., 4.b og 4.c 4.c.1: Siden u ikke er med i outlive(b3), så er denne tre-dressesetningen helt uten virkning på resulttet B3 { u y v = x + y u = v + 1 goto L5 { v x 4.b: Det er også OK om mn sier t denne er tom B0 B1 B2 { TOM! x = pr1 y = pr2 z = x + y { x y z { x y z lbel L1 u = x + 1 if (y < x) goto L4 y = u + 1 u = y + x lbel L2 z = 5 if (x < u) goto L1 B5 { u x y z { u x { u x y z { v x z = v + 4 z = x + z return z { z B4 4.c.2: Siden denne, ltså inlive(b0), er tom er det ingen vrible som kn tenkes å bli brukt før de hr fått verdi { u y z lbel L4 v = z + 3 x = y + u { v x 4.b: Denne mengden, ltså outlive(b2), blir i første omgng bre { u y, men etter t også inlive(b1) er beregnet og blir tilbkeført, får den også x og z 4.d (Er uvhengig v det over) I pensum er det diskutert hvordn mn kn lge TA-kode for kortsluttede boolske uttrykk som står som betingelser i if- eller while-setninger. Dette gjøres rekursivt, og den rekursive kodegenererings-metoden hr to lbel-prmetere som koden skl hoppe til når mn vet t det lokle uttrykket er h.h.v. true eller flse. Progrmmet for dette er gjengitt under. Vi overstte i pensum til TA-kode og ikke til P-kode bl.. for å slippe å tenke på t det under beregning v uttykket kn være noe på stkken ved hopp, som knskje ikke stemmer med det stedet det hoppes til. Vi skl her se nærmere på hvor stort dette problemet blir, og hvordn vi eventuelt kn korrigere for det. Som svr forklr først i detlj hvordn ting vil forholde seg med stkkdybder under uttrykksberegningen, og skissér så hvordn dette kn håndteres under kodegenereringen, gjerne ved å henvise til koden under. Merk: Vi ntr t P-koden skl lges slik t stkken under kjøring er tom mellom setninger, og t den derved er tom når beregningen v det boolske uttrykket strter. Hint: Det er sikkert lurt å se på hvordn P-koden blir for noen konkrete boolske uttrykk. 6
Progrm fr pensum. Det genererer TA-kode for logiske uttrykk i if- og while-setninger: void genboolcode(string lbt, lbf) { cse : { String lbx = genlbel(); left.genboolcode(lbt, lbx); emit2( lbel, lbx); right.genboolcode(lbt, lbf); cse && : { String lbx = genlbel(); left.genboolcode(lbx, lbf); emit2( lbel, lbx); right.genboolcode(lbt, lbf); cse not : { // Hr bre left -subtre left.genboolcode(lbf, lbt); cse < : { String temp1, temp2, temp3; temp1 = left.genintcode(); temp2 = right.genintcode(); temp3 = genlbel(); emit4(temp3, temp1, «lt», temp2); // Lger instruksjonen: temp3 = temp1 < temp2 emit3(«jmp-flse», temp3, lbf); emit2(«ujp», lbt); Svr 4.d Sken her er t så lenge mn skl generere kode som kortslutter de boolske uttrykkene så blir det ingen problemer med stkkdybden i det hele ttt. Det kommer v t mn, så fort det er en boolsk verdi på stkken, kommer til å teste om denne er true/flse, og ut fr svret enten hoppe eller fortsette rett til neste instruksjon. Teste-instruksjonen er slik t den i begge tilfelle vil t bort det som er på toppen v stkken, og dermed vil det ldri bygge seg opp noe på stkken. Vi kn se på følgende eksempel, der, b c og d er boolske vrible. Beregningen vil d følge pilene, ut fr t lle grener som ligger over teksten er true-grener, og de under er flse-grener: if ( nd b ) or ( c nd d ) then else... Vi ntr ltså t stkken er tom når vi strter på if-setningen. Ved hver vribel blir verdien v denne vribelen pushet på stkken, men forsvinner igjen i og med true/flse-testen. Dermed vil skken lltid være tom når kontrollen går lngs en knt. Dette betyr t en kodegenererings-prosedyre som skl lge P-kode kn lges etter nøyktig smme ml som den ngitt i oppgven som lger TA-kode. Vi behøver ikke tenke på stkkdybden i det hele ttt. 7