Dagens tema: 12 gode råd for en kompilatorskriver

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

Råd nr 1: Start nå! Det tar typisk timer å programmere Del 1 om man ikke har gjort slikt før. Dagens tema:

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

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

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

Dagens tema: 12 gode råd for en kompilatorskriver. Prosjektet. Modifikasjon av grammatikken. Utifra dette RusC programmet:

Dagens tema: 12 gode råd for en kompilatorskriver. Prosjektet. Koblingen mellom grammatikken og klasser. Utifra dette RusC-programmet:

Dagens tema: Resten av det dere trenger til del 1

Dagens tema: Resten av det dere trenger til del 1

Dagens tema: Mer av det dere trenger til del 1

Velkommen til INF2100

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

Hvordan skrive Flok og Flass kode? I mange tilfelle er det svært enkelt:

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

Velkommen til INF2100 Jeg er Dag Langmyhr

Hovedansvarlig. Symbolgenerator. Tregenerator. Litt mer kompliserte setninger med betingelser

Dagens tema: INF2100. Utvidelser av Minila array-er. tegn og tekster. Flass- og Flokkode. prosedyrer. Prosjektet struktur. feilhåndtering.

INF okt. 2004

Dagens tema: Sjekking

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

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

UNIVERSITETET I OSLO

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

UNIVERSITETET I OSLO

Oversikt Kompilering Syntaksanalyse Java Feilsjekking Oppsummering

INF1000: noen avsluttende ord

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

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen Oppsummering

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

INF Uke 10. Ukesoppgaver oktober 2012

Jentetreff INF1000 Debugging i Java

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF1000: noen avsluttende ord

Seminaroppgaver IN1010, uke 2

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

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

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

løsningsforslag-uke5.txt

Hjemmeeksamen 2 i INF3110/4110

UNIVERSITETET I OSLO

Programmering Høst 2017

Uke 8 Eksamenseksempler + Ilan Villanger om studiestrategier. 11. okt Siri Moe Jensen Inst. for informatikk, UiO

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

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

INF1000 oppgaver til uke 38 (17 sep 23 sep)

Oblig4 - forklaringer. Arne og Ole Christian

Dagens tema Kapittel 8: Objekter og klasser

INF 1000 høsten 2011 Uke september

2 Om statiske variable/konstanter og statiske metoder.

INF1000: Forelesning 6. Klasser og objekter del 1

TDT4100 Objektorientert programmering

INF1000 undervisningen INF 1000 høsten 2011 Uke september

Enkle generiske klasser i Java

Programmeringsspråket C

INF 1010, vår 2005 Løsningsforslag uke 11

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

Forelesning inf Java 4

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

UNIVERSITETET I OSLO

IN Notat om I/O i Java

Tre måter å lese fra terminal. Java 4. Eksempel. Formatert utskrift til skjerm

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

INF1000 : Forelesning 4

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

i=0 i=1 Repetisjon: nesting av løkker INF1000 : Forelesning 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker j=0 j=1 j=2 j=3 j=4

UNIVERSITETET I OSLO

"behrozm" Oppsummering - programskisse for traversering av en graf (dybde først) Forelesning i INF februar 2009

Oppgave 1. Oppgave 2. Oppgave 3. Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

EKSAMENSFORSIDE Skriftlig eksamen med tilsyn

INF Obligatorisk innlevering 5

Oversikt Kodegenerering Variabler Setninger Uttrykk While-setningen

Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

Forklaring til programmet AbstraktKontoTest.java med tilhørende filer Konto.java, KredittKonto.java, SpareKonto.java

Oppgave 1. INF1000 Uke 13. Oppgave 2. Oppgave 3. Er dette lovlige deklarasjoner (når de foretas inni en metode)? JA NEI

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

INF Enkel historikk over modul-utvikling. Ønsker til en god oppdeling. Program-arkitektur: Hvordan dele opp i moduler/komponenter?

Løse reelle problemer

Fra Python til Java. En introduksjon til programmeringsspråkenes verden. Dag Langmyhr

Lenkelister. Lister og køer. Kopi av utvalgte sider fra forelesningen.

Introduksjon til objektorientert. programmering. Hva skjedde ~1967? Lokale (og globale) helter. Grunnkurs i objektorientert.

UNIVERSITETET I OSLO

Forelesning inf Java 5

IN 147 Program og maskinvare

Forelesning inf Java 5

Forkurs INF1010. Dag 1. Andreas Færøvig Olsen Tuva Kristine Thoresen

Dagens tema. C-programmering. Nøkkelen til å forstå C-programmering ligger i å forstå hvordan minnet brukes.

