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



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

Dagens tema: Prosjektet. Hva er en god feilmelding? Melding med mening. Ubrukelig. Hvor på linjen? Noe bedre. Enda bedre

Dagens tema: Kompilatorens struktur. De ulike modulene Prosjektet. Oppbyggingen Pakker i Java Enum-klasser i Java

Dagens tema: Kompilatorens struktur. De ulike modulene Prosjektet. Oppbyggingen Pakker i Java Enum-klasser i Java

Prosjektet. Dagens tema: Moduler i prosjektet error log chargenerator scanner. Enum klasser i Java. Programmeringsverktøy Emacs Eclipse

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

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

Hva skal gjøres? Dagens tema: Hva gjør en kompilator? Forenkling

INF2100. Oppgaver 26. september til 1. oktober 2007

Dagens tema: Hva skal gjøres? Hva gjør en kompilator? Hva gjør en kompilator?

Dagens tema: Kompilatorens struktur. De ulike modulene Prosjektet. Oppbyggingen Pakker i Java Enum-klasser i Java

INF2100. Oppgaver 23. og 24. september 2010

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

INF2100. Oppgaver 9. oktober 2012 C 100 X 10

INF2100. Oppgaver uke 40 og

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

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.

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

Dagens tema: Mer av det dere trenger til del 1

INF1010 våren 2019 Onsdag 30. januar. Mer om unntak i Java (med litt repetisjon av I/O først)

INF1010 våren 2018 tirsdag 23. januar

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

INF1010 våren 2017 Onsdag 25. januar. Litt om unntak i Java

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

Del 3: Evaluere uttrykk

TOD063 Datastrukturer og algoritmer

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

Oversikt Kompilering Syntaksanalyse Java Feilsjekking Oppsummering

Dagens tema: Resten av det dere trenger til del 1

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:

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

INF1010 våren Arv og subklasser - del 2

Jentetreff INF1000 Debugging i Java

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

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

Repetisjon. INF gruppe 13

IN Notat om I/O i Java

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

Dagens tema: Resten av det dere trenger til del 1

INF1000 Metoder. Marit Nybakken 16. februar 2004

Lese fra fil. INF1000 : Forelesning 5. Eksempel. De vanligste lesemetodene. Metoder:

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

Litt om pakker og mest om data inn og ut

Dagens tema: Maskinkode. Litt datamaskinhistorie Hva er maskin- og assemblerkode? x86-prosessoren Programkode og variabler

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

Algoritmer og datastrukturer Kapittel 11 - Delkapittel 11.2

Kapittel 8: Programutvikling

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

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

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

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

Ta inn og ut av 2D-array. Java 6. Liste over ulike verdier i 2D-array. Det ferdige programmet. Vi skal lage et program som illustrerer hvordan man

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

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

Dagens tema: Sjekking

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

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

3 emner i dag! INF1000 Uke 5. Objekter og pekere. null. Litt om objekter, pekere og null Filer og easyio Litt mer om tekster

INF Notat om I/O i Java

INF1000-SIKT - Notat om I/O i Java

Fra Python til Java, del 2

Forelesningsquiz. Forelesning inf Java 5. Sett dere to (eller tre) sammen og besvar de fire spørsmålene på utdelt ark. Tid: 15 min.

OPPGAVE 5b og 8b Java Kode

Oversikt Deklarasjoner Typesjekk Programmering Datamaskinhistorie x86 Kodegenerering

Dagens tema: 12 gode råd for en kompilatorskriver

Programmeringsspråket C

TDT4100 Objektorientert programmering

INF 1000 høsten 2011 Uke september

Leksjon 7. Filer og unntak

HØGSKOLEN I SØR-TRØNDELAG

INF1000 undervisningen INF 1000 høsten 2011 Uke september

Spørsmål fra forrige forelesning. INF1000 Forelesning 7. Oppførselen til inword()/inint()/etc. Operator-presedens i Java

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

