MED SVARFORSLAG UNIVERSITETET I OSLO

Like dokumenter
2012 2a. C rc; void main() { rc = new C (); rc.m2(); } } INF 3110/ INF /28/13 1

MED SVARFORSLAG UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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)

INF Noen oppgaver til kap. 8

INF Noen oppgaver til kap. 8

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

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF-5110 Oppgaver kodegenerering etc. INF-5110, vår 2011

UNIVERSITETET I OSLO

MED SVARFORSLAG UNIVERSITETET I OSLO. Det matematisk-naturvitenskapelige fakultet

UNIVERSITETET I OSLO

INF april, 2015 Kap. 8 kodegenerering. Del 2

Oppgaver til INF 5110, kapittel 5

Diverse eksamensgaver

Anatomien til en kompilator - I

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Stein Krogdahl, Ifi UiO

Anatomien til en kompilator - I

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

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

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

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

INF april, 2013 Kap. 8 kodegenerering

UNIVERSITETET I OSLO

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

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

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

UNIVERSITETET I OSLO

Repetisjon: Statiske språk uten rekursive metoder (C1 og C2) Dagens tema Kjøresystemer (Ghezzi&Jazayeri 2.6, 2.7)

Om oppgaveteksten på noe punkt er uklar eller upresis, kan du gjøre egne presiseringer. Formulér i så fall disse tydelig i oppgavebesvarelsen din.

Dagens tema Kjøresystemer (Ghezzi&Jazayeri 2.6, 2.7)

INF og 23. april, 2014 Kap. 8 kodegenerering

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF mai 2014 Stein Krogdahl, Ifi, UiO

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

UNIVERSITETET I OSLO

København 20 Stockholm

UNIVERSITETET I OSLO

Scanning - I Kap. 2. Hva scanneren gjør

Eksamen iin115, 14. mai 1998 Side 2 Oppgave 1 15 % Du skal skrive en prosedyre lagalle som i en global character array S(1:n) genererer alle sekvenser

EKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00

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

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

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

UNIVERSITETET I OSLO

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

Prøveeksamen IN1000. IN Prøveeksamen. Dato november 2017 Tid 12:30-12:00 Alle trykte og skrevne hjelpemidler er tillatt.

Semantisk Analyse del I

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Typisk: Kan det være både nøkkelord og navn, så skal det ansees som nøkkelord

UNIVERSITETET I OSLO

Typisk: Kan det være både nøkkelord og navn, så skal det ansees som nøkkelord

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

UNIVERSITETET I OSLO

Eksamen i IN 110, 18. mai 1993 Side 2 Del 1 (15%) Vi skal se på prioritetskøer av heltall, der vi hele tiden er interessert i å få ut den minste verdi

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

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

Runtimesystemer - II. Funksjoner som parametere. Virtuelle metoder

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

OPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?

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

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) og i emnet INF100-F Objektorientert programmering i Java I

E K S A M E N. Algoritmiske metoder I. EKSAMENSDATO: 11. desember HINDA / 00HINDB / 00HINEA ( 2DA / 2DB / 2EA ) TID:

UNIVERSITETET I OSLO

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

Skanning del I INF /01/15 1

Plan: Parameter-overføring Alias Typer (Ghezzi&Jazayeri kap.3 frem til 3.3.1) IN 211 Programmeringsspråk

Transkript:

Eksamen i : MED SVARFORSLAG UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet INF5110 - Kompilatorteknikk Eksamensdag : Onsdag 6. juni 2012 Tid for eksamen : 14.30-18.30 Oppgavesettet er på : Vedlegg : Tillatte hjelpemidler : 6 sider (pluss vedlegg) 1 side (side 7 rives ut, fylles ut og leveres i hvit besvarelse) Alle trykte og skrevne Les gjennom hele oppgavesettet før du begynner å løse oppgavene. Dersom du savner opplysninger i oppgavene, kan du selv legge dine egne forutsetninger til grunn og gjøre rimelige antagelser, så lenge de ikke bryter med oppgavens "ånd". Gjør i så tilfelle rede for disse forutsetningene og antagelsene. Deler av oppgave 3 besvares ved bruk av vedlegg. Oppgave 1 (25%) Vi skal se på følgende grammatikk G1: S a S # S S @ S Her er S startsymbol og eneste ikke-terminal, mens a, # og @ (samt avslutnings-symbolet $) er teminalsymboler. 1.a Gi en konkret begrunnelse for at G1 er flertydig. Svar 1.a Setningen a # a @ a har i det minste to syntakstrær: S S # S S S @ S a S @ S S # S a a a a a 1.b Anta at: - Operasjonen # har lav presedens, og er høyreassosiativ - Operasjonen @ har høy presedens, og er venstreassosiativ

