Dagens tema: Mer av det dere trenger til del 2

Like dokumenter
Dagens tema: Mer av det dere trenger til del 1

Dagens tema: Generelt om variable. Kodegenerering. Deklarasjon av array er. Versjonskontroll. Oppslag i array er

Dagens tema: 12 gode råd for en kompilatorskriver

Dagens tema: Kodegenerering. Redigeringsverktøy. Versjonskontroll. Array-er Funksjoner og kall Hovedprogrammet Noen siste gode råd.

Dagens tema: Kodegenerering. Versjonskontroll. Variabler, spesielt vektorer Funksjoner, kall og parametre Noen siste gode råd.

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: 12 gode råd for en kompilatorskriver. Sjekking av navn. Lagring av navn. Hvordan finne et navn?

Dagens tema: Mer av det dere trenger til del 1

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

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

Dagens tema: Resten av det dere trenger til del 1

Tema for siste forelesning:

Dagens tema: Resten av det dere trenger til del 1

Tema for siste forelesning:

Dagens tema: Koding. Høynivåprogrammering, kommentarer og stil Kompilering av store programsystemer Prosjekter, samarbeide og versjoner

Dagens tema: Koding. Programmering i høynivåspråk. Navn. Mitt forslag:

Dagens tema: Sjekking

Oversikt Kompilering Syntaksanalyse Java Feilsjekking Oppsummering

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

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?

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

Dagens tema: Resten av det dere trenger til del 2

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

Del 3: Evaluere uttrykk

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

INF2100. Oppgaver 23. og 24. september 2010

Dagens tema: Sjekking (obligatorisk oppgave 3)

INF2100. Oppgaver 6. og 11. oktober 2011 C 100 X 10

INF2100. Oppgaver uke 40 og

INF2100. Oppgaver 9. oktober 2012 C 100 X 10

INF2100. Oppgave 1. Oppgave 2 4. Løsningsforslag til oppgaver uke 40 og Se figur 1 på neste side.

Velkommen til INF2100

INF2100. Oppgaver 26. september til 1. oktober 2007

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

Hjemmeeksamen 2 i INF3110/4110

Programmeringsspråket C

IN2030. Oppgave 1. Løsningsforslag. Uke (Disse filene finnes også i mappen ~inf2100/e/e2/.)

INF2100. Oppgave 1, 2 og 3. Løsningsforslag til oppgaver 23. og 24. september Her er det mange mulige løsninger her er én: import java.io.

Versjonskontrol med Subversion. og TortoiseSVN

Oversikt Kodegenerering Variabler Setninger Uttrykk While-setningen

Velkommen til INF2100

UKEOPPGAVER 13: KONFIGURASJONSSTYRING

2 Om statiske variable/konstanter og statiske metoder.

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen

Velkommen til INF2100

Velkommen til INF2100

Dagens tema: Nødvendig Java. De ulike modulene i prosjektet vårt Prosjektet

Introduksjon til versjonskontroll av Ola Lie

Dagens tema: Kompilatorens struktur. De ulike modulene Prosjektet. Oppbyggingen Pakker i Java Avbrudd («exceptions») Enum-klasser i Java

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen Oppsummering

Velkommen til INF2100

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

Syntaksanalyse. Skanner (repetisjon) Parsering top-down bottom-up LL(1)-parsering Recursive descent Forutsetninger. IN 211 Programmeringsspråk

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

Fra Python til Java, del 2

Dagens tema: Resten av det dere trenger til del 1

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

Semantisk Analyse del I

Dagens tema: Kompilatorens struktur. De ulike modulene Prosjektet. Oppbyggingen Pakker i Java Avbrudd («exceptions») Enum-klasser i Java

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

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

Velkommen til INF2100

Jentetreff INF1000 Debugging i Java

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

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; }

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

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

Obligatorisk Oppgave 1

Oversikt. Introduksjon Kildekode Kompilering Hello world Hello world med argumenter. 1 C programmering. 2 Funksjoner. 3 Datatyper. 4 Pekere og arrays

2 Om statiske variable/konstanter og statiske metoder.

