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

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

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

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.

Dagens tema: Mer av det dere trenger til del 1

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

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

Oversikt Kompilering Syntaksanalyse Java Feilsjekking Oppsummering

Del 3: Evaluere uttrykk

Dagens tema: Resten av det dere trenger til del 1

TOD063 Datastrukturer og algoritmer

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:

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

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

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

Jentetreff INF1000 Debugging i Java

Dagens tema: Sjekking

Dagens tema: Resten av det dere trenger til del 1

INF1010 våren Arv og subklasser - del 2

Litt om pakker og mest om data inn og ut

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?

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

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

Repetisjon. INF gruppe 13

IN Notat om I/O i Java

Algoritmer og datastrukturer Kapittel 11 - Delkapittel 11.2

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

INF1000 Metoder. Marit Nybakken 16. februar 2004

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

Kapittel 8: Programutvikling

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

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

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

Oversikt Deklarasjoner Typesjekk Programmering Datamaskinhistorie x86 Kodegenerering

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

Forelesning inf Java 4

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

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

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

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

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

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

Dagens tema: 12 gode råd for en kompilatorskriver

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

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

Programmeringsspråket C

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

INF1000-SIKT - Notat om I/O i Java

INF Seminaroppgaver til uke 3

TDT4100 Objektorientert programmering

Fra Python til Java, del 2

Leksjon 7. Filer og unntak

Oversikt Oversettelse Logging Implementasjon Oppsummering

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

INF 1000 (uke 2) Variabler, tilordninger og uttrykk

UNIVERSITETET I OSLO

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

Socket og ServerSocket

INF 1000 høsten 2011 Uke september

INF1000 undervisningen INF 1000 høsten 2011 Uke september

HØGSKOLEN I SØR-TRØNDELAG

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen

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

Programmeringsspråk for nybegynnere. Krav til språket. Krav til språket. Krav til språket

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) og i emnet INF100-F Objektorientert programmering i Java I Løsningsforslag

Løse reelle problemer

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

UNIVERSITETET I OSLO

IN1010 våren januar. Objektorientering i Java

UNIVERSITETET I OSLO

Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

Universitetet i Bergen Det matematisk-naturvitenskapelige fakultet Institutt for informatikk

Videregående programmering 6

Løsningsforslag Test 2

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) Løsningsforslag

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

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/alboc/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 /usr/share/java:/usr/share/java/postgresql-jdbc.jar:.

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.alboc.alboc.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.alboc alboc f.s types chargenerator scanner syntax code error log f.log

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