Angi en ny grammatikk G2 som er entydig, som beskriver samme språket som G1 og som gir et syntaks-tre som følger de to reglene over. Du kan innføre nye ikke-terminaler, og du behøver ikke argumentere for at G2 er entydig ut over å vise til at den likner tilsvarende entydige grammatikker i pensum. Svar 1.b Det er to rimelige svar: S -> T + S T T -> T @ F F F -> a S -> T + S T T -> T @ a a Dette er satt opp etter samme prinsipp som på side 119 i læreboka 1.c Vi ser på grammatikkene G1, G2, samt følgende grammatikk G3 (der + er et nytt terminal-symbol): S a S # S S @ S + S + Angi for hver av språkene L(G1), L(G2) og L(G3) om de er eller ikke er regulære. Forklar, og angi et regulært uttrykk for de som eventuelt er regulære. Svar 1.c G1 og G2 er jo samme språket, og det er regulært og kan beskrives f.eks. slik: a ( (# @) a)* For G3 er alle setninger som kan dannes med bare «+» og «a» følgende: a +a+ ++a++ +++a+++ Det må her altså være like mange «+»-er både foran og bak «a»-en. Det er kjent fra pensum at et slikt språk ikke er regulært. Ser man 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 grammatikken G1 (med vanlig bruk av S ). 2

Svar 1.d 0 S ->.S S ->.a S ->.S # S S ->.S @ S a S a 3 1 @ S -> S @.S S ->.a S ->.S # S S ->.S @ S S -> S. S -> S. # S S -> S. @ S a 4 # S -> S #.S S ->.a S ->.S # S S ->.S @ S 2 S -> a. 5 S @ S # 6 S -> S @ S. S -> S. # S S -> S. @ S # @ S -> S # S. S -> S. # S S -> S. @ S 1.e Beregn First og Follow til S i G1 (med vanlig bruk av $). Angi så hvilke tilstander i DFA en fra 1.d som har: A. konflikter som ikke kan løses med LR(0)-betrakninger, men som kan løses med SLR(1)- betrakninger. Forklar. B. konflikter som ikke kan løses med SLR(1)-betrakninger. Forklar. Svar 1.e First(S) = { a Follow (S) = { # @ $ A. Det er en LR(0)-konflikt i tilstand 1, som kan løses i SLR(1) ved at man reduserer (aksept) ved $, og skifter ved # og @ B. Det er LR(0)-konflikter både i tilstand 5 og 6. Disse kan ikke løses med SLR-betrakninger siden det er aktuelt både å skifte og redusere for # og @ (men om det kommer $ vet vi at det skal reduseres). Kommentar: Vi visste at det her ville bli konflikter som ikke er løselige av noen type LRbetraktninger, siden grammatikken er flertydig. 1.f For tilstandene under punkt B i spørsmål 1.e, angi hvordan du ville løse konfliktene i disse «for hånd», om du skal få den presedensen og assosiativiteten som er angitt i 1.b? Tilsand 5: Her ligger nå S @ S på toppen av stakken. Derfor: For #: Reduser, siden @ binder sterkere enn # For @: Reduser, fordi @ er venstreassosiativ For $: Reduser (ingen konflikt) Tilstand 6: Her ligger nå S # S på toppen av stakken. Derfor: 3

For #: Skift, siden # er høyreassossiativ For @: Skift, fordi @ binder sterkere enn # For $: Reduser (ingen konflikt) 1.g Sett opp en SLR(1)-parseringstabell for L(G1) ut fra svaret på spørsmålene 1.d og 1.f. Tabellen skal altså ha maks én aksjon i hver rute, og den resulterende syntaksanalysen skal altså følge reglene fra 1.b. Svar 1.g a # @ $ S 0 s2 1 1 s4 s3 acc. 2 r(s -> a) r(s -> a) r(s -> a) 3 s2 5 4 s2 6 5 r(s->s @ S) r(s->s @ S) r(s->s@s) 6 s4 s3 r(s->s # S) Oppgave 2 (25%) 2.a Vi tenker oss i denne oppgaven at vi har et Java-lignende språk hvor metoder kan ha lokalt definerte metoder. Dessuten kan man deklarere variable og metoder også på ytterste programnivå. Dette skal fungere som vanlig i språk som er statisk skopet. Det følgende er et program i dette språket. Oppstart av programmet skjer ved å kalle main-metoden. { class C { void m1(){ void f() {; f(); void m2() { int i; void g() { int j; j=i; ; i=1; rc.m1(); ; ; C rc; void main() { rc = new C (); rc.m2(); Tegn kall-stakken som den ser ut når aktiveringsblokken ( activation record ) for f er på toppen av 4