Språktyper og syntaksanalyseteknikker. Dagens temaer. Hvordan lage en deterministisk automat? Fra jernbanediagram til ID-automat

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen

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

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

INF1010 våren januar. Objektorientering i Java

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

Velkommen til INF2100. Bakgrunnen for INF2100. Hva gjør en kompilator? Prosjektet. Jeg er Dag Langmyhr

Øving 0 - Xcode TDT4102

Hva er syntaks? En overskrift i en norsk avis: Dagens tema Grundig repetisjon og utdyping:

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

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

En kompilator for Pascal. Kompendium for INF2100

GUI («Graphical User Interface») del 2

UNIVERSITETET I OSLO

IN1010 våren januar. Objektorientering i Java

En kompilator for Pascal. Kompendium for INF2100

INF1000 (Uke 4) Mer om forgreninger, While-løkker

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

Dagens tema: Resten av det dere trenger til del 1

Dagens tema: Nødvendig Java. De ulike modulene Prosjektet. Strukturen Pakker i Java Avbrudd («exceptions») Enum-klasser i Java Hvilket objekt er jeg?

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

Kompilering Syntakstreet Syntaksanalyse Programmering Statiske Programmering

Programmeringsspråket C

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

I dag INF1000 (Uke 4) Mer om forgreninger, While-løkker. Tre måter å lese fra terminal. Repetisjon. Mer om forgrening While-løkker

INF 1000 høsten 2011 Uke september

Obligatorisk Oppgave 1

INF1000 undervisningen INF 1000 høsten 2011 Uke september

Transkript:

Dagens tema Dagens tema: Mer av det dere trenger til del 2 Hvilke klasser trenger vi? Testutskrifter Versjonskontroll 12 gode råd

Dagens tema Prosjektet Vi skal parsere (= syntaksanalysere) dette programmet: program Power2; var v: integer; /* pow2: Computes biggest power of 2 not bigger than x. */ function pow2 (x: integer): integer; var p2: integer; begin p2 := 1; while 2*p2 <= x do p2 := 2*p2; pow2 := p2 end; begin v := pow2(1000); write( pow2(1000) =, v, eol) end.

Dagens tema program Power2; var v: integer; /* pow2: Computes biggest power of 2 not bigger than x. */ function pow2 (x: integer): integer; var p2: integer; begin program p2 := 1; while 2*p2 <= x do p2 := 2*p2; pow2 := p2 end; begin v := pow2(1000); write( pow2(1000) =, v, eol) end. block var decl part func decl statm list var decl param decl list type name block assign statm proc call type param decl var decl part statm list variable expression expression expression expression type name type name type..................... type name

