UNIVERSITETET I OSLO

Like dokumenter
UNIVERSITETET I OSLO

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)

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

MED SVARFORSLAG UNIVERSITETET I OSLO

MED SVARFORSLAG UNIVERSITETET I OSLO. Det matematisk-naturvitenskapelige fakultet

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF Noen oppgaver til kap. 8

UNIVERSITETET I OSLO

Diverse eksamensgaver

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

INF Noen oppgaver til kap. 8

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

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.

Anatomien til en kompilator - I

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Semantisk Analyse del I

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Anatomien til en kompilator - I

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Hjemmeeksamen 2 i INF3110/4110

Generiske mekanismer i statisk typede programmeringsspråk

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

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

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

Dagens tema: 12 gode råd for en kompilatorskriver. Sjekking av navn. Lagring av navn. Hvordan finne et navn?

Hovedstoffet i kap 4: 16. Februar Ifi, UiO

Obligatorisk Oppgave 1

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

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

UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet

Dagens tema: 12 gode råd for en kompilatorskriver

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

Oppgaver til INF 5110, kapittel 5

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

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Runtimesystemer - II. Funksjoner som parametere. Virtuelle metoder

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

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

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

INF Oblig 2 semantikksjekk og kodegenerering

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

Obligatorisk Oppgave 1

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

Faglærerne prøver å besøker eksamenslokalet mellom klokka 15 og 16 for å oppklare eventuelle uklarheter og feil i oppgaveteksten.

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

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

INF1010, 22. mai Prøveeksamen (Eksamen 12. juni 2012) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

INF5110 V2012 Kapittel 4: Parsering ovenfra-ned

2 Om statiske variable/konstanter og statiske metoder.

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

UNIVERSITETET I OSLO

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

Obligatorisk Innlevering 2

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

INF5110. Oblig 2 presentasjon

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

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen Oppsummering

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

EKSAMENSFORSIDE SKRIFTLIG EKSAMEN

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

UNIVERSITETET I OSLO

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

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

INF1010 våren 2008 Uke 4, 22. januar Arv og subklasser

TDT4100 Objektorientert programmering

TDT4100 Objektorientert programmering

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

Gjennomgang av eksamen H99

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

Transkript:

Eksamen i : UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet INF5110 - Kompilatorteknikk Eksamensdag : Onsdag 3. juni 2014 Tid for eksamen : 14.30-18.30 Oppgavesettet er på : Vedlegg : Tillatte hjelpemidler : 8 sider (inkl. vedlegg) 1 side (side 8). Hvis denne siden brukes til besvarelse av spørsmål 3, da rives den 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. Oppgave 1 (35%) Vi ser på følgende grammatikk G1: A # A # A = A a Her er A eneste ikke-terminal, og A er dermed også start-symbol. I tillegg til #, = og a er også $ terminalsymbol, med vanlig betydning. 1a Finn First og Follow til A i G1 1b Tegn LR(0)-DFAen til G1 (med vanlig tillegg av én produksjon). Nummerer tilstandene fra 0 og oppover. 1c Gå gjennom alle tilstandene i LR(0)-DFAen til G1 og angi for hver av dem om de har noen SLR(1)- konflikter, og i så fall hvilke. Forklar. 1d Vis at G1 er flertydig. 1e Du skal her sette opp en SLR(1)-parseringstabell for G1. Om grammatikken ikke er SLR(1) (og du derved får flere mulige aksjoner i en eller flere «tabell-ruter»), skal du gjøre et fornuftig valg av 1