Modulen «alboc» public class AlboC { public static final String version = "2014-08-12"; 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

Modulen «alboc» 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("-logi")) { Log.doLogTree = true; else if (opt.equals("-logp")) { Log.doLogParser = true; else if (opt.equals("-logs")) { Log.doLogScanner = true; else if (opt.equals("-logt")) { Log.doLogTypeCheck = 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()>6 && opt.endswith(".alboc")) sourcebasename = opt.substring(0,opt.length()-6); return true;

Modulen «alboc» public static void main(string[] args) { int exitstatus = 0; if (checkparams(args) && sourcename!=null) { System.out.println("This is the AlboC 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.nextToken!= eoftoken) Scanner.readNext(); else { System.out.print("Parsing..."); Syntax.parseProgram(); if (Log.doLogTree) { System.out.print(" printing..."); Syntax.printProgram();

Modulen «alboc» if (! testparser) { System.out.print(" checking..."); Syntax.checkProgram(); System.out.print(" generating code..."); Syntax.genCode(); System.out.println(" OK"); catch (AlboCError 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: alboc [-c] [-log{b I 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 den doble verdien. */ # Hovedprogrammet: int main () { int v; /* Les data: */ v = getint() * 2; /* Skriv svaret: */ putint(v); putchar(10); har disse symbolene: int main ( ) { int v ; v = getint ( ) * 2 ; 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.alboc.scanner; public enum Token { addtoken, amptoken, assigntoken, commatoken, dividetoken, elsetoken, eoftoken, equaltoken, fortoken, greaterequaltoken, greatertoken, iftoken, inttoken, leftbrackettoken, leftcurltoken, leftpartoken, lessequaltoken, lesstoken, nametoken, notequaltoken, numbertoken, returntoken, rightbrackettoken, rightcurltoken, rightpartoken, semicolontoken, startoken, subtracttoken, whiletoken;

Modulen «chargenerator» Modulen chargenerator package no.uio.ifi.alboc.chargenerator; import java.io.*; import no.uio.ifi.alboc.alboc.alboc; import no.uio.ifi.alboc.error.error; import no.uio.ifi.alboc.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(AlboC.sourceName)); catch (FileNotFoundException e) { Error.error("Cannot read " + AlboC.sourceName + "!"); sourceline = ""; sourcepos = 0; curc = nextc = ; readnext(); readnext(); public static void finish() { if (sourcefile!= null) { try { sourcefile.close(); catch (IOException e) { Error.error("Could not close source file!");

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 og nexttoken (samt i curname, curnumber, nextname og nextnumber). package no.uio.ifi.alboc.scanner; import no.uio.ifi.alboc.chargenerator.chargenerator; import no.uio.ifi.alboc.error.error; import no.uio.ifi.alboc.log.log; import static no.uio.ifi.alboc.scanner.token.*; public class Scanner { public static Token curtoken, nexttoken; public static String curname, nextname; public static int curnum, nextnum; public static int curline, nextline; 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; curname = nextname; curnum = nextnum; curline = nextline; nexttoken = null; while (nexttoken == null) { nextline = CharGenerator.curLineNum(); if (! CharGenerator.isMoreToRead()) { nexttoken = eoftoken; else //-- Must be changed in part 0: { Error.error(nextLine, "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.alboc.error; import no.uio.ifi.alboc.log.log; import no.uio.ifi.alboc.scanner.scanner; public class Error { public static void error(string where, String message) { String emess = "AlboC error" + (where.length()>0? " "+where : "") + ": " + message; Log.noteError(eMess); throw new AlboCError(eMess); public static void error(string message) { error("", message); public static void error(int linenum, String message) { if (linenum > 0) error("in line "+linenum, message); else error(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 AlboC-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 alboc-modulen). package no.uio.ifi.alboc.log; import java.io.*; import no.uio.ifi.alboc.alboc.alboc; import no.uio.ifi.alboc.error.error; import no.uio.ifi.alboc.scanner.scanner; import static no.uio.ifi.alboc.scanner.token.*; import no.uio.ifi.alboc.types.*; public class Log { public static boolean dologbinding = false, dologtypecheck = 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 = AlboC.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 logi Internt parseringstre 1 logp Parseringen 1 logs Skanneren 0 logt Typesjekkingen 2

Modulen «log» $ ~inf2100/alboc -logs mini.alboc $ more mini.log 1: # Program mini 2: # -------------- 3: # A minimal AlboC program! 4: 5: int main () Scanner: inttoken Scanner: nametoken main Scanner: leftpartoken Scanner: rightpartoken 6: { Scanner: leftcurltoken 7: return 0; Scanner: returntoken Scanner: numbertoken 0 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) { nloglines = 0; // To avoid infinite recursion // Error.error -> Log.noteError -> Log.writeLogLine ->... Error.error("Cannot open log file " + logname + "!");

Modulen «log» I del 0 skal vi sjekke chargenerator og scanner: /** * Make a note in the log file that another source line has been read. * This note is only made if the user has requested it. * * @param linenum The line number * @param line The actual line */ public static void notesourceline(int linenum, String line) { if (! dologparser &&! dologscanner) return; //-- Must be changed in part 0: /** * Make a note in the log file that another token has been read * by the Scanner module into Scanner.nextToken. * This note will only be made if the user has requested it. */ public static void notetoken() { if (! dologscanner) return; //-- Must be changed in part 0:

Modulen «log» 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.alboc alboc 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.lang og java.io (og *Tokenizer er heller ikke lov). Gruppelærerne er der for å hjelpe dere. Begynn i tide!