class Book { String title; } class Dictionary extends Book { int wordcount; } class CartoonAlbum extends Book { int stripcount; }

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

Forkurs INF1010. Dag 2. Andreas Færøvig Olsen Gard Inge Rosvold Institutt for Informatikk, 14.

Programmering i C++ Løsningsforslag Eksamen høsten 2005

Transkript:

Dagens tema: 12 gode råd for en kompilatorskriver Hvordan sjekke navn? Testutskrifter 12 gode råd

Hva skal gjøres med navn? Sjekking av navn En kompilator må også sjekke riktig navnebruk: Det må ikke forekomme dobbeltdeklarasjoner. Alle navn må være deklarert. Navnet må brukes riktig (enkel variabel kontra array kontra prosedyre).

Lagring av navn Lagring av navn Det enkleste er å lagre navnene i deklarasjonsobjektet: class DeclSeqv { private Decl firstdecl, lastdecl;. } class VarDecl extends Decl { private boolean isarray, isparam; private int arraylength;. } class Decl { private Decl next; protected String name;. } class ProcDecl extends Decl { private VarDecl inpar, outpar; private DeclSeqv ds; private SentSeqv ss;. }

Hvordan finne navn? Hvordan finne et navn? I Minila programmet kan vi ha følgende setning: x := a[4] + 1; Hvilken x er det snakk om, og hvilken a?

Hvordan finne navn? Lokale variable Det enkleste er å sjekke om variabelen er en lokal variabel proc p in a[]; var x; begproc. x := a[4] + 1;. endproc; La analyze få med en parameter som peker til den lokale deklarasjonslisten: void analyze (DeclSeqv localdeclseqv) {. }

Hvordan finne navn? Global navn Navn kan imidlertid være deklarert «lenger ute»: prog var a; proc p1; var b; proc p2; var c; begproc... a... b... c... endproc; : Hvordan finner globale navn? Det enkleste er å la hvert DeclSeqv objekt ha en peker til sin nærmeste omliggende deklarasjonsliste.

Hvordan finne navn? Skjuling av navn Som i de fleste språk vil en indre deklarasjon skjule en ytre. prog var a; proc p1; var a; begproc... a... endproc :

Hvordan finne navn? Deklarasjonsrekkefølgen Husk at navn i Minila først er kjent etter at de er deklarert. prog var a; proc p1; proc p2; begproc... a... endproc; var a; proc p3; begproc... a... endproc :

Oversikt Testutskrifter Det er lett å gjøre feil når man programmerer noe såpass komplisert som en kompilator. Det lureste er å godta dette og heller finne teknikker for å oppdage feilen. S utskriftene fra del 0 forteller om analysen er synkronisert med SymbolGenerator, A utskrifter avslører om man gjør riktige valg i jernbanediagrammene. Det beste er å la hver analyze gi lyd fra seg. P utskrifter sjekker om analysetreet ble riktig ved å skrive det ut etterpå.

A utskrifter Et veldig enkelt Minila program. prog var x, z; proc read out a; begproc a := inint; endproc; proc write in a; begproc outint(4) a; outline; endproc; begprog call read into x; z := x; call write with z; endprog

A utskrifter 1: Et veldig enkelt Minila program. 2: 3: prog A: INN Program 4: var x, z; A: INN DeclSeqv A: INN VarDecl A: UT VarDecl A: INN VarDecl 5: A: UT VarDecl 6: proc read out a; A: INN ProcDecl A: INN VarDecl A: UT VarDecl 7: begproc A: INN DeclSeqv A: UT DeclSeqv 8: a := inint; A: INN SentSeqv A: INN AssignSent A: INN AssignVar A: UT AssignVar A: INN Expression A: INN InIntPart A: UT InIntPart A: UT Expression A: UT AssignSent 9: endproc; A: UT SentSeqv 10: A: UT ProcDecl 11: proc write in a; A: INN ProcDecl A: INN VarDecl A: UT VarDecl 12: begproc 13: outint(4) a; outline; A: INN DeclSeqv A: UT DeclSeqv A: INN SentSeqv A: INN OutIntSent A: INN Expression A: INN VarPart A: UT VarPart A: UT Expression A: UT OutIntSent A: INN OutLineSent A: UT OutLineSent 14: endproc; A: UT SentSeqv 15: begprog A: UT ProcDecl A: UT DeclSeqv 16: call read into x; A: INN SentSeqv A: INN CallSent A: INN AssignVar A: UT AssignVar A: UT CallSent 17: z := x; A: INN AssignSent A: INN AssignVar A: UT AssignVar

P utskrifter prog var x ; var z ; proc read out a ; begproc a := inint ; endproc ; proc write in a ; begproc outint( 4 ) a ; outline ; endproc ; begprog call read into x ; z := x ; call write with z ; endprog