I dag. Rep: Oppsummering - variabler. Rep: Datatyper. INF1000 (Uke 3) Mer om uttrykk, terminal I/O, forgreninger

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen

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

Innlesning fra tastatur med easyio. INF1000 høst Vi må først skrive i toppen av programmet: import easyio.*;

INF Seminaroppgaver til uke 3

Oversikt Oversettelse Logging Implementasjon Oppsummering

UNIVERSITETET I OSLO

Generelt om oblig 3. Oppgaveteksten kort sammendrag. Deloppgaver/menyvalg 15/03/2010. INF1000 Forelesning 9

Oversikt. INF1000 Uke 3. Repetisjon Program. Repetisjon Program. Litt repetisjon Program Variabler og Uttrykk Presedens Matematiske funksjoner

INF 1000 (uke 2) Variabler, tilordninger og uttrykk

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Eivind Storm Aarnæs

Løse reelle problemer

I dag skal vi se på. INF 1000 (uke 2) Variabler, tilordninger og uttrykk. Gruppene starter denne uken! Klart for første oblig

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

Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

UNIVERSITETET I OSLO

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen Oppsummering

IN1010 våren januar. Objektorientering i Java

Løsningsforslag ukeoppg. 9: okt (INF Høst 2011)

Forelesning inf Java 5

Videregående programmering 6

Universitetet i Bergen Det matematisk-naturvitenskapelige fakultet Institutt for informatikk

Gjennomgang av eksamen H99

Forelesning inf Java 5

Transkript:

Dagens tema: Kompilatorens struktur Oppbyggingen Pakker i Java Avbrudd («exceptions») Enum-klasser i Java De ulike modulene Prosjektet Hva skal del-0 gjøre? Feilmeldinger Testutskrifter Siste råd og påbud

Oppdeling av programmer Prosjektet Hvordan skriver man et større program som en kompilator? Struktur Det bør deles opp i passe store deler. Hvordan bør et program deles opp? Ofte er det fornuftig å se på hvor data flyter.

Oppdeling av programmer f.cflat cflat f.s types chargenerator scanner syntax code error log f.log

Moduler Noen programmeringsspråk har mekanismer for store moduler men langt fra alle. Java har package. Begrunnelse Anta at vi skal utvikle et CAD-system. Et firma i India har laget en god GUI-modul. Men, begge har en klasse Point. Moduler kan løse dette problemet.

Javas pakker Alle filene som skal inngå i en Java-pakke starter med «package navn». Pakkenavn bør bestå av opphavsstedets internettadresse (baklengs) og et lokalt navn. Vårt kompilatorprosjekt heter no.uio.ifi.cflat

