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

Like dokumenter
INF april, 2013 Kap. 8 kodegenerering

INF og 23. april, 2014 Kap. 8 kodegenerering

Hovedstoffet i kap 4: 16. Februar Ifi, UiO

Hovedstoffet i kap 4:

Kap. 8 del 1 kodegenerering INF april, 2008

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

INF og 13. april, Stein Krogdahl, Ifi UiO

INF og 27. april, 2010 Kap. 8 kodegenerering. Stein Krogdahl, Ifi UiO

Kap. 8 kodegenerering INF april, 2009

Stein Krogdahl, Ifi UiO

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

Kap. 8 del 1 kodegenerering INF5110 Vår2007

INF april, 2015 Kap. 8 kodegenerering. Del 2

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

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

UNIVERSITETET I OSLO

INF Noen oppgaver til kap. 8

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

INF Noen oppgaver til kap. 8

INF5110. Oblig 2 presentasjon

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

Eivind Gard Lund. 24. Mars 2009 Foilene bygger på 2009 utgaven av Andreas Svendsen

INF Oblig 2 semantikksjekk og kodegenerering

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

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

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

MED SVARFORSLAG UNIVERSITETET I OSLO. Det matematisk-naturvitenskapelige fakultet

Obligatorisk Oppgave 1

UNIVERSITETET I OSLO

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

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

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

Obligatorisk Oppgave 1

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

INF5110 V2012 Kapittel 4: Parsering ovenfra-ned

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

Runtime-omgivelser Kap 7 - I

Javas klasse-filer, byte-kode og utførelse (og litt om C# sin CIL-kode)

Gjøre noe i hele treet = kalle på samme metode i alle objekten. Java datastruktur Klassestruktur

Kapittel 1 En oversikt over C-språket

Litt om Javas class-filer og byte-kode

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

Dagens tema: Sjekking

Eks 1: Binærtre Binærtretraversering Eks 2: Binærtre og stakk

Dagens tema. INF Algoritmer og datastrukturer. Binærtrær. Generelle trær

UNIVERSITETET I OSLO

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

Datatyper og typesjekking

Runtimesystemer Kap 7 - I

INF1010 Rekursive metoder, binære søketrær. Algoritmer: Mer om rekursive kall mellom objekter Ny datastruktur: binært tre

Viktig. Rettet i koden. Oppgaven. Obligatorisk oppgave 2 - Kort om oppgaven og litt informasjon. Fredrik Sørensen OMS-gruppen, IfI

NOTAT (pensum!) Javas klasse-filer, byte-kode og utførelse

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen Oppsummering

Datatyper og typesjekking

Kodegenerering del 3: Tilleggsnotat fra AHU Samt litt om class-filer og byte-kode INF5110 V2007. Stein Krogdahl, Ifi UiO

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

Datatyper og typesjekking

Datatyper og typesjekking

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

Del 3: Evaluere uttrykk

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

Dagens Tema: Grammatikker

Runtimesystemer Kap 7 - I

NOTAT (pensum!) Javas klasse-filer, byte-kode og utførelse. INF 5110, 10/5-2011, Stein Krogdahl

Del 1 En oversikt over C-programmering

Anatomien til en kompilator - I

Repetisjon: Binære. Dagens plan: Rød-svarte trær. Oppgave (N + 1)!

Semantisk Analyse del III

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

Anatomien til en kompilator - I

INF110 Algoritmer og datastrukturer TRÆR. Vi skal i denne forelesningen se litt på ulike typer trær:

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

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)

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

INF 5110, 3. februar Dette foilheftet: Kapittel 3

MED SVARFORSLAG 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

Oversikt Kodegenerering Variabler Setninger Uttrykk While-setningen

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

INF2220: Forelesning 1. Praktisk informasjon Analyse av algoritmer (kapittel 2) (Binær)trær (kapittel )

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: Sjekking (obligatorisk oppgave 3)

KONTINUASJONSEKSAMEN

Oblig 2 - Simpila. INF Kompilatorteknikk. Våren Typesjekking, sjekking av bruk av navn og blokkstrtuktur i språk.

