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

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

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

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 Avbrudd («exceptions») Enum-klasser i Java

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

INF2100. Oppgaver 23. og 24. september 2010

INF2100. Oppgaver 26. september til 1. oktober 2007

INF2100. Oppgaver uke 40 og

INF2100. Oppgaver 9. oktober 2012 C 100 X 10

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.

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

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

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

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

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

Oversikt Oversettelse Logging Implementasjon Oppsummering

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

INF1010 våren 2018 tirsdag 23. januar

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

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

Del 3: Evaluere uttrykk

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

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

Repetisjon. INF gruppe 13

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

TOD063 Datastrukturer og algoritmer

Jentetreff INF1000 Debugging i Java

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

HØGSKOLEN I SØR-TRØNDELAG

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

IN Notat om I/O i Java

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

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

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

Dagens tema: Mer av det dere trenger til del 1

Fra Python til Java, del 2

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

Litt om pakker og mest om data inn og ut

Dagens tema: Resten av det dere trenger til del 1

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

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

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

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

Løsningsforslag Test 2

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

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

Algoritmer og datastrukturer Kapittel 11 - Delkapittel 11.2

INF Notat om I/O i Java

Dagens forelesning. Java 13. Rollefordeling (variant 1) Rollefordeling (variant 2) Design av større programmer : fordeling av roller.

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

import java.io.*; import java.util.*; import javagently.text;

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

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

Hittil har programmene kommunisert med omverden via tastatur og skjerm Ønskelig at data kan leve fra en kjøring til neste

INF1010 våren januar. Objektorientering i Java

Leksjon 7. Filer og unntak

INF 1000 (uke 2) Variabler, tilordninger og uttrykk

Forelesning inf Java 4

Leksjon 7. Filer og unntak

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

Oversikt. INF1000 Uke 1 time 2. Repetisjon - Introduksjon. Repetisjon - Program

Kapittel 8: Programutvikling

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

INF1000-SIKT - Notat om I/O i Java

OPPGAVE 5b og 8b Java Kode

Kort om meg. INF1000 Uke 2. Oversikt. Repetisjon - Introduksjon

TDT4100 Objektorientert programmering

Løsningsforslag ukeoppg. 2: 31. aug - 6. sep (INF Høst 2011)

Videregående programmering 6

Programmeringsspråket C

Dagens tema: Resten av det dere trenger til del 1

INF 1000 høsten 2011 Uke september

Mer objektorientert programmering

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

INF1000 undervisningen INF 1000 høsten 2011 Uke september

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

Enkel lesing og skriving i Java

Dagens tema: 12 gode råd for en kompilatorskriver

Å lese tall fra en fil, klassen Scanner

INF1010 våren Arv og subklasser - del 2

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

Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

INF Løsning på seminaropppgaver til uke 8

Forelesning inf Java 5

GUI («Graphical User Interface») del 2

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

Forelesning inf Java 5

Dagens tema: Sjekking

IN1010 våren januar. Objektorientering i Java

INF100 Institutt for informatikk Universitetet i Bergen Øving 5

Innhold. INF1000 Høst Klasser og objekter. Uke 7: Mer objektorientert programmering Siri Moe Jensen

UNIVERSITETET I OSLO

Gjennomgang av eksamen H99

Objektorientert Programmering Ekstraordinær eksamen 2014

Transkript:

Dagens tema Dagens tema: Oversikt Prosjektet Feilmeldinger Moduler i prosjektet error log chargenerator scanner Enum-klasser i Java nok en gang f.rusc Char- Generator Del-0 Del-1 Del-2 Rusc f.rask Scanner Syntax Code Programmeringsverktøy Emacs Hvordan komme i gang? Error Log f.log Feilmeldinger Hva er en god feilmelding? Ubrukelig ERROR: Syntax error detected! Feilmeldinger Melding med mening Meldingen bør fortelle hva som er galt: ERROR in line 217: Semicolon expected. x = x+1 ; Noe bedre ERROR: Syntax error found in line 217. Hvor på linjen? Meldingen bør fortelle hvor på linjen feilen er: Enda bedre ERROR: Syntax error found in line 217: x = x+1 ; ERROR in line 217: Semicolon expected. x = x+1 ; **************^ Det er ikke alltid like lett!