Javas pakker Eksempel package P1; P1/A.java public class A { public static int x = 1; (Under kompileringen må klassen ligge i et fil-tre som tilsvarer leddene i pakkenavnet; våre filer ligger i no/uio/ifi/cflat/scanner/scanner.java og tilsvarende.)

Javas pakker Vi kan hente klasser fra alle pakker så lenge de finnes i CLASSPATH: B.java class B { public static void main (String arg[]) { System.out.println("P1.A.x = " + P1.A.x); package P1; P1/A.java public class A { public static int x = 1; Ifis standard CLASSPATH er: $ printenv CLASSPATH /local/opt/java/classes: /local/opt/java/classes/postgresql-8.3-603.jdbc4.jar: /hom/dag/java/classes:.

Javas pakker Beskyttelse Klasser kan beskyttes: er usynlig utenfor pakken. public kan brukes fra andre pakker. For klasseelementer gjelder: private er bare tilgjengelige i klassen. protected er for klassen og subklasser. er bare for bruk innen pakken. public kan benyttes overalt.

Javas pakker For å unngå å skrive mange lange navn som no.uio.ifi.cflat.cflat.version, kan vi importere klasser fra pakker: import P1.A; B.java class B { public static void main (String arg[]) { System.out.println("P1.A.x = " + A.x); package P1; P1/A.java public class A { public static int x = 1;

Javas pakker Vi kan også importere alle klassene fra en pakke: import P1.*; B.java class B { public static void main (String arg[]) { System.out.println("P1.A.x = " + A.x); package P1; P1/A.java public class A { public static int x = 1;

Javas pakker En siste mulighet er å importere statiske deklarasjoner i en klasse: B.java import static P1.A.*; class B { public static void main (String arg[]) { System.out.println("P1.A.x = " + x); package P1; P1/A.java public class A { public static int x = 1;

Javas pakker Hva kan en pakke inneholde? En Java-pakke kan bare inneholde klasser. Vi trenger også data og metoder og vedtar derfor for prosjektet vårt: I alle pakker finnes en klasse med samme navn som pakken (men stor forbokstav); den inneholder data og metoder vi trenger, og alle er static. Alle disse klassene har disse to metodene: init benyttes til initiering av pakken. finish avslutter pakken.

Våre pakker f.cflat cflat f.s types chargenerator scanner syntax code error log f.log

Modulen «cflat» Hovedprogrammet cflat package no.uio.ifi.cflat.cflat; import java.io.*; import no.uio.ifi.cflat.chargenerator.chargenerator; import no.uio.ifi.cflat.code.code; import no.uio.ifi.cflat.error.error; import no.uio.ifi.cflat.log.log; import no.uio.ifi.cflat.scanner.scanner; import static no.uio.ifi.cflat.scanner.token.*; import no.uio.ifi.cflat.syntax.syntax; import no.uio.ifi.cflat.types.types;

Modulen «cflat» public class Cflat { public static final String version = "2013-08-30"; public static String sourcename = null, sourcebasename = null; public static boolean nolink = false; public static final String myos = System.getProperty("os.name"); // Source file name // Source file name without extension // Should we drop linking? // The current operating system private static boolean testparser = false, testscanner = false;

Modulen «cflat» private static boolean checkparams(string[] args) { for (String opt: args) { if (opt.equals("-c")) { nolink = true; else if (opt.equals("-logb")) { Log.doLogBinding = true; else if (opt.equals("-logp")) { Log.doLogParser = true; else if (opt.equals("-logs")) { Log.doLogScanner = true; else if (opt.equals("-logt")) { Log.doLogTree = true; else if (opt.equals("-testparser")) { testparser = true; Log.doLogParser = Log.doLogTree = true; else if (opt.equals("-testscanner")) { testscanner = true; Log.doLogScanner = true; else if (opt.startswith("-")) { return false; else { if (sourcename!= null) return false; sourcename = sourcebasename = opt; if (opt.length()>3 && opt.endswith(".cb")) sourcebasename = opt.substring(0,opt.length()-3); else if (opt.length()>6 && opt.endswith(".cflat")) sourcebasename = opt.substring(0,opt.length()-6); return true;

Modulen «cflat» public static void main(string[] args) { int exitstatus = 0; if (checkparams(args) && sourcename!=null) { System.out.println("This is the Cb compiler (version " + version + " on " + myos + ")"); try { Error.init(); Log.init(); Code.init(); Types.init(); CharGenerator.init(); Scanner.init(); Syntax.init(); if (testscanner) { System.out.print("Scanning..."); while (Scanner.nextNextToken!= eoftoken) Scanner.readNext(); else { System.out.print("Parsing..."); Syntax.parseProgram(); if (Log.doLogTree) { System.out.print(" printing..."); Syntax.printProgram(); if (! testparser) { System.out.print(" checking..."); Syntax.checkProgram(); System.out.print(" generating code..."); Syntax.genCode(); System.out.println(" OK");

Modulen «cflat» catch (RuntimeException e) { System.out.println(); System.err.println(e.getMessage()); exitstatus = 1; finally { Syntax.finish(); Scanner.finish(); CharGenerator.finish(); Types.finish(); Code.finish(); Log.finish(); Error.finish(); if (exitstatus==0 &&! testscanner &&! testparser) assemblecode(); else { System.err.println("Usage: cflat [-c] [-log{b P S T] " + "[-test{scanner parser] file"); exitstatus = 2; System.exit(exitStatus);

Avbrudd Avbrudd Noen ganger trenger vi å avbryte den normale utførelsen fordi en feil eller noe annet unormalt har skjedd. Hvis dette involverer mange metodekall, er avbrudd («exceptions») nyttig. Sikre avbrudd benyttes der vi vil være sikre på at feilen tas hånd om, f eks FileNotFoundException. Kjøreavbrudd krever ingen slik sikring.

Avbrudd void f(...) { : throw new RuntimeException("Melding"); : void g(...) { try { : f(...) : catch (RuntimeException e) { // Hvis feil: : finally { // Alltid: :

Modulen «scanner» Skanner En kompilator kan lese og tolke en program tegn for tegn, men det er mye lettere om det kan gjøres symbol for symbol. Dette ordner en skanner. chargenerator leser programkoden linje for linje, fjerner #-kommentarlinjer og deler de andre linjene opp i enkelt-tegn. scanner fjerner /*... */-kommentarer og setter tegnene sammen til symboler.

Modulen «scanner» /* Program som leser et tall v og skriver ut v+1. */ # Hovedprogrammet: int main () { int v; /* Les data: */ v = getint() + 1; /* Skriv svaret: */ putint(v); putchar(10); har disse symbolene: int main ( ) { int v ; v = getint ( ) + 1 ; putint ( v ) ; putchar ( 10 ) ;

Enum-klasser Enum-klasser Noen ganger har man diskrete data som kun kan ha et begrenset antall fast definerte verdier: Kortfarge Kløver, ruter, hjerter, spar Tippetegn Hjemmeseier, uavgjort, borteseier Ukedag Mandag, tirsdag, onsdag, torsdag, fredag, lørdag, søndag Å representere disse med heltall er en halvgod løsning.

Et eksempel Java tilbyr enum-klasser: Tippetegn.java enum Tippetegn { Hjemmeseier, Uavgjort, Borteseier; Dette er syntaktisk sukker for noe à la Tippetegn.java class Tippetegn extends java.lang.enum { public static final Tippetegn Hjemmeseier = new Tippetegn(), Uavgjort = new Tippetegn(), Borteseier = new Tippetegn();

Bruk av enum-klasser Slik brukes denne klassen: Tipping.java class Tipping { public static void main (String arg[]) { Tippetegn rekke[] = new Tippetegn[12+1]; rekke[1] = Tippetegn.Hjemmeseier; rekke[2] = Tippetegn.Borteseier; rekke[3] = Tippetegn.Borteseier; for (int i = 1; i <= 3; ++i) System.out.print(rekke[i]+" "); System.out.println(); > java Tipping Hjemmeseier Borteseier Borteseier

Bruk av enum-klasser Hva kan vi gjøre med enum-klasser? Tilordne verdier («rekke[i] = Tippetegn.Uavgjort») Sjekke på likhet og ulikhet («rekke[1] == Tippetegn.Borteseier») Skrive ut objektet («System.out.println(rekke[1])» som er det samme som «System.out.println(rekke[1].toString())»)

Prosjektet I vår skanner Vår skanner kan levere følgende token: package no.uio.ifi.cflat.scanner; public enum Token { addtoken, assigntoken, commatoken, dividetoken, doubletoken, elsetoken, eoftoken, equaltoken, fortoken, greaterequaltoken, greatertoken, iftoken, inttoken, leftbrackettoken, leftcurltoken, leftpartoken, lessequaltoken, lesstoken, multiplytoken, nametoken, notequaltoken, numbertoken, rightbrackettoken, rightcurltoken, rightpartoken, returntoken, semicolontoken, subtracttoken, whiletoken;

Modulen «chargenerator» Modulen chargenerator package no.uio.ifi.cflat.chargenerator; import java.io.*; import no.uio.ifi.cflat.cflat.cflat; import no.uio.ifi.cflat.error.error; import no.uio.ifi.cflat.log.log; public class CharGenerator { public static char curc, nextc; private static LineNumberReader sourcefile = null; private static String sourceline; private static int sourcepos;

Modulen «chargenerator» public static void init() { try { sourcefile = new LineNumberReader(new FileReader(Cflat.sourceName)); catch (FileNotFoundException e) { Error.error("Cannot read " + Cflat.sourceName + "!"); sourceline = ""; sourcepos = 0; curc = nextc = ; readnext(); readnext(); public static void finish() { if (sourcefile!= null) { try { sourcefile.close(); catch (IOException e) {

Modulen «chargenerator» Metoden readnext leser neste tegn; det blir lagt i curc og neste tegn i nextc. public static void readnext() { curc = nextc; if (! ismoretoread()) return; //-- Must be changed in part 0: To nyttige metoder: public static boolean ismoretoread() { //-- Must be changed in part 0: return false; public static int curlinenum() { return (sourcefile == null? 0 : sourcefile.getlinenumber());

Modulen «chargenerator» Modulen scanner Symbolene leses inn i curtoken, nexttoken og nextnexttoken (samt i curname, curnumber, nextname, nextnumber, nextnextname og nextnextnumber). package no.uio.ifi.cflat.scanner; import no.uio.ifi.cflat.chargenerator.chargenerator; import no.uio.ifi.cflat.error.error; import no.uio.ifi.cflat.log.log; import static no.uio.ifi.cflat.scanner.token.*; public class Scanner { public static Token curtoken, nexttoken, nextnexttoken; public static String curname, nextname, nextnextname; public static int curnum, nextnum, nextnextnum; public static int curline, nextline, nextnextline; public static void init() { //-- Must be changed in part 0: public static void finish() { //-- Must be changed in part 0:

Modulen «chargenerator» Lesingen skjer med readnext-metoden: public static void readnext() { curtoken = nexttoken; nexttoken = nextnexttoken; curname = nextname; nextname = nextnextname; curnum = nextnum; nextnum = nextnextnum; curline = nextline; nextline = nextnextline; nextnexttoken = null; while (nextnexttoken == null) { nextnextline = CharGenerator.curLineNum(); if (! CharGenerator.isMoreToRead()) { nextnexttoken = eoftoken; else //-- Must be changed in part 0: { Error.error(nextNextLine, "Illegal symbol: " + CharGenerator.curC + "!"); Log.noteToken();

Modulen «error» Hva er en god feilmelding? Ubrukelig ERROR: Syntax error detected! Noe bedre ERROR: Syntax error found in line 217. Enda litt bedre ERROR: Syntax error found in line 217: x = x+1 ;

Modulen «error» Melding med mening Meldingen bør fortelle hva som er galt: ERROR in line 217: Semicolon expected. x = x+1 ; Den beste meldingen Meldingen bør angi hvorledes kompilatoren «tenker»: ERROR in line 217: Expected ; at end of sentence but found. x = x+1 ;

Modulen «error» Feil Hva gjør man med feil? Før prøvde man å finne så mange feil som mulig. Vi skal stoppe med melding ved første feil.

Modulen «error» Modulen error package no.uio.ifi.cflat.error; import no.uio.ifi.cflat.log.log; import no.uio.ifi.cflat.scanner.scanner; public class Error { public static void error(string where, String message) { String emess = "Cb error" + (where.length()>0? " "+where : "") + ": " + message; Log.noteError(eMess); throw new RuntimeException(eMess); public static void error(string message) { error("", message); public static void error(int linenum, String message) { error((linenum>0? "in line "+linenum : ""), message);

Modulen «error» Noen ganger tabber vi oss ut! public static void panic(string where) { error("in method "+where, "PANIC! PROGRAMMING ERROR!"); En nyttig rutine public static void expected(string exp) { error(scanner.curline, exp + " expected, but found a " + Scanner.curToken + "!");

Modulen «error» Siden de fleste feilene er relatert til lesingen av C -koden, er det nyttig med en egen metode i scanner-modulen: public static void check(token t) { if (curtoken!= t) Error.expected("A " + t); public static void check(token t1, Token t2) { if (curtoken!= t1 && curtoken!= t2) Error.expected("A " + t1 + " or a " + t2); public static void skip(token t) { check(t); readnext(); public static void skip(token t1, Token t2) { check(t1,t2); readnext();

Modulen «log» Modulen log Brukeren kan slå av og på logging (med opsjoner som håndteres av cflat-modulen). package no.uio.ifi.cflat.log; import java.io.*; import no.uio.ifi.cflat.cflat.cflat; import no.uio.ifi.cflat.error.error; import no.uio.ifi.cflat.scanner.scanner; import static no.uio.ifi.cflat.scanner.token.*; public class Log { public static boolean dologbinding = false, dologparser = false, dologscanner = false, dologtree = false; private static String logname, curtreeline = ""; private static int nloglines = 0, parselevel = 0, treelevel = 0; public static void init() { logname = Cflat.sourceBaseName + ".log"; public static void finish() { //-- Must be changed in part 0:

Modulen «log» Testutskrifter Alle vil gjøre feil under arbeidet med kompilatoren. For enklere å oppdage feilene når de skjer, skal vi bygge inn ulike testutskrifter som brukeren enkelt kan slå på: Opsjon Hva dumpes? Del logb Navnebindingen 2 logp Parseringen 1 logs Skanneren 0 logt Lagret parseringstre 1

Modulen «log» $ cflat -logs mini.cflat $ more mini.log 1: # Program mini 2: # -------------- 3: # A minimal Cb program! 4: 5: int main () Scanner: inttoken Scanner: nametoken main Scanner: leftpartoken Scanner: rightpartoken 6: { Scanner: leftcurltoken 7: putchar( x ); Scanner: nametoken putchar Scanner: leftpartoken Scanner: numbertoken 120 Scanner: rightpartoken Scanner: semicolontoken 8: Scanner: rightcurltoken Scanner: eoftoken

Modulen «log» NB! Siden utskriften på forrige side kommer fra to kilder, vil flettingen av den kunne variere. Variasjoner i fletting er helt normalt og må forventes. Når hele programmet er lest, vil skanneren bare returnere eoftoken.

Modulen «log» For å sikre loggfilen, må den lukkes etter hver utskrift. private static void writelogline(string data) { try { PrintWriter log = (nloglines==0? new PrintWriter(logName) : new PrintWriter(new FileOutputStream(logName,true))); log.println(data); ++nloglines; log.close(); catch (FileNotFoundException e) { Error.error("Cannot open log file " + logname + "!");

Modulen «log» I del 0 skal vi sjekke chargenerator og scanner: public static void notesourceline(int linenum, String line) { if (! dologparser &&! dologscanner) return; //-- Must be changed in part 0: public static void notetoken() { if (! dologscanner) return; //-- Must be changed in part 0: Feilmeldinger må med i loggen (om det er noen logg): public static void noteerror(string message) { if (nloglines > 0) writelogline(message);

Del-0 Del 0 Del 1 Del 2 f.cflat cflat f.s types chargenerator scanner syntax code error log f.log

Siste råd? Siste innspill Del-0 skal fungere med opsjonen testscanner. Les kompendiet! Les Java-koden! (Den største arbeidsinnsatsen ligger i å forstå denne koden.) Det er ikke lov å fjerne noe i basiskoden (men det er lov å legge til). Alt skal programmeres fra bunnen av. Det er altså ikke lov å bruke annet fra Java-biblioteket enn java.io (og *Tokenizer er heller ikke lov). Gruppelærerne er der for å hjelpe dere. Begynn i tide!