Dagens tema: Resten av det dere trenger til del 1

Like dokumenter
Dagens tema: Resten 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: 12 gode råd for en kompilatorskriver

Dagens tema: Mer av det dere trenger til del 1

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:

Oversikt Kompilering Syntaksanalyse Java Feilsjekking Oppsummering

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

Dagens tema: Resten av det dere trenger til del 1

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

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

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

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

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

Dagens tema: Resten av det dere trenger til del 1

Dagens tema: Resten av det dere trenger til del 1

Dagens tema: Sjekking

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen Oppsummering

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen

INF2100. Oppgaver 23. og 24. september 2010

INF2100. Oppgaver uke 40 og

Dagens tema: Mer av det dere trenger til del 1

INF2100. Oppgaver 9. oktober 2012 C 100 X 10

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

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

Oversikt Kodegenerering Variabler Setninger Uttrykk While-setningen

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

Dagens tema: Semantisk sjekking. Maskinkode. Hvordan finne deklarasjoner? Hvordan programmere sjekking av riktig navnebruk?

UNIVERSITETET I OSLO

Oversikt Oversettelse Logging Implementasjon Oppsummering

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

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen

INF2100. Oppgaver 26. september til 1. oktober 2007

Oversikt Deklarasjoner Typesjekk Programmering Datamaskinhistorie x86 Kodegenerering

2 Om statiske variable/konstanter og statiske metoder.

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

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

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

Del 3: Evaluere uttrykk

UNIVERSITETET I OSLO

Velkommen til INF2100

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

Velkommen til INF2100

Dagens tema: Mer av det dere trenger til del 2

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

Dagens tema: Formålet. Kodegenerering NB! Introduksjon Modulen Code. Enkle variable Noen enkle setninger Uttrykk

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.

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen

Velkommen til INF2100

Dagens tema: Formålet. Kodegenerering NB! Introduksjon Modulen Code. Enkle variable Noen enkle setninger Uttrykk

Oversikt Deklarasjoner Typesjekk Datamaskinhistorie x86 Kodegenerering

Jentetreff INF1000 Debugging i Java

Dagens tema: Sjekking (obligatorisk oppgave 3)

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

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

IN1010 våren januar. Objektorientering i Java

Velkommen til INF2100

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

2 Om statiske variable/konstanter og statiske metoder.

UNIVERSITETET I OSLO

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

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

Forelesning inf Java 4

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

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

Programmeringsspråket C

INF1000 : Forelesning 4

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

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

INF 1000 høsten 2011 Uke september

Praktisk informasjon. Repetisjon: While-løkker. I dag. INF1000 (Uke 5) Mer om løkker, arrayer og metoder. Oblig 2 er lagt ut

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

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

Programmering Høst 2017

INF1000 undervisningen INF 1000 høsten 2011 Uke september

GJØVIK INGENIØRHØGSKOLE

Praktisk informasjon. I dag. Repetisjon: While-løkker. INF1000 (Uke 5) Mer om løkker, arrayer og metoder

Velkommen til INF2100

UNIVERSITETET I OSLO

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

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

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

INF1010 våren januar. Objektorientering i Java

Fra Python til Java, del 2

INF1000 : Forelesning 3

Hvis en person har inntekt < , så betaler han 10% skatt på alt, og ellers betaler han 10% skatt på de første og 30% på resten.

Hvis en person har inntekt < , så betaler han 10% skatt på alt, og ellers betaler han 10% skatt på de første og 30% på resten.

Blokker og metoder INF1000 (Uke 6) Metoder

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

Body Mass Index (BMI) INF1000 : Forelesning 3. Ferdig program (forts.) Ferdig program

Fra problem til program

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

Semantisk Analyse del I

Dagens tema: Resten av det dere trenger til del 2

Kapittel 5: Objektkommunikasjon

Litt mer om uttrykk: ++ og -- INF1000 : Forelesning 4. Oppgave. Blokker. 0 udefinert udefinert. Alternativ 2 Postfiks-operator

UNIVERSITETET I OSLO

Transkript:

Dagens tema Dagens tema: Resten av det dere trenger til del 1 Hvordan sjekke navn? Testutskrifter Programmeringsstil 12 gode råd