aksjon blant de aktuelle i denne «ruten». Angi i hvilke tilstander du da må gjøre slike eksplisitte valg, og begrunn hvorfor du gjør de valgene du gjør. 1f Vi skal se på LL(1)-analyse (f.eks. med «recursive descent») av setninger i G1. Gjør «tradisjonelle» forandringer (angitt i boka) på G1 slik at den nye grammatikken, G2, kan egne seg bedre for slik analyse. Angi G2. 1g Avgjør om L(G1) er et regulært språk. Forklar! Oppgave 2 (20%) Vi antar at vi har et objekt-orientert språk, hvor alle metoder i klasser er virtuelle slik at de kan redefineres i subklasser. En standard måte å implementere tilstandsmaskiner i et slikt språk er å representere tilstander ved objekter av tilstandsklasser som er blad -klasser i et klassehierarki. Mulige hendelser i de forskjellige tilstander representeres som virtuelle metoder, og disse redefineres eventuelt i de forskjellige tilstands-subklasser. Koden under definerer en klasse Watch som en tilstandsmaskin med tilstandene Display, Hours og Minutes. Klokken endrer tilstand ved at det trykkes å en mode-knapp, som (indirekte, se under) fører til et kall på metoden mode. I tilstanden Display vises bare tiden, mens man i de andre tilstander kan øke enten timer eller minutter med 1 ved å trykke på incr-knappen som fører til et kall på metoden incr. Tilstandsklassene er definert som indre klasser i Watch for at variablene time og currentstate skal være tilgjengelige i metodene i de tilstandsklassene. Klassen Time definerer hvordan tid representeres, og vi forutsetter at den har metodene incrhours og incrminutes. class Watch { Time time = new Time(); State currentstate; void mode(){ currentstate.mode(); void incr(){ currentstate.incr(); Watch(){ currentstate = new Display(); class State { void mode(){... void incr(){... class Hours extends State { void mode(){currentstate = new Minutes(); void incr(){ /* 1 */ time.incrhours(1); class Minutes extends State { void mode(){currentstate = new Display(); void incr(){ time.incrminutes(1); class Display extends State { void mode(){currentstate = new Hours(); void settime(time newtime){time = newtime; class Time {... Vi antar at det i tillegg finnes et objekt av en klasse WatchInterface, som i en metode sense registrerer trykk på knapper som svarer til metodene mode og incr, og som kaller mode eller incr på det Watch-objektet som er tilknyttet WatchInterface-objektet. Her vises det utsnitt av sense 2

hvor incr kalles: class WatchInterface { Watch thewatch = new Watch(); void sense(){...; if <mode button pressed> then thewatch.mode() else if <incr button pressed> then thewatch.incr();... 2a Tegn runtime-stakken som den ser ut som et resultat av dette kallet, rett før incr skal utføre time.incrhours(1), altså at utførelsen er ved /* 1 */ i koden ovenfor. Starten på stakken er en activation record som svarer til et kall på sense. Anta at thewatch-objektet er i tilstanden Hours. Ta bare med activation records og ikke objekter, og for activation records tar du bare med control links. 2b Lag virtuell-tabellene for objekter av klassene State, Hours, Minutes og Display. For hvert element i tabellene skal du bruke notasjonen <klasse>::<metode> for å angi hvilken metode som gjelder. Ta høyde for at det finnes subklasser av Display som ikke er tatt med i koden over. 2c Metoden settime kalles fra en metode i en klasse i Watch som ikke er tatt med i koden ovenfor. settime kalles som et resultat av at klokken får et radiosignal med ny (korrekt) tid, og den inneholder følgende kode:... // receive new time via radiolink (Display)currentState.setTime(receivedTime);... Man vil bare kalle settime mens klokken er i tilstanden Display, derfor forsøker man seg med denne type-castingen, som vil gi en runtime feil hvis currentstate ikke er et objekt av klassen Display. Dette er ikke den optimale måten å gjøre det på, men slik ble det gjort. Ovenfor er det eksempel på en down-cast (fra State til Display), men vi antar at man kan gjøre både down-cast og up-cast. Ovenfor har vi sett at objekter har en peker til en virtuell-tabell. Hva trenger du å vite om objekter, i tillegg til virtuell-tabellen, for å implementere en slik casting. Beskriv dette og lag en skisse av den koden som skal utføres for å gjøre denne testen. 2d Hvordan vil kompilatoren bruke denne castingen i sjekking av statisk semantikk? 2e Ett kall på awatch.mode() fører til et kall på currentstate.mode(). Hva oversettes dette kallet til? 2f Man ser at klassen State egentlig bare har de samme metoder som den omsluttende klasse (her Watch) og at man bare bruker virtuell-tabellene for State-objektene. Man går derfor over til et annet objekt-orientert språk, der følgende tre ting gjelder: 3

1. virtuelle metoder kan redefineres i indre klasser som er definert som STATE-klasser (se syntaks for STATE-klasser i koden under) 2. virtuell-tabellen pekes ut av en predefinert variabel _STATE 3. ved å assigne en STATE-klasse til _STATE endrer man virtuell-tabellen til den som gjelder for STATE-klassen. class Watch { Time time; void mode(...) void incr(...) Watch (){ _STATE = Display class Hours STATE { void mode(){ _STATE = Minutes void incr(){ time.incrhours(1); class Minutes STATE { void mode(){ _STATE = Display void incr(){ time.incrminutes(1); class Display STATE { void mode(){ _STATE = Hours void settime(time newtime){time= newtime; Hva oversettes awatch.mode() da til? Oppgave 3 (20%) I denne oppgaven bruker vi språket som ble innført i 2f. Det følgende er et fragment av grammatikken for språket. Vi har bare tatt med de detaljer i språket som er aktuelle for oppgaven: classdecls classdecls ; classdecl classdecls classdecl classdecl class name { methoddecls classdecls classdecl class name STATE{ methoddecls methoddecls methoddecls ; methoddecl methoddecls methoddecl methoddecl type name () body type int type bool type void Ord i kursiv er ikke-terminaler, ord og tegn i fet skrift er terminal-symboler, mens name representerer et navn som scanneren leverer. Det kan antas at name har attributtet name. I dette språket er en metode uten parametere og med typen void en såkalt event-metode. Den semantiske regelen er at en event-metode i en indre STATE-klasse må matche en event-metode i den omsluttende klasse. Den semantiske regelen som uttrykker akkurat dette er allerede lagt inn i attributtgrammatikken (ved attributtet match i methoddecl), og denne reglen baserer seg på følgende attributter: 4

classdecl eventmethods: set of names of event-methods for this class enclosingeventmethods: set of names of event-methods from enclosing class that should match the event methods for this class in case it is a STATE class methoddecls enclosingeventmethods: set of names of event-methods from enclosing class that should match the event methods among methods represented by this methoddecls shallmatcheventmethod: true if the methods represented by this methoddecls are methods of a STATE class, false otherwise methoddecl enclosingeventmethods: set of names of event-methods from enclosing class that shall contain the name of the method represented by this methoddecl shallmatcheventmethod: true if method of a STATE class, false otherwise error: true if method of a STATE class matches an event method of the enclosing class, false otherwise Det brukes følgende funksjoner, samt union av mengder (+): set(name): Lager en mengde med name som element s.lookup(name): true if name is in the set, otherwise false Gjør ferdig de semantiske regler for disse attributter. Du kan besvare dette spørsmålet ved å bruke vedlegget side 8 eller ved å lage en tilsvarende tabell selv. Oppgave 4 (25%) Vi skal her se på kodegenerering for «lange» if-then-else setninger av formen: if <condition> then <statement> elseif <condition> then <statement> elseif <condition> then <statement> elseif <condition> then <statement> else <statement> endif Her er elseif et nytt nøkkelord, og meningen med setningen skulle fremgå av syntaksen. Det kan være null eller flere elseif-grener, og null eller én else-gren til slutt. 4a Skissér et flyt-diagram (med bokser som angir koden til setninger og betingelser) som viser hvordan denne setningen kan oversettes, og angi spesielt hvordan «labler» og hopp skal plasseres. 4b Vi antar at setninger beskrevet i forrige punkt er representert i det abstrakte syntakstreet med følgende nodeklasser (i Java): 5

class Statement extends { // Vi bryr oss ikke med klassehierarkiet over dette nivået void abstract codegen( ); static String getnewlabel( ) { er ferdig programmert // genererer nye label-navn class IfStatement extends Statement { ElseIf first; /* Peker til første i en liste av ElseIf-objekter (se klassen ElseIf under). Merk at også «condition/statement»-paret som følger direkte etter første if er med i denne listen, slik at den alltid inneholder minst ett element. */ Statement elsestat; // NULL om det ikke er else-gren void codegen { // Denne skal du skrive! Og vi anbefaler at all kodegenerering for if-setningen gjøres her. class ElseIf extends { Condition cond; Statement stat; ElseIf next; // NULL om den er den siste i elseif-lista // Anbefaling: Ingen codegen( ) her. All TA-kode generes da fra codegen() i IfStatement. class Condition extends { String codegen() { /* Denne skal du kalle, men ikke skrive. Den vil generere kode som beregner verdien av betingelsen (true eller false), og vil leverere en String som er navnet på den variabelen der svaret vil ligge. Se detaljer under. */ Vi antar at treet for det aktuelle programmet er satt opp før vi starter kodegenereringen. Merk altså at det her bare er den codegen-metoden som behandler «Condition» som leverer en String. Denne String en vil altså være navnet på den (kanskje temporære) variablen der svaret (true eller false) vil ligge etter at denne «Condition» er beregnet under utførelsen. For å få lagt ut en TA-instruksjon kan du kalle metoden «void emit(string instr){» (som er direkte synlig). Denne er ferdig skrevet, og instruksjonene fra påfølgende kall vil da bli lagt pent etter hverandre på en fil. De TA-instruksjonene du trenger burde være kurante (og det er ikke nøye om de har akkurat samme syntaks som i boka). Oppgaven: Les kommentarene i klassene over nøye, og skriv så innmaten av void codegen( )» i IfStatement (slik som antydet over). Vi anbefaler altså at du skriver denne metoden slik at den gjør all kodegenerering for hele if-setningen, men det er også OK om du legger noe av arbeidet inn i en «codegen»-metode i ElseIf-klassen. 6

4c Du skal her skrive codegen( )-metoden i klassen IfStatement (se 4b) en gang til, men under litt andre betingelser. Denne gangen antar vi at codegen-metoden i klassen Condition har to stringparametere (som er label-navn), og at metoden ikke leverer noen String. Når den kalles skal den (som parametre) få med «labler» som angir stedene man skal hoppe til dersom betingelsen blir hhv. true og false. Koden den genererer vil alltid hoppe til en av disse lablene (og altså aldri «falle gjennom» til instruksjonen etter). Klassen Condition er slik: class Condition extends { void codegen(string truelab, falselab) { // Denne skal du kalle, men ikke skrive. Les teksten over om hva den gjør. Oppgaven: Skriv en ny utgave av codegen()-metoden i klassen IfStatement under de betingelser som er beskrevet over. Det er viktig her at alle hopp blir så direkte som mulig. Lykke til! Stein Krogdahl og Birger Møller-Pedersen 7

Vedlegg til besvarelse av Oppgave 3 Kandidat nr:... Dato:... Grammar Rule Semantic Rule classdecls 1 classdecls 2 ; classdecl classdecls classdecl classdecl class name { methoddecls classdecls classdecl class name STATE { methoddecls methoddecls.shallmatcheventmethod = true methoddecls 1 methoddecls 2 ; methoddecl methoddecls 1.eventMethods = methoddecl 2.eventMethods + methoddecl.eventmethods methoddecls methoddecl methoddecl type name () body if type.type = void then methoddecl.eventmethods = set(name) error = if type.type = void and methoddecl.shallmatcheventmethod then if methoddecl.enclosingeventmethods.lookup(name) then true else false 8