UNIVERSITETET I OSLO

INF5110 Obligatorisk Oppgave 2 del 2. Andreas Svendsen SINTEF. 23. April Oversikt

Hva er en algoritme? INF HØSTEN 2006 INF1020. Kursansvarlige Ragnar Normann E-post: Dagens tema

Kjøresystemer. Hva er et kjøresystem? Den abstrakte maskinen SIMPLESEM (2.6) Klassifisering av språk: Parametre (2.7.7) Statiske språk (

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

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

INF januar Forelesninger fremover:

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

Dagens Tema: Grammatikker

Semantisk Analyse del I

Transkript:

INF5110 16. april, 2013 Kap. 8 Noen oppgaver som er meget relevante for Oblig 2 Oppgave: Ut fra den objektorienterte trestrukturen vi laget for å representere Tiny-programmer (se neste foiler), gjør følgende for uttrykks-nodene: 1. Skisser en metode «void GenCodeP()» i hver nodeklasse for uttrykk, slik at vi får lagt ut P-kode for uttrykket. Legg ut ved «void emit(string code) {» 1. Koden skal lages som ren tekst-kode 2. Vi tenker ikke på typen av operandene 2. Skisser tilsvarende en metode «String GenCodeTA()» som legger ut (ved emit) TA-kode Anta at metoden «String NewTemp(){» leverer et nytt navn 1 til en temporær variabel.

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 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 Kan også ha (gjerne virtuelle) metoder i nodene, f.eks: Ident String name BinOp Char op Expr left Expr right - 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 2

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

Oppgave 1 er altså å lage noe slikt (for P-kode): Antar at vi har «void emit(string code) {» I klassen Const: void GenCodeP() { I klassen Ident: void GenCodeP() { I klassen BinOp: void GenCodeP(){ Men hva med void GenCode(){ i klassen Expr?

Litt bakgrunn fra forelesningsfoilene P-kode (Pascal-kode) utfører beregning på en stakk Instruksjonene utføres normalt etter hverandre, unntak: jump push koder (= load på stakken): lod ; load value ldc ; load constant lda ; load adress 5 2 = a 5

Mer bakgrunn: P-kode II 6

Bakgrunn: P-kode for fakultets-funksjonen 1 2 Blir typisk mange flere P-instruksjoner enn TA-instruksjoner for samme program (Hver P-instruksjon har maks én lager-adresse ) 3 4 5 1 2 3 4 5 6 7 8 9 6 7 8 9

Generering av P-kode fra tre-struktur (progr.strukt. ikke som Oblig 2) rek.kall rek.kall rek.kall switch kind { case OpKind: switch op{ Oversiktlig versjon: Merk: Identifikator og konstant-streng ligger i noden case Plus: { rek. kall for venstre subtre; rek. kall for høyre subtre; emit1 ( adi ); case Assign: { emit2 ( lda, identifikator); rek. kall for eneste subtre; emit1 ( stn ); case ConstKind { emit2 ( ldc, konstant-streng); case IdKind { emit2 ( lod, identifikator);

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 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 Kan også ha (gjerne virtuelle) metoder i nodene, f.eks: Ident String name BinOp Char op Expr left Expr right - 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 9

Svarforslag for «void GenCodeP()» Vi lager først en abstrakt «void GenCodeP();» i klassen Expr (eller gjerne i klassen TreeNode). Så en konkret en i hver av klassene Const, Ident og BinOp: I klassen Const: void GenCodeP() { I klassen Ident: void GenCodeP() { I klassen BinOp: void GenCodeP(){

Svarforslag for «void GenCodeP()» Vi lager først en abstrakt «void GenCodeP();» i klassen Expr (eller gjerne i klassen TreeNode). Så en konkret en i hver av klassene Const, Ident og BinOp: I klassen Const: void GenCodeP() { emit ("ldc " + Value); I klassen Ident: void GenCodeP() { I klassen BinOp: void GenCodeP(){

Svarforslag for «void GenCodeP()» Vi lager først en abstrakt «void GenCodeP();» i klassen Expr (eller gjerne i klassen TreeNode). Så en konkret en i hver av klassene Const, Ident og BinOp: I klassen Const: void GenCodeP() { emit ("ldc " + Value); I klassen Ident: void GenCodeP() { emit ("lod " + Name); I klassen BinOp: void GenCodeP(){

Svarforslag for «void GenCodeP()» Vi lager først en abstrakt «void GenCodeP();» i klassen Expr (eller gjerne i klassen TreeNode). Så en konkret en i hver av klassene Const, Ident og BinOp: I klassen Const: void GenCodeP() { emit ("ldc " + Value); I klassen Ident: void GenCodeP() { emit ("lod " + Name); I klassen BinOp: void GenCodeP(){ left.gencodep(); // Kan være et større uttryks-tre right.gencodep(); // ---- " ---- emit ( <P-kode-instruksjonen tilsv. op> );

Bakgrunn: Hånd -oversettelse til TreAdresse-kode 1 2 3 4 5 6 7 8 9 Mange valg å gjøre ved design av TA-kode: -Er det egne instruksjoner for int, long, float,..? -Hvordan er variable representert? -ved navn -peker til deklarasjon i symbol-tabell -ved maskinadresse -Hvordan er hver instruksjon lagret? - kvadrupler, de tre adressene, og operasjonen - (Eller: tripler, der adressen til instruksjonen er navn på en ny temporær variabel) 1 2 3 4 5 6 7 8 9 Eller?: x = x - 1 14

Bakgrunn: Generering av rent tekstlig TA-kode fra tre-struktur Hoved-delen av en rekursiv metode. Metoden eksekverer inne i noden og leverer et navn eller en konstant-streng: switch kind { case OpKind: switch op { case Plus: { tempnavn = nytt temporær-navn; opnavn1 = rek kall for venstre subtre; opnavn2 = rek kall for høyre subtre; emit ( tempnavn = opnavn1 + opnavn2 ); return (tempnavn); case Assign: { varnavn = id. for v.s.-variabel (ligger i noden); opnavn = rek kall for venstre subtre; emit ( varnavn = opnavn ); return (varnavn); case ConstKind: { return (konstant-streng); // Emitter ingenting! case IdKind: { return (identifikator); // Emitter ingenting!

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 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 Kan også ha (gjerne virtuelle) metoder i nodene, f.eks: Ident String name BinOp Char op Expr left Expr right - 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 16

Svarforslag for «String GenCodeTA()» Vi lager først en abstrakt «String GencodeTA();» i klassen Expr (eller gjerne i klassen TreeNode). Så en konkret en i hver av klassene Const, Ident og BinOp: I klassen Const: String GenCodeTA() { I klassen Ident: String GenCodeTA() { I klassen BinOp: String GenCodeTA(){

Svarforslag for «String GenCodeTA()» Vi lager først en abstrakt «String GencodeTA();» i klassen Expr (eller gjerne i klassen TreeNode). Så en konkret en i hver av klassene Const, Ident og BinOp: I klassen Const: String GenCodeTA() { return "" + value; // Ingen emit I klassen Ident: String GenCodeTA() { I klassen BinOp: String GenCodeTA(){

Svarforslag for «String GenCodeTA()» Vi lager først en abstrakt «String GenCodeTA();» i klassen Expr (eller gjerne i klassen TreeNode). Så en konkret en i hver av klassene Const, Ident og BinOp: I klassen Const: String GenCodeTA() { return "" + value; I klassen Ident: String GenCodeTA() {return name; // Ingen emit I klassen BinOp: String GenCodeTA(){

Svarforslag for «String GenCodeTA()» Vi lager først en abstrakt «String GenCodeTA();» i klassen Expr (eller gjerne i klassen TreeNode). Deretter en konkret en i hver av klassene Const, Ident og BinOp: I klassen Const: String GenCodeTA() { return "" + value; I klassen Ident: String GenCodeTA() {return name; I klassen BinOp: String GenCodeTA(){ String s1, s2; String t = NewTemp(); s1 = left.gencode(); s2 = right.gencode(); emit ( t + " = " + s1 + op + s2 ); return t;