Dagens tema Prosjektet Utifra dette RusC-programmet: int pot2 (int x) { int p2; p2 = 1; while (2*p2 <= x) { p2 = 2*p2; return p2; int x; int main () { int v; v = getint(); x = pot2(v); putint(x); putchar(10);

Dagens tema... skal vi bygge opp dette treet (som her er klippet): Program DeclList FuncDecl VarDecl FuncDecl DeclList FuncBody DeclList FuncBody VarDecl DeclList StatmList DeclList StatmList VarDecl VarDecl

Dagens tema Koblingen mellom grammatikken og klasser Normalt skal det være én klasse for hvert metasymbol i grammatikken, men det er lov å avvike fra dette. Nye klasser declaration og decl list er nyttig. Vi kan slå sammen func decl og func body til én klasse om vi ønsker det.

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

Lagring av navn Lagring av navn Enkeltnavnene bør lagres i deklarasjonsobjektet: abstract class Declaration extends SyntaxUnit { protected String name = null; protected Declaration nextdecl = null; public abstract void checkwhetherarray(); public abstract void checkwhetherfunction(int nparamsused); public abstract void checkwhethersimplevar(); class FuncDecl extends Declaration {... public static FuncDecl parse(...) {... public void checkwhetherarray() {... public void checkwhetherfunction(int nparamsused) {... public void checkwhethersimplevar() { Scanner.illegal(name+" is a function and no variable!");

Lagring av navn For å sjekke at et navn er riktig brukt, kalles en CheckWhether... -metode. Eksempel Vi har funnet setningen f() som er et function call. Navnet f må da være deklarert som en funksjon med 0 parametre. Vi sjekker dette slik: 1. Finn Declaration fdecl;... fdecl =... ; 2. Kall fdecl.checkwhetherfunction(0); Om f er galt deklarert, skrives det ut en feilmelding og kompileringen stopper.

Lagring av navn Det er nyttig med en egen klasse for en deklarasjonsliste: class DeclList extends SyntaxUnit { Declaration firstdecl; DeclList outerscope; DeclList (DeclList outer) {... void adddecl(declaration d) {... Declaration finddecl(string n) {...

Hvordan finne navn? Hvordan finne et navn? I RusC-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: int f () { int c; c = getchar() + 32; putchar(c); La parse få med en parameter som peker til den lokale deklarasjonslisten: public static WhileStatm parse(decllist decls) {.

Hvordan finne navn? Globale navn Navn kan imidlertid være deklarert «lenger ute». I Rusc kan vi ha opptil fire nivåer: int a; int f (int b) { int c;... c... b... a... getint()... Hvordan finner globale navn? Det enkleste er å la hvert DeclList-objekt ha en peker til sin nærmeste omliggende deklarasjonsliste.

Hvordan finne navn? DeclList exit getchar getint putchar putint Program DeclList FuncDecl DeclList FuncBody VarDecl DeclList StatmList VarDecl

Hvordan finne navn? Skjuling av navn Som i de fleste språk vil en indre deklarasjon skjule en ytre. int a; int f (int a) { int a;... a... Dette håndteres automatisk av vårt opplegg.

Hvordan finne navn? Deklarasjonsrekkefølgen Husk at navn i RusC først er kjent etter at de er deklarert. int f1 () { outint(v); int v; :... så dette programmet skal gi feilmelding.

Hvordan finne navn? Noen ganger er dette ganske viktig: int f1 (int a) { putint(a); int putint (int a) { putchar(a); int f2 (int a) { putint(a); Dette håndteres også automatisk når vi gjør det samtidig med parseringen.

Hvordan finne navn? DeclList exit getchar getint putchar putint Program DeclList FuncDecl VarDecl FuncDecl DeclList FuncBody FuncBody VarDecl DeclList StatmList DeclList StatmList VarDecl VarDecl

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. logt sjekker om analysetreet ble riktig ved å skrive det ut etterpå.

logp Vårt testprogram int pot2 (int x) { int p2; p2 = 1; while (2*p2 <= x) { p2 = 2*p2; return p2; int x; int main () { int v; v = getint(); x = pot2(v); putint(x); putchar(10);

logp 1: int pot2 (int x) <program> <func decl> <param decl> 2: { 3: int p2; p2 = 1; </param decl> <func body> <var decl> </var decl> <statm list> <statement> <assign-statm> <assignment> <variable> </variable> 4: while (2*p2 <= x) { p2 = 2*p2; <expression> <number> </number> </expression> </assignment> </assign statm> </statement> <statement> <while-statm> <expression> <number> </number> <operator> </operator> <variable> </variable> <operator> </operator> <variable> </variable> </expression> <statm list> <statement> <assign-statm> <assignment> <variable> </variable> <expression> <number> </number> <operator> </operator> <variable>

logp Implementasjon Alle parse-metoder må kalle Log.enterParser("<while-statm>"); (eller tilsvarende) ved oppstart og Log.leaveParser("</while-statm>"); ved avslutning. Innrykk må håndteres automatisk.

logt Korrekt parsering av treet sjekkes enkelt ved å regenerere det (såkalt «pretty-printing»): Tree: int pot2 (int x) Tree: { Tree: int p2; Tree: Tree: p2 = 1; Tree: while (2 * p2 <= x) { Tree: p2 = 2 * p2; Tree: Tree: return p2; Tree: Tree: Tree: int x; Tree: Tree: int main () Tree: { Tree: int v; Tree: Tree: v = getint(); Tree: x = pot2(v); Tree: putint(x); Tree: putchar(10); Tree:

logt Et eksempel class WhileStatm extends Statement { Expression test; StatmList body; public static WhileStatm parse(decllist decls) { Log.enterParser("<while-statm>"); WhileStatm w = new WhileStatm(); Scanner.readNext(); Scanner.skip(Token.leftParToken); w.test = Expression.parse(decls); Scanner.skip(Token.rightParToken); Scanner.skip(Token.leftCurlToken); w.body = StatmList.parse(decls); Scanner.skip(Token.rightCurlToken); Log.leaveParser("</while-statm>"); return w;

logt public void printtree() { Log.wTree("while ("); test.printtree(); Log.wTreeLn(") {"); Log.indentTree(); body.printtree(); Log.outdentTree(); Log.wTreeLn("");

logt I Log-modulen finnes noen nyttige metoder: public static void wtree(string s) { if (curtreeline.length() == 0) { for (int i = 1; i <= treelevel; ++i) curtreeline += " "; curtreeline += s; public static void wtreeln() { writelogline("tree: " + curtreeline); curtreeline = ""; public static void wtreeln(string s) { wtree(s); wtreeln(); public static void indenttree() { //-- Must be changed in part 1: public static void outdenttree() { //-- Must be changed in part 1:

Suns forslag Programmeringsstil Alle har sin programmeringsstil, men noen ganger kan det være lurt å følge en standard: Ved samarbeide Når man produserer kommersiell kode. Sun har definert et forslag til standard: http://java.sun.com/docs/codeconv/codeconventions.pdf.

Suns forslag Klasser Hver klasse bør ligge i sin egen kildefil. Klasse-filer bør inneholde følgende (i denne rekkefølgen): 1. De aller viktigste opplysningene om filen: /* * Klassens navn * * Versjonsinformasjon * * Copyrightangivelse */ 2. Alle import-spesifikasjonene. 3. JavaDoc-kommentar for klassen. 4. Selve klassen.

Suns forslag Variable Variable bør deklareres én og én på hver linje: (Uenig!) int level; int size; De bør komme først i {-blokken (dvs ikke etter noen setninger). (Uenig!) Lokale for-indekser er helt OK: for (int i = 1; i <= 10; ++i) {... Om man kan initialisere variablene samtidig med deklarasjonen, er det er fordel.

Suns forslag Setninger Enkle setninger bør stå én og én på hver linje: (Uenig!) i = 1; j = 2; Sammensatte setninger: do { setninger; while (uttrykk); if (uttrykk) { setninger; if (uttykk) { setninger; else if (uttrykk) { setninger; else if (uttrykk) { setninger;

Suns forslag for (init; betingelse; oppdatering) { setninger; return uttrykk; while (uttrykk) { setninger; try { setninger; catch (ExceptionClass e) { setninger;

Suns forslag switch (uttrykk) { case xxx: setninger; break; case xxx: setninger; break; default: setninger; break; Sammensatte setninger skal alltid har { rundt innmaten. Innmaten skal indenteres 4 posisjoner. (Uenig!)

Suns forslag Navn Navn bør velges slik: Type navn Kapitalisering Hva slags ord Eksempel Klasser XxxxXxxx Substantiv som beskriver objektene Metoder xxxxxxxx Verb som angir hva metoden gjør Variable xxxxxxxx Korte substantiver; «bruk-og-kastvariable» kan være på én bokstav IfStatement readtoken curtoken i Konstanter XXXX_XX Substantiv MAX_MEMORY

Suns forslag Utseende Linjer maks 80 tegn. For lange linjer bør deles etter et komma eller før en operator (som + eller &&). Blanke linjer Sett inn doble blanke linjer mellom klasser. Sett inn enkle blanke linjer mellom metoder, mellom variabeldeklarasjonene og første setning i metoder eller mellom ulike deler av en metode.

Start nå! Råd nr 1: Start nå! Det tar typisk 20 100 timer å programmere Del-1 om man ikke har gjort slikt før. Påtrengende spørsmål Det er 30 arbeidsdager til 27. oktober. 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. Skriv noen korte kodesnutter i RusC. 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 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 var decl var decl int name ; 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 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! P-utskriftene forteller hvilke parse-metoder som kalles. Anta at vi har programmet int pot2 (int x) { int p2; p2 = 1;. Programmet gir en feilmelding i linje 1: Expected a leftcurltoken but found a leftpartoken! Hva er galt?

Husk testutskriftene! Svaret kan vi finne i P-utskriften: 1: int pot2 (int x) <program> <func decl> 2: { 3: int p2; p2 = 1; <func body> Utskriften skulle ha startet 1: int pot2 (int x) <program> <func decl> <func params> 2: { 3: int p2; p2 = 1; </func params> <func body>

Husk testutskriftene! T-utskriften viser en utskrift av det genererte treet. Anta at vi har det samme testprogrammet int pot2 (int x) { int p2; p2 = 1;. Hvis T-utskriften er int pot2 (int x) { p2 = 1;. så vet vi at lokale deklarasjoner i funksjoner ikke settes opp riktig (eller at det er feil i T-utskriften ).

Lag egne testutskrifter Råd nr 6: Lag egne testutskrifter Her er litt (muligens feilaktig) kode fra StatmList.parse: class StatmList extends SyntaxUnit { Statement firststatement = null; public static StatmList parse(decllist decls) { Log.enterParser("<statm list>"); StatmList sl = new StatmList(); Statement laststatement = null; Scanner.skip(Token.leftCurlToken); while (Scanner.curToken!= Token.rightCurlToken) { Statement sx = Statement.parse(decls); if (laststatement!= null) sl.firststatement = sx; else laststatement.nextstatement = sx; laststatement = sx; Scanner.readNext(); Log.leaveParser("</statm list>"); return sl;

Lag egne testutskrifter Anta at vi får melding om null-peker i linjen med laststatement.nextstatement = sx;. Slikt skal ikke skje. Mitt råd er å legge inn noe à la while (...) { System.out.println("StatmList.parse: " + "laststatement er " + (laststatement==null? "null" : "ikke null"));

Lag egne testutskrifter Slik skal koden være: class StatmList extends SyntaxUnit { Statement firststatement = null; public static StatmList parse(decllist decls) { Log.enterParser("<statm list>"); StatmList sl = new StatmList(); Statement laststatement = null; while (Scanner.curToken!= Token.rightCurlToken) { Statement sx = Statement.parse(decls); if (laststatement == null) sl.firststatement = sx; else laststatement.nextstatement = sx; laststatement = sx; Log.leaveParser("</statm list>"); return sl;

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 Rusc -debugss.a testprog.rusc Det fungerer også godt å benytte statusvariable: static boolean debugss_a = true;. if (debugss_a) { System.out.println("...");

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.

Stol ikke på det du har skrevet! class WhileStatm extends Statement { Expression test; StatmList body; public static WhileStatm parse(decllist decls) { Log.enterParser("<while-statm>"); WhileStatm w = new WhileStatm(); assert Scanner.curToken==Token.whileToken: "While-setning starter ikke med while!"; Scanner.readNext(); Scanner.skip(Token.leftParToken); w.test = Expression.parse(decls); Scanner.skip(Token.rightParToken); Scanner.skip(Token.leftCurlToken); w.body = StatmList.parse(decls,true); Scanner.skip(Token.rightCurlToken); Log.leaveParser("</while-statm>"); return w;

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

Synkronisér med symbolgeneratoren! Råd nr 9: Sjekk spesielt på Scanner.readNext! Det er lett å kalle readnext 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 på if-tester og løkker.

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

Vi har snakket om Navn lagres i deklarasjonsobjektet. parse får med peker til lokale deklarasjonsliste. Hver deklarasjonsliste peker på listen utenfor. Testutskriftene er svært nyttige. God programmeringsstil er også en hjelp. 12 gode råd.