Hvor mange klasser trenger vi? Koblingen mellom grammatikken og klasser Normalt skal det være én klasse for hver ikke-terminal i grammatikken: while-statm while expression do statement class WhileStatm extends Statement { Expression expr; Statement body;

Hvor mange klasser trenger vi? Valgdefinisjoner Hva med ikke-terminaler som bare er en samling alternativer? statement assign statm Dårlig løsning God løsning compound statm empty statm if-statm proc call while-statm class Statement extends PascalSyntax { AssignStatm as = null; CompundStatm cs = null; EmptyStatm es = null; IfStatm is =null; ProcCall pc = null; WhileStatm ws = null; abstract class Statement extends PascalSyntax {

Hvor mange klasser trenger vi? abstract class Statement extends PascalSyntax { Statement(int lnum) { super(lnum); } static Statement parse(scanner s) { enterparser("statement"); Statement st = null; switch (s.curtoken.kind) { case begintoken: st = CompoundStatm.parse(s); break; case iftoken: st = IfStatm.parse(s); break; case nametoken: switch (s.nexttoken.kind) { case assigntoken: case leftbrackettoken: st = AssignStatm.parse(s); break; default: st = ProcCallStatm.parse(s); } break; case whiletoken: st = WhileStatm.parse(s); default: st = EmptyStatm.parse(s); } break; break; break; } leaveparser("statement"); return st;

Er virkelig Pascal2100 LL(2)? LL(1) eller LL(2) Pascal2100 er ikke LL(1) siden f eks statement ikke kan avgjøres bare ved å se på første symbol. Er så Pascal2100 LL(2)? Svaret er: Ja, med ett unntak.

Er virkelig Pascal2100 LL(2)? La oss se på setningen v := a Det er en assign statm variable := expression Venstresiden er grei: variable name [ expression ]

Er virkelig Pascal2100 LL(2)? Hva så med høyresiden? expression simple expr rel opr simple expr simple expr term opr prefix opr term factor constant variable term factor opr factor func call inner expr negation

Er virkelig Pascal2100 LL(2)? Hva slags factor kan a være? constant name numeric literal variable string literal name [ expression ] func call, name ( expression ) inner expr negation ( expression ) not factor

Er virkelig Pascal2100 LL(2)? Når a kan være enten constant, variable eller func call, hva gjør vi da? 1 Hvis vi har a[, vet vi at det er en variable. 2 Hvis vi har a(, vet vi at vi har en func call. 3 Ellers må vi bare anta at det er en variable og så ordne det senere i kompileringen når vi har koplet navn til sine deklarasjoner.

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. -logp avslører om man gjør riktige valg i jernbanediagrammene. La hver parse gi lyd fra seg. -logy sjekker om analysetreet ble riktig ved å skrive det ut etterpå. -testparser slår på begge disse to (og stopper etter parseringen).

logp Vårt testprogram program Power2; var v: integer; /* pow2: Computes biggest power of 2 not bigger than x. */ function pow2 (x: integer): integer; var p2: integer; begin p2 := 1; while 2*p2 <= x do p2 := 2*p2; pow2 := p2 end; begin v := pow2(1000); write( pow2(1000) =, v, eol) end.

logp 1: program Power2; <program> 2: 3: var v: integer; <block> <var decl part> <var decl> <type> <type name> 4: 5: /* pow2: Computes biggest power of 2 6: not bigger than x. */ 7: function pow2 (x: integer): integer; </type name> </type> </var decl> </var decl part> <func decl> <param decl list> <param decl> <type name> </type name> </param decl> </param decl list> <type name> 8: var p2: integer; </type name> <block> <var decl part> <var decl> <type> <type name> 9: begin </type name> </type> 10: p2 := 1; </var decl> </var decl part> <statm list> <statement> <assign statm> <variable> </variable> <expression> <simple expr> <term> <factor> <constant> <number liter

logp Implementasjon Alle parse-metoder må kalle enterparser("while-statm"); (eller tilsvarende) ved oppstart og leaveparser("while-statm"); ved avslutning; disse er definert i klassen PascalSyntax.

logp I main.logfile finnes den egentlige implementasjonen: public void enterparser(string name) { if (dologparser) { noteparserinfo(name); ++parselevel; } } public void leaveparser(string name) { if (dologparser) { --parselevel; noteparserinfo("/"+name); } } private void noteparserinfo(string name) { String logline = " "; for (int i = 1; i <= parselevel; ++i) logline += " "; writelogline(logline + "<" + name + ">"); }

logy Korrekt parsering av treet sjekkes enkelt ved å regenerere det (såkalt «pretty-printing»): program Power2; var v: integer; Original /* pow2: Computes biggest power of 2 not bigger than x. */ function pow2 (x: integer): integer; var p2: integer; begin p2 := 1; while 2*p2 <= x do p2 := 2*p2; pow2 := p2 end; begin v := pow2(1000); write( pow2(1000) =, v, eol) end. Produsert av -logy program power2; var v: integer; function pow2 (x: integer): integer; var p2: integer; begin p2 := 1; while 2 * p2 <= x do p2 := 2 * p2; pow2 := p2 end; {pow2} begin v := pow2(1000); write( pow2(1000) =, v, eol) end.

logy Et eksempel class WhileStatm extends Statement { Expression expr; Statement body; static WhileStatm parse(scanner s) { enterparser("while-statm"); WhileStatm ws = new WhileStatm(s.curLineNum()); s.skip(whiletoken); ws.expr = Expression.parse(s); s.skip(dotoken); ws.body = Statement.parse(s); } leaveparser("while-statm"); return ws;

logy Alle klasser som utvider SyntaxUnit, må redefinere den virtuelle metoden prettyprint: @Override void prettyprint() { Main.log.prettyPrint("while "); expr.prettyprint(); Main.log.prettyPrintLn(" do"); Main.log.prettyIndent(); body.prettyprint(); Main.log.prettyOutdent(); }

logy I main.logfile finnes noen nyttige metoder: private String prettyline = ""; private int prettyindentation = 0; public void prettyprint(string s) { if (prettyline.equals("")) { for (int i = 1; i <= prettyindentation; i++) prettyline += " "; } prettyline += s; } public void prettyprintln(string s) { prettyprint(s); prettyprintln(); } public void prettyprintln() { writelogline(prettyline); prettyline = ""; } public void prettyindent() { prettyindentation++; } public void prettyoutdent() { prettyindentation--; }

Hva skal vi egentlig gjøre? Prosjektet del 2 Dere skal 1 implementere en parser for Pascal2100 med en klasse for hver ikke-terminal, 2 skrive en egnet metode parse i hver av disse klassene slik at grammatikkfeil blir oppdaget og syntakstreet bygget samt 3 sørge for logging à la -logp og -logy. Til hjelp finnes ~inf2100/oblig/test/ inneholder diverse testprogrammer. ~inf2100/oblig/feil/ inneholder programmer med feil. Parseren din bør kunne håndtere disse programmene.

Samarbeidsproblemer Når flere samarbeider Når flere jobber sammen, kan man tråkke i beina på hverandre: 1 Per tar en kopi av en kildefil og begynner å rette på den. 2 Kari gjør det samme. 3 Kari blir første ferdig og kopierer filen tilbake. 4 Per blir ferdig og kopierer filen tilbake. Karis endringer går tapt.

Versjonskontrollsystemer Løsningen Et versjonskontrollsystem er løsningen. De fleste slike systemer er utsjekkingssystemer basert på låsing: 1 Per ber om og sjekker ut (dvs får en kopi av) filen og begynner å rette på den. 2 Kari ber om en kopi, men får den ikke fordi den er låst. Først når Per er ferdig og sjekker inn filen, kan Kari få sin kopi.

Versjonskontrollsystemer Fordeler med et slikt utsjekkingssystem: Lettforståelig. Ganske sikkert. (Men hva om Per og Kari begge må rette i to filer hver? Da kan de starte med hver sin fil, men når de er ferdige med den første, finner de at den andre er sjekket ut.)

Versjonskontrollsystemer Ulemper: Kari bør kunne få en lese-kopi selv om Per jobber med filen. (Noen systemer tillater det, men ikke alle.) Hva om Per glemmer å legge tilbake filen? Det burde vært lov for Per og Kari å jobbe på ulike deler av filen samtidig.

Innsjekkingssystemer Insjekkingssystemer En bedre løsning er innsjekkingssystemer: Alle kan når som helst sjekke ut en kopi. Ved innsjekking kontrolleres filen mot andre innsjekkinger: Hvis endringene som er gjort, ikke er i konflikt med andres endringer, blandes endringene med de tidligere. Ved konflikt får brukeren beskjed om dette og må manuelt klare opp i sakene.

Innsjekkingssystemer Et scenario 1 Per sjekker ut en kopi av en fil. Han begynner å gjøre endringer i slutten av filen. 2 Kari sjekker ut en kopi av den samme filen. Hun endrer bare i begynnelsen av filen. 3 Per sjekker inn sin kopi av filen. 4 Kari sjekker inn sin kopi, og systemet finner ut at de har jobbet på hver sin del. Innsjekkingen godtas.

Innsjekkingssystemer Når man er alene Selv om du jobber alene med et prosjekt, kan det være svært nyttig å bruke et versjonskontrollsystem: Man kan enkelt finne frem tidligere versjoner. Det kan hende man jobber på flere datamaskiner.

CVS CVS og Subversion Det mest kjente innsjekkingssystemet er CVS («Concurrent Versions System») laget i 1986 av Dick Grune. Det er spesielt mye brukt i Unix-miljøer. For å bøte på noen svakheter i CVS laget firmaet CollabNet Subversion i 2000. Det ble en del av Apache i 2010. Gratis implementasjoner finnes for alle vanlige operativsystemer; se http://subversion.apache.org/.

Subversion Nære og fjerne systemer Subversion kan operere på to ulike måter: Alt skjer i det lokale filsystemet. Man kan starte en Subversion-tjener på en maskin og så sjekke inn og ut filer over nettet. Vi skal gjøre det siste og bruke Ifis Subversion-tjener.

Subversion Opprette et repository 1 Gå inn på nettsiden 2 Logg inn. https://wwws.ifi.uio.no/system/svn/ 3 Velg «My repositories» og «Create new repository». (I dette eksemplet heter det Hallo.) (Alle kan lage inntil tre «repositories».) 4 Hvis det er flere på prosjektet, velg «Edit user access».

Subversion

Subversion Legge inn filer Så kan vi legge inn mapper. La oss lage en gren med mappen Hei som inneholder filen Hello.java: $ cd Hei $ svn import https://sub.ifi.uio.no/repos/users/dag-hallo -m "2100demo" Adding Hei/Hello.java Committed revision 1. Opsjonen -m gir en kort beskrivelse av denne grenen.

Subversion Sjekke ut filer Nå kan vi (for eksempel fra en annen datamaskin) hente ut mappen vår: $ svn co https://sub.ifi.uio.no/repos/users/dag-hallo A dag-hallo/hello.java Checked out revision 1. $ ls -l drwxr-xr-x 3 dag ifi-a 4096 2011-11-13 06:46 dag-hallo $ ls -l -a dag-hallo total 16 drwxr-xr-x 3 dag ifi-a 4096 2011-11-13 06:46. drwxr-xr-x 3 dag ifi-a 4096 2011-11-13 06:46.. drwxr-xr-x 6 dag ifi-a 4096 2011-11-13 06:46.svn -rw-r--r-- 1 dag ifi-a 500 2011-11-13 06:46 Hello.java

Subversion Sjekke inn filer Etter at filen er endret, kan vi sjekke den inn igjen: $ svn commit -m"enklere kode" Sending Hello.java Transmitting file data. Committed revision 2. Vi behøver ikke nevne hvilke filer som er endret det finner Subversion ut selv. (Etter første utsjekking inneholder mappen skjulte opplysninger om repository-et, så det trenger vi ikke nevne mer.)

Subversion Andre nyttige kommandoer svn update. henter inn eventuelle oppdateringer fra repository. svn info viser informasjon om mappen vår: $ svn info Path:. URL: https://sub.ifi.uio.no/repos/users/dag-hallo Repository Root: https://sub.ifi.uio.no/repos/users/dag-hallo Repository UUID: 8c927215-bc3e-0410-a56f-b2451114731f Revision: 2 Node Kind: directory Schedule: normal Last Changed Author: dag Last Changed Rev: 2 Last Changed Date: 2011-11-13 07:02:16 +0100 (Sun, 13 Nov 2011)

Subversion svn diff viser hvilke endringer som er gjort: $ svn diff -r 1:2 Index: Hello.java =================================================================== --- Hello.java (revision 1) +++ Hello.java (revision 2) @@ -7,10 +7,9 @@ Properties prop = System.getProperties(); String versjon = prop.getproperty("java.version"); // Versjonen String koding = prop.getproperty("file.encoding"); // Koding - String hei; + String hei = "Hallo"; - hei = "Hallo"; - hei = hei + ", alle sammen!"; + hei += ", alle sammen!"; System.out.println(hei); System.out.println("Dette er versjon " + versjon); System.out.println("Kodingen er " + koding);

Subversion Om man ikke vil ta i bruk Ifis Subversion-tjener, finnes det mange (ofte gratis) alternativer på nettet, som Bitbucket, GitHub og andre. Husk bare at dette prosjektet ikke får ligge åpent noe sted. Konklusjon De få timene man bruker på å lære seg et versjonskontrollsystem, betaler seg raskt.

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

Start enkelt! Råd nr 2: 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 program name ; block. block og få det til å virke først. Utvid etter hvert. Sjekk hver utvidelse før du går videre.

Bruk aktiv feilsøking! Råd nr 3: 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 4: Les testutskriftene! P-utskriftene forteller hvilke parse-metoder som kalles. Anta at vi har programmet program Test2; function pow2 (x: integer): integer; begin pow2 := 2*x+1 : Programmet gir en feilmelding i linje 2: Expected a : but found a (! Hva er galt?

Husk testutskriftene! Svaret kan vi kanskje finne i P-utskriften: 1: program Test2; <program> 2: function pow2 (x: integer): integer; <block> <func decl> <type name> Utskriften skulle kanskje ha startet 1: program Test2; <program> 2: function pow2 (x: integer): integer; <block> <func decl> <param decl list> <param decl> <type name> </type name> </param decl> </param decl list> <type name>

Husk testutskriftene! Y-utskriften viser en «pen» utskrift av det genererte treet. Anta at vi har det samme testprogrammet program Test2; function pow2 (x: integer): integer; begin pow2 := 2*x+1 : Hvis Y-utskriften er program Test2; function pow2 (x: integer): integer; begin pow2 := 2 : så vet vi at uttrykk ikke lagres riktig (eller at det er feil i Y-utskriften ).

Lag egne testutskrifter Råd nr 5: Lag egne testutskrifter Her er feilaktig kode fra Statement.parse: static Statement parse(scanner s) { enterparser("statement"); Statement st = null; switch (s.curtoken.kind) { case begintoken: st = CompoundStatm.parse(s); break; case iftoken: st = IfStatm.parse(s); break; case nametoken: switch (s.curtoken.kind) { case assigntoken: case leftbrackettoken: st = AssignStatm.parse(s); break; default: st = ProcCallStatm.parse(s); } break; case whiletoken: st = WhileStatm.parse(s); default: st = EmptyStatm.parse(s); } break; break; break; } leaveparser("statement"); return st;

Lag egne testutskrifter Anta at vi oppdager at Assignstatm.parse aldri blir kalt, selv om vi har en tilordningssetning. Mitt råd er å legge inn noe à la while (...) { System.out.println("Statement.parse: " + "curtoken er " + s.curtoken.identify() + " og nexttoken er " + s.nexttoken.identify()); før første switch så vi er sikre på hva de er.

Behold testutskriftene! Råd nr 6: 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 -jar pascal2100.jar -debugs testprog.pas Det fungerer også godt å benytte statusvariable: static boolean debugs = true; : if (debugs) { System.out.println("..."); }

Stol ikke på det du har skrevet! Råd nr 7: 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. Java støtter dette.

Stol ikke på det du har skrevet! assert s.curtoken.kind == whiletoken: "While-setning starter ikke med while!"; NB! Husk å kjøre med java -ea -jar pascal2100.jar... for å slå på mekanismen.

Synkronisér med symbolgeneratoren! Råd nr 8: Sjekk spesielt på Scanner.readNextToken()! Det er lett å kalle readnexttoken() for ofte eller for sjelden. Her er reglene som parse-metodene må følge: 1 Når man kaller parse, skal første symbol være lest inn. 2 Når man returnerer fra en parse, skal første symbol etter konstruksjonen være lest. Vær spesielt oppmerksom der du har forgreninger og løkker i jernbanediagrammet.

Ta sikkerhetskopier! Råd nr 9: 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. En «fattigmannsversjon» er: 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 10: Fordel arbeidet! Dere er to om jobben. Selv om begge må kjenne til hovedstrukturen, kan man fordele programmeringen. Forslag 1 Én tar deklarasjoner og typer. 2 Én tar setninger og uttrykk. 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 11: Bruk hjelpemidlene Spør gruppelærerne! De er tilgjengelige under gruppetimene og svarer på e-post til andre tider. Orakel De siste ukene før oblig-fristene vil gruppelærerne bare jobbe med å svare på spørsmål. Les kompendiet Stoffet er forklart med flere detaljer enn det er mulig på forelesningene.

Start nå! Råd nr 12: Start nå! Det kan ta fra 20 til 100 timer å programmere del 2. Det er vanskelig å anslå dette nøyaktig på forhånd. Påtrengende spørsmål Det er 20 arbeidsdager til 21. oktober. Hvor mange timer per dag blir det?