Feilmeldinger Modulen error Modulen error Den beste meldingen Meldingen bør angi hvorledes kompilatoren «tenker»: ERROR in line 217: Expected ; at end of sentence but found. x = x+1 ; package no.uio.ifi.rusc.error; import no.uio.ifi.rusc.log.log; /** * Print error messages. */ public class Error { public static void error(string where, String message) { System.exit(1); Modulen error Modulen error public static void error(string message) { error("", message); public static void error(int linenum, String message) { error("in line " + linenum, message); public static void giveusage() { System.err.println("Usage: rusc [-log{c P S T] [-test{scanner parser] file"); System.exit(2); public static void init() { public static void finish() { Siden de fleste feilene er relatert til lesingen av RusC-koden, er det nyttig med en egen metode i Scanner-modulen: public static void illegal(string message) { Error.error(CharGenerator.curLineNum(), message); public static void check(token t) { if (curtoken!= t) illegal("expected a " + t + " but found a " + curtoken + "!"); public static void skip(token t) { check(t); readnext();

Modulen log Modulen log Modulen log Brukeren kan slå av og på logging (med opsjoner som håndteres av Rusc-modulen). package no.uio.ifi.rusc.log; import java.io.*; import no.uio.ifi.rusc.error.error; import no.uio.ifi.rusc.rusc.rusc; import no.uio.ifi.rusc.scanner.scanner; import no.uio.ifi.rusc.scanner.token; public class Log { public static boolean dologcode = false, dologparser = false, dologscanner = false, dologtree = false; 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 + "!"); private static String logname, curtreeline = ""; private static int nloglines = 0, parselevel = 0, treelevel = 0; public static void init() { logname = Rusc.sourceName; if (logname.endswith(".rusc")) logname = logname.substring(0, logname.length()-5); logname += ".log"; Modulen log I del 0 skal vi sjekke skanneren: public static void notesourceline(int linenum, String line) { if (! dologparser &&! dologscanner) return; public static void notetoken(token t) { if (! dologscanner) return; Feilmeldinger må med i loggen (om det er noen): public static void noteerror(string message) { if (nloglines > 0) writelogline(message); Modulen chargenerator Modulen chargenerator package no.uio.ifi.rusc.chargenerator; import java.io.*; import no.uio.ifi.rusc.error.error; import no.uio.ifi.rusc.log.log; import no.uio.ifi.rusc.rusc.rusc; /** * Module for reading single characters. */ public class CharGenerator { public static char curc, nextc; private static LineNumberReader sourcefile = null; private static String sourceline; private static int sourcepos;

Modulen chargenerator Modulen chargenerator public static void init() { try { sourcefile = new LineNumberReader(new FileReader(Rusc.sourceName)); catch (FileNotFoundException e) { Error.error("Cannot read " + Rusc.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!"); Metoden readnext leser neste tegn: public static boolean ismoretoread() { return false; public static void readnext() { curc = nextc; if (! ismoretoread()) return; Modulen scanner Modulen scanner Modulen scanner Symbolene leses inn i curtoken, nexttoken og nextnexttoken (samt i curname, curnumber, nextname, nextnumber, nextnextname og nextnextnumber). package no.uio.ifi.rusc.scanner; import no.uio.ifi.rusc.chargenerator.chargenerator; import no.uio.ifi.rusc.error.error; import no.uio.ifi.rusc.log.log; public class Scanner { public static Token curtoken, nexttoken, nextnexttoken; public static String curname, nextname, nextnextname; public static long curnum, nextnum, nextnextnum; Lesingen skjer med readnext-metoden: public static void readnext() { curtoken = nexttoken; nexttoken = nextnexttoken; curname = nextname; nextname = nextnextname; curnum = nextnum; nextnum = nextnextnum; nextnexttoken = Token.noToken; while (nextnexttoken == Token.noToken) { Log.noteToken(nextNextToken); public static void init() { public static void finish() {

Modulen scanner Noen nyttige hjelperutiner: private static boolean isletteraz(char c) { return false; public static void illegal(string message) { Error.error(CharGenerator.curLineNum(), message); public static void check(token t) { if (curtoken!= t) illegal("expected a " + t + " but found a " + curtoken + "!"); public static void check(token t1, Token t2) { if (curtoken!= t1 && curtoken!= t2) illegal("expected a " + t1 + " or a " + t2 + " but found a " + curtoken + "!"); Et enkelt eksempel Enum-klasser Et eksempel er: enum Tippetegn { Hjemmeseier, Uavgjort, Borteseier; char Tegn () { return tostring().charat(0); En analogi Dette er nesten det samme som class Ttegn { private String name; private Ttegn(String s) { name = s; Bruk av enum-klasser Slik brukes denne klassen: class Tipping { public static void main (String arg[]) { Tippetegn rekke[] = new Tippetegn[12+1]; public static final Ttegn Hjemmeseier = new Ttegn("Hjemmeseier"), Uavgjort = new Ttegn("Uavgjort"), Borteseier = new Ttegn("Borteseier"); public String tostring () { return name; char tegn () { return tostring().charat(0); rekke[1] = Tippetegn.Hjemmeseier; rekke[2] = Tippetegn.Borteseier; rekke[3] = Tippetegn.Borteseier; for (int i = 1; i <= 3; ++i) System.out.print(rekke[i].Tegn()); System.out.println();

Bruk av enum-klasser Oppsett Hva kan vi gjøre med enum-klasser? Tilordne verdier («rekke[i] = Tippetegn.Uavgjort») Sjekke på likhet og ulikhet («rekke[1] == Tippetegn.Boreseier») Skrive ut objektet («System.out.println(rekke[1])» som er det samme som «System.out.println(rekke[1].toString())») Slik henter man malen til prosjektet: Hent inf2100-oblig.zip fra kursets nettside. Gjør så: unzip inf2100-oblig.zip cd inf2100 make java -jar Rusc.jar minfil.rusc Hvilke typer finnes? Hvilket programmeringsverktøy? Oppstart av : Det finnes to typer verktøy: Generelle verktøy (som Emacs) kan håndtere alle programmeringsspråk. Spesialverktøy (som ) er laget for ett programmeringsspråk (og ofte bare for én omgivelse). > eclipse&

Velkomstvinduet i -vinduet Start et nytt prosjekt Arbeid med

Oppsummering Oppsummering Hvorfor bruker da ikke alle spesialverktøy? Det er mange fordeler med et spesialverktøy: Mange liker å jobbe med «pek-og-klikk». Verktøyet vil oppdage feil veldig tidlig. Mye kode settes inn automatisk. Ved feil under testing får man øyeblikkelig vite hvor feil oppsto. Det er ikke laget spesialverktøy for alle språk og omgivelser. Spesialverktøy er grafiske det er ikke alltid man kan kjøre slike programmer. Det er mye jobb å lære et nytt grafisk verktøy for hvert språk man skal jobbe i. Man jobber ofte raskere med tastaturet enn med musen. Noen nyttige operasjoner finnes ikke i spesialverktøyene (bytt to tegn, bytt om variabelnavn,... ). Oppsummering Konklusjon Alle bør prøve begge typen verktøy. Så velger man det man foretrekker til hvert prosjekt.