Start nå! Råd nr 1: Start nå! Det tar typisk 10 50 timer å programmere Del 1 om man ikke har gjort slikt før. Påtrengende spørsmål Det er 21 dager til 7. november. Hvor mange timer per dag blir det?

Forstå hva du skal gjøre! Råd nr 2: Forstå problemet! Forstå hva du skal gjøre før du begynner å programmere. NB! Skriv noen korte kodesnutter i Minila. Tegn syntakstrærne deres. Studér eksemplet med kalkulatoren i øvelsesoppgavene. På dette stadium kan man samarbeide så mye man ønsker!

Forstå hva du skal gjøre! Program DeclSeqv SentSeqv prog var n; begprog outtext "Skriv et tall: "; n := inint; outtext "Det dobbelte er "; outint(1) 2*n; outline; endprog Decl VarDecl Sent OutTextSent Sent AssignSent Expression ExprPart InIntPart Sent Sent Sent OutTextSent OutIntSent OutLineSent Expression ExprPart ExprPart ConstPart VarPart

Start enkelt! Råd nr 3: Start med noe enkelt! Ingen bør forvente at de kan skrive all koden og så bare virker den. Start med et enkelt programmeringsspråk Program : prog begprog endprog og få det til å virke først. Utvid etter hvert. Sjekk hver utvidelse før du går videre.

Start enkelt! class Program { public void analyze (DeclSeqv localdeclseqv) { listresp.testaout("inn", "Program"); if(! symbgen.curis("prog")) mainresp.error("programmet startet ikke med prog"); symbgen.readsymbol(); if(! symbgen.curis("begprog")) mainresp.error("forventet begprog"); symbgen.readsymbol(); if(! symbgen.curis("endprog")) mainresp.error("forventet endprog"); symbgen.readsymbol(); } } listresp.testaout("ut","program");

Bruk aktiv feilsøking! Råd nr 4: Ikke sitt og stirr på koden! Når programmet ikke virker: 1. Se på siste versjon av programkoden. 2. Siden du arbeider i små steg er feilen sannsynligvis i de siste linjene du endret. 3. Hvis du ikke har funnet feilen i løpet av fem minutter, gå over til aktiv feilsøking.

Husk testutskriftene! Råd nr 5: Les testutskriftene! A utskriftene forteller hvilke analyze metoder som kalles. Anta at vi har programmet prog var i; begprog i := 3; endprog Programmet gir en feilmelding i linje 2: ***Feil: Forventet begprog Hva er galt?

Husk testutskriftene! Svaret kan vi finne i A utskriften: 1: prog 2: var i; A: INN Program A: INN SentSeqv ***Feil: Forventet begprog Utskriften skulle ha startet 1: prog 2: var i; A: INN Program A: INN DeclSeqv A: INN VarDecl 3: begprog A: UT VarDecl 4: i := 3; A: UT DeclSeqv A: INN SentSeqv A: INN AssignSent A: INN AssignVar

Husk testutskriftene! P utskriften viser en utskrift av det genererte treet. Anta at vi har det samme testprogrammet prog var i; begprog i := 3; endprog Hvis P utskriften er prog var i ; begprog endprog så vet vi at setninglisten ikke settes opp riktig (eller at det er feil i P utskriften).

Lag egne testutskrifter Råd nr 6: Lag egne testutskrifter Her er litt (muligens feilaktig) kode fra SentSeqv.analyze: public void analyze (DeclSeqv localdeclseqv) { listresp.testaout("inn", "SentSeqv"); Sent newsent = null; while (moresentences()) { if (symbgen.curisname()) newsent = new AssignSent(); else if (symbgen.curis("call")) newsent = new CallSent(); else if (symbgen.curis("if")) newsent = new IfSent(); else if (symbgen.curis("intext")) newsent = new InTextSent(); else if (symbgen.curis("outchar")) newsent = new OutCharSent(); else if (symbgen.curis("outint")) newsent = new OutIntSent(); else if (symbgen.curis("outline")) newsent = new OutLineSent(); else if (symbgen.curis("outtext")) newsent = new OutTextSent(); else if (symbgen.curis("while")) newsent = new WhileSent(); newsent.analyze(localdeclseqv); addsent(newsent); } if (! symbgen.curis(";")) mainresp.error("forventet ; etter setning"); symbgen.readsymbol(); } listresp.testaout("ut", "SentSeqv");