stakken for første gang, inklusive variable, access-linker og control-linker, bortsett fra access-linker for metoder som er direkte deklarert i en klasse (kan da anta at access-linken peker til C-objektet, men dette er ikke viktig for oppgaven). Svar 2.a 2.b I resten av oppgave 2 innfører vi metoder som parametere. Det er en regel at aktuelle parametere til slike må være metoder som er direkte synlige fra kallstedet. Eksemplet over blir så endret slik at f blir en metodeparameter, og kallet på f i m1 blir da et kall på en metodeparameter: { class C { void m1(void f()){ ; f(); void m2() { int i; void g() { int j; j=i; ; i=1; rc.m1(g); ; C rc; void main() { rc = new C (); rc.m2(); Tegn kall-stakken som den ser ut når aktiveringsblokken for kallet rc.m1(g)er på toppen av stakken. Hvordan representeres metoden g i denne aktiveringsblokken slik at kallet på parameteren f (dvs kallet f() i m1) kan utføres? 5

Svar 2.b Parameteren f er representert ved et par <ip, ep>, hvor ip peker ut koden for den aktuelle parameteren og hvor ep peker ut aktiveringsblokken for den blokken som tekstlig omslutter definisjonen av den aktuelle parameteren. I det aktuelle kall peker ip ut koden for g og ep peker ut aktiveringsblokken for m2, hvor g er definert. 2.c Tegn kall-stakken som den ser ut når aktiveringsblokken for kallet av f i m1 er på toppen av stakken. Forklar hvordan access-link for aktiveringsblokken på toppen av stakken settes i dette spesielle tilfellet. 6

Svar 2.c Oppgave 3 (25%) Det følgende er en del av en grammatikk for et språk med klasser. Det er bare tatt med de produksjoner som har betydning. Klasser har for eksempel også variable, men de er ikke viktige her. class class name { methoddecls methoddecls methoddecls ; methoddecl methoddecls methoddecl methoddecl type name ( parameters ) body parameters parameters, parameter parameters parameter parameter type name type int type bool Den regel som skal spesifiseres ved hjelp av en attributtgrammatikk er at en klasse kan ha flere enn én constructor, men de må ha forskjellige signaturer i form av antall og/eller typer av parametere. Lag attributtgrammatikken basert på ideen om at methoddecl har et attributt constructorname som er satt sammen av navnet på metoden og strenger som tilsvarer typene på parameterne. En constructor C med parametertypene (int, int) vi således få constructorname C_i_i, mens en constructor C med parametertyper (int, bool) vil få constructorname C_i_b. Testen vil derfor 7

være, som antydet i første rekke i tabellen under, at alle navne i mengden av constructornavne er forskjellige. Vi innrømmer at dette ikke er det mest optimale, men det er ikke poenget her. Definer de regler som gjør denne testen mulig. Anta at du har funksjoner og operatorer for å innsette navne i en menge og for å konkatenere strenge og tegn. Svar oppgave 3 Grammar Rule class class name { methoddecls methoddecls 1 methoddecls 2 ; methoddecl Semantic Rule class.ok = all names in methoddecls.constructornameset are different methoddecls 1.constructorNameSet = methoddecls 2.constructorNameSet + methoddecl.constructornameset methoddecls methoddecl methoddecls.constructornameset = methoddecl.constructorname methoddecl type name ( parameters ) body parameters 1 parameters 2, parameter methoddecl.constructorname = name.name + _ + parameters.paramtypes parameters 1.paramTypes = parameters 2.paramTypes + _ + parameter.typename parameters parameter parameters.paramtypes = parameter.typename parameter type name parameter.typename = type.typestring type int type bool type.typestring = i type.typestring = b 8

Oppgave 4 (25%) En metode med to value-parametere er oversatt til følgende sekvens av TA-instruksjoner. Den eneste typen i språket er heltall. x = <verdien av første aktuelle parameter> (Du kan skrive dette slik: «x = par1») y = <verdien av andre aktuelle parameter> (Tilsvarende) z = x + y label L1 u = x + 1 x = u + y if (y < x) goto L4 // Vi antar at det finnes en TA-instruksjon av denne formen y = u + 1 u = y + x label L2 z = 5 if (x < u) goto L1 x = u + y v = x + y u = v + 1 goto L5 label L4 v = z + 3 x = y + u label L5 z = v + 4 z = x + z return z 4.a Del programmet opp i basale blokker, og tegn opp flyt-grafen for programmet. Sett navnene B0, B1, osv. på blokkene. 9

Svar 4.a, 4.b og 4.c 4.c.1: Siden u ikke er med i outlive(b3), så er denne tre-adressesetningen helt uten virkning på resultatet B3 { u y x = u + y v = x + y u = v + 1 goto L5 { v x B0 B1 B2 TOM = Ø x = par1 y = par2 z = x + y { x y z { x y z label L1 u = x + 1 x = u + y if (y < x) goto L4 y = u + 1 u = y + x label 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 TOM = Ø B4 4.c.2: Siden denne, altså inlive(b0), er tom er det ingen variable som kan tenkes å bli brukt før de har fått verdi { u y z label L4 v = z + 3 x = y + u { v x 4.b: Denne mengden, altså outlive(b2), blir i første omgang bare { u y, men etter at også inlive(b1) er beregnet og blir tilbakeført, får den også x og z 4.b For hver basal blokk, finn hvilke variable som faktisk er i live både foran og etter blokka (altså inlive og outlive for blokka). Du kan bruke metoden fra pensum til å finne svaret, eller gjøre egne betraktninger. Det er greit å enten gi svaret direkte på flytgrafen fra 4.a, eller du kan tegne opp flytgrafen en gang til (gjerne uten kode i nodene) med alle mengdene inlive og outlive satt på der de hører hjemme. 4.c Ut fra informasjonen fra 4.b og detaljene i TA-instruksjonene er det mulig å se (1) om noen av TA-instruksjonene i programmet kan fjernes uten at det forandrer sluttresultatet når programmet utføres. Angi i så fall disse (2) om det er variable som, i en eller annen eksekvering, kan bli brukt før de har fått verdi. Angi i så fall disse. Om du ikke har fått til 4.b kan du likevel forsøke å svare på denne oppgaven enten direkte fra programmet, eller fra flyt-grafen. 10

4.d (Er uavhengig av det over) I pensum er det diskutert hvordan man kan lage 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 har to label-parametere som koden skal hoppe til når man vet at det lokale uttrykket er h.h.v. true eller false. Programmet for dette er gjengitt under. Vi oversatte i pensum til TA-kode og ikke til P-kode bl.a. for å slippe å tenke på at det under beregning av uttykket kan være noe på stakken ved hopp, som kanskje ikke stemmer med det stedet det hoppes til. Vi skal her se nærmere på hvor stort dette problemet blir, og hvordan vi eventuelt kan korrigere for det. Som svar forklar først i detalj hvordan ting vil forholde seg med stakkdybder under uttrykksberegningen, og skissér så hvordan dette kan håndteres under kodegenereringen, gjerne ved å henvise til koden under. Merk: Vi antar at P-koden skal lages slik at stakken under kjøring er tom mellom setninger, og at den derved er tom når beregningen av det boolske uttrykket starter. Hint: Det er sikkert lurt å se på hvordan P-koden blir for noen konkrete boolske uttrykk. Program fra pensum. Det genererer TA-kode for logiske uttrykk i if- og while-setninger: void genboolcode(string labt, labf) { case : { String labx = genlabel(); left.genboolcode(labt, labx); emit2( label, labx); right.genboolcode(labt, labf); case && : { String labx = genlabel(); left.genboolcode(labx, labf); emit2( label, labx); right.genboolcode(labt, labf); case not : { // Har bare left -subtre left.genboolcode(labf, labt); case < : { String temp1, temp2, temp3; temp1 = left.genintcode(); temp2 = right.genintcode(); temp3 = genlabel(); emit4(temp3, temp1, «lt», temp2); // Lager instruksjonen: temp3 = temp1 < temp2 emit3(«jmp-false», temp3, labf); emit2(«ujp», labt); 11

Svar 4.d Saken her er at så lenge man skal generere kode som kortslutter de boolske uttrykkene så blir det ingen problemer med stakkdybden i det hele tatt. Det kommer av at man, så fort det er en boolsk verdi på stakken, vil teste om denne er true/false, og enten hoppe eller fortsette rett til neste instruksjon. Teste-instruksjonen er slik at den i begge tilfelle vil ta bort det som er på toppen av stakken, og dermed vil det aldri bygge seg opp noe på stakken. Vi kan se på følgende eksempel, der a, b c og d er boolske variable. Beregningen vil da følge pilene, ut fra at alle grener som ligger over teksten er TRUE-grener, og de under er FALSE-grener: if ( a and b ) or ( c and d ) then else... Her vil stakken alltid være tom når kontrollen går langs en kant, og ved hver av variablene blir denne variabelen pushet på stakken, men forsvinner igjen i og med TRUE/FALSE-testen Dette betyr at en kodegenererings-prosedyre som skal lage P-kode kan lages etter nøyaktig samme mal som den angitt i oppgaven som lager TA-kode. Vi behøver ikke tenke på stakkdybden i det hele tatt. 12