Lag egne testutskrifter Anta at vi får melding om null peker i linjen med newsent.analyze. Slikt skal ikke skje. Mitt råd er å legge inn noe à la while (moresentences()) { System.out.println("SentSeqv.analyze: " + "symbgen.curis er " + symbgen.curis());

Behold testutskriftene! Råd nr 7: Behold testutskriftene! Når feilen er funnet, bør man la testutskriften forbli i koden. Man kan få bruk for den igjen. Derimot bør man kunne slå den av eller på: Det mest avanserte er å bruke opsjoner på kommandolinjen: java MinMinila debugss.a testprog.min

Behold testutskriftene! Det fungerer også godt å benytte statusvariable: static boolean debugss_a = true;. if (debugss_a) { System.out.println("SentSeqv.analyze: " + "symbgen.curis er " + symbgen.curis()); }

Stol ikke på det du har skrevet! Råd nr 8: Mistro din egen kode! Det er altfor lett å stole på at ens egen kode andre steder er korrekt. Løsningen er å legge inn assertions som bare sjekker at alt er som det skal være (som vist her i IfSent.analyze): public void analyze (DeclSeqv localdeclseqv) { listresp.testaout("inn", "IfSent"); assert symbgen.curis("if"): "If setning starter ikke med if."; }.

Stol ikke på det du har skrevet! NB! Husk å kjøre med java ea Minila for å slå på mekanismen.

Synkronisér med symbolgeneratoren! Råd nr 9: Sjekk spesielt på readsymbol! Det er lett å kallereadsymbol for ofte eller for sjelden. Her er et forsøk på å skrive IfSent.analyze: public void analyze (DeclSeqv localdeclseqv) { listresp.testaout("inn", "IfSent"); } cond = new Condition(); cond.analyze(localdeclseqv); if (! symbgen.curis("then")) mainresp.error("forventet then etter betingelse"); SS = new SentSeqv(); SS.analyze(localDeclSeqv); if (symbgen.curis("else")) { elsess = new SentSeqv(); elsess.analyze(localdeclseqv); } if (! symbgen.curis("endif")) mainresp.error("forventet endif til slutt i If setn"); listresp.testaout("ut", "IfSent"); Hvor skal det kall på readsymbol?

Synkronisér med symbolgeneratoren! Husk kontrakten med SymbolGenerator Her er reglene som analyze metodene må følge: 1. Når man kaller analyze, skal første symbol være lest inn. 2. Når man returnerer fra en analyze, skal første symbol etter konstruksjonen være lest. Vær spesielt oppmerksom på if tester og løkker.

Synkronisér med symbolgeneratoren! public void analyze (DeclSeqv localdeclseqv) { listresp.testaout("inn", "IfSent"); symbgen.readsymbol(); cond = new Condition(); cond.analyze(localdeclseqv); if (! symbgen.curis("then")) mainresp.error("forventet then etter betingelse"); symbgen.readsymbol(); SS = new SentSeqv(); SS.analyze(localDeclSeqv); if (symbgen.curis("else")) { symbgen.readsymbol(); elsess = new SentSeqv(); elsess.analyze(localdeclseqv); } if (! symbgen.curis("endif")) mainresp.error("forventet endif til slutt i If setn"); } symbgen.readsymbol(); listresp.testaout("ut", "IfSent");

Ta sikkerhetskopier! Råd nr 10: Ta kopier daglig eller oftere! Programmering er mye prøving og feiling. Noen ganger må man bare glemme alt man gjorde den siste timen. Det finnes systemer for versjonskontroll som man bør lære seg før eller siden. I mellomtiden kan man ha nytte av 1. Ta en kopi av Java filen hver gang du starter med å legge inn ny kode. 2. Ta uansett en kopi hver dag (om noe som helst er endret).

Hele folket i arbeid! Råd nr 11: Fordel arbeidet! Dere er to om jobben. Selv om begge må kjenne til hovedstrukturen, kan man fordele programmeringen. Forslag 1. Én tar det som har med deklarasjoner. 2. Én tar det som har med setninger. Men... Snakk ofte sammen. Planlegg hvordan dere bruker filene så ikke den ene ødelegger det den andre har gjort.

Søk profesjonell hjelp! Råd nr 12: Bruk hjelpemidlene Spør gruppelærerne! De er tilgjengelige under gruppetimene og svarer på e post til andre tider. Orakel Siste uken før oblig fristene vil de sitte på terminalstuen i Abel for å svare på spørsmål. Les kompendiet Stoffet er forklart med flere detaljer enn det er mulig på forelesningene.

Hva har vi vært innom? Vi har snakket om Navn lagres i deklarasjonsobjektet. analyze får med peker til lokale deklarasjonsliste. Hver deklarasjonsliste peker på listen utenfor. Testutskriftene er svært nyttige. 12 gode råd.