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

Like dokumenter
INF2100. Oppgaver uke 40 og

INF2100. Oppgaver 9. oktober 2012 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. Oppgaver 6. og 11. oktober 2011 C 100 X 10

INF2100. Oppgaver 23. og 24. september 2010

INF2100. Oppgaver 26. september til 1. oktober 2007

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

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

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

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

Del 3: Evaluere uttrykk

Dagens tema: Mer av det dere trenger til del 1

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

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

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:

Dagens tema: Resten av det dere trenger til del 1

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?

Oversikt Kompilering Syntaksanalyse Java Feilsjekking Oppsummering

Dagens tema: Sjekking

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

Dagens tema: Resten av det dere trenger til del 1

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

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

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

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

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

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen

TOD063 Datastrukturer og algoritmer

Oversikt Kodegenerering Variabler Setninger Uttrykk While-setningen

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

INF5110, 15/ Dagens temaer: Avslutning kap. 4 Begynne på kap. 5 Se på oppgave. Stein Krogdahl, Ifi UiO

Repetisjon. INF gruppe 13

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

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

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

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

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen

INF1010 våren 2018 tirsdag 23. januar

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen Oppsummering

Sortering med tråder - Quicksort

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

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

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

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen

Avdeling for ingeniørutdanning Institutt for teknologi

Eksempel 1 Eksempel 2 Dramatisering. INF1000 uke 3. Sundvollen 7. september 2015 Dag Langmyhr. INF1000 Sundvollen

INF Løsning på seminaropppgaver til uke 8

INF1010, 21. februar Om å gå gjennom egne beholdere (iteratorer) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

Litt om pakker og mest om data inn og ut

Jentetreff INF1000 Debugging i Java

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

Løsningsforslag Test 2

INF 1000 høsten 2011 Uke september

Videregående programmering 6

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

INF1000 undervisningen INF 1000 høsten 2011 Uke september

HØGSKOLEN I SØR-TRØNDELAG

Løsningsforslag INF desember 2007

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

1. Krav til klasseparametre 2. Om å gå gjennom egne beholdere (iteratorer) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

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

Løsningsforslag til eksamen i INF1000 våren 2006

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

INF1010. Grensesnittet Comparable<T>

Algoritmer og datastrukturer Kapittel 11 - Delkapittel 11.2

Dagens tema: Mer av det dere trenger til del 1

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

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

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

Inf 1000 høst 2005 Løsningsforslag ordinær eksamen

LO191D/LC191D Videregående programmering

INF100 Institutt for informatikk Universitetet i Bergen Øving 5

Oversikt Oversettelse Logging Implementasjon Oppsummering

Forelesning inf Java 5

INF 1000 (uke 2) Variabler, tilordninger og uttrykk

Forelesning inf Java 5

Oppgave01.java class Bongo { 2 public static void main(string[] args){ 3 int[][][]bongo = new int[2][3][4]; 4 5 // SVAR: 24 6 } 7 } 8

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

Forelesning inf Java 4

INF Seminaroppgaver til uke 3

Inf1010 Våren Feilsituasjoner og unntak i Java. Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

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

OPPGAVE 5b og 8b Java Kode

Inf1010 Våren Feilsituasjoner og unntak i Java. Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

INF Uke 10. Løsningsforslag ukesoppgaver oktober 2012

IN Notat om I/O i Java

Dagens tema: Sjekking (obligatorisk oppgave 3)

Eksamensoppgave i TDT4100 Objektorientert programmering

GUI («Graphical User Interface») del 2

Rekursjon. (Big Java kapittel 13) Fra Urban dictionary: recursion see recursion. IN1010 uke 8 våren Dag Langmyhr

INF Notater. Veronika Heimsbakk 10. juni 2012

INF1010 våren Arv og subklasser - del 2

Transkript:

INF2100 Løsningsforslag til oppgaver uke 40 og 41 2014 Oppgave 1 Se figur 1 på neste side. Oppgave 2 4 Her er det mange mulige løsninger her er én: import java.io.*; import java.util.*; class E { public static void main(string arg[]) { Scanner.init(); Program p = Program.parse(); if (Scanner.curToken!= Token.eofToken) Error.error("Syntax error: Illegal "+Scanner.curToken); p.printtree(); Log.writeln(); System.out.println("The value is "+p.eval()); abstract class SyntaxUnit { abstract long eval(); abstract void printtree(); class Program extends SyntaxUnit { Expression e; return e.eval(); static Program parse() { Program p = new Program(); Log.enterParser("<program>"); p.e = Expression.parse(); Log.leaveParser("</program>"); return p; e.printtree(); 1

program expression term program expression term expression term Figur 1: Svar på oppgave 1 2

class Expression extends SyntaxUnit { Term t = new Term(); return t.eval(); static Expression parse() { Expression e = new Expression(); Log.enterParser("<expression>"); e.t = Term.parse(); Log.leaveParser("</expression>"); return e; t.printtree(); class Term extends SyntaxUnit { List<Factor> s = new ArrayList<Factor>(); List<Token> opers = new ArrayList<Token>(); long v = s.get(0).eval(); for (int i = 1; i < s.size(); ++i) { if (opers.get(i-1) == Token.plusToken) v += s.get(i).eval(); else v -= s.get(i).eval(); return v; static Term parse() { Term t = new Term(); Log.enterParser("<term>"); t.s.add(factor.parse()); while (Scanner.curToken==Token.plusToken Scanner.curToken==Token.minusToken) { t.opers.add(scanner.curtoken); Scanner.readNext(); t.s.add(factor.parse()); Log.leaveParser("</term>"); return t; s.get(0).printtree(); for (int i = 1; i < s.size(); ++i) { if (opers.get(i-1) == Token.plusToken) Log.write("+"); else Log.write("-"); s.get(i).printtree(); 3

class Factor extends SyntaxUnit { List<Operand> operands = new ArrayList<Operand>(); List<Token> opers = new ArrayList<Token>(); long v = operands.get(0).eval(); for (int i = 1; i < operands.size(); ++i) { if (opers.get(i-1) == Token.mulToken) { v *= operands.get(i).eval(); else { long dv = operands.get(i).eval(); if (dv == 0) Error.error("Division by zero!"); v /= dv; return v; static Factor parse() { Factor f = new Factor(); Log.enterParser("<>"); f.operands.add(operand.parse()); while (Scanner.curToken==Token.mulToken Scanner.curToken==Token.divToken) { f.opers.add(scanner.curtoken); Scanner.readNext(); f.operands.add(operand.parse()); Log.leaveParser("</>"); return f; operands.get(0).printtree(); for (int i = 1; i < operands.size(); ++i) { if (opers.get(i-1) == Token.mulToken) Log.write("*"); else Log.write("/"); operands.get(i).printtree(); abstract class Operand extends SyntaxUnit { static Operand parse() { if (Scanner.curToken == Token.nameToken) return OperandName.parse(); if (Scanner.curToken == Token.numberToken) return OperandNumber.parse(); if (Scanner.curToken == Token.leftParToken) return OperandExpr.parse(); Error.error("Syntax error; found a "+Scanner.curToken); return null; // Required by the compiler. 4

class OperandName extends Operand { char id; if (id == M ) return 1000; if (id == C ) return 100; if (id == X ) return 10; Error.error("Unknown name: "+id+"."); return 0; // Required by the compiler! static OperandName parse() { OperandName o = new OperandName(); Log.enterParser("<operand> (a name)"); o.id = Scanner.curName; Scanner.readNext(); Log.leaveParser("</operand>"); return o; Log.write(""+id); class OperandNumber extends Operand { long n; return n; static OperandNumber parse() { OperandNumber o = new OperandNumber(); Log.enterParser("<operand> (a number)"); o.n = Scanner.curNumber; Scanner.readNext(); Log.leaveParser("</operand>"); return o; Log.write(""+n); class OperandExpr extends Operand { Expression e; return e.eval(); static OperandExpr parse() { OperandExpr e = new OperandExpr(); Log.enterParser("<operand> (an inner expression)"); Scanner.readNext(); e.e = Expression.parse(); if (Scanner.curToken!= Token.rightParToken) 5

Error.error("A ) expected after an expression."); Scanner.readNext(); Log.leaveParser("</operand>"); return e; Log.write("("); e.printtree(); Log.write(")"); enum Token { nametoken, numbertoken, plustoken, minustoken, multoken, divtoken, leftpartoken, rightpartoken, eoftoken class Scanner { public static Token curtoken; public static char curname; public static int curnumber; private static LineNumberReader f; public static void init() { f = new LineNumberReader(new InputStreamReader(System.in)); readnext(); public static void readnext() { curtoken = null; while (curtoken == null) { int c =? ; try { c = f.read(); // Read one character catch (IOException e) { Error.error("Read error!"); if (c < 0) { curtoken = Token.eofToken; else if (c == + ) { curtoken = Token.plusToken; else if (c == - ) { curtoken = Token.minusToken; else if (c == * ) { curtoken = Token.mulToken; else if (c == / ) { curtoken = Token.divToken; else if (c == ( ) { curtoken = Token.leftParToken; else if (c == ) ) { curtoken = Token.rightParToken; else if ( A <=c && c<= Z a <=c && c<= z ) { curtoken = Token.nameToken; curname = (char)c; else if (Character.isDigit(c)) { curtoken = Token.numberToken; curnumber = c- 0 ; else if (Character.isWhitespace(c)) { // Ignore space else { Error.error("Illegal character: "+(char)c+"!"); // For testing: 6

// System.out.println("Scanner: Read a "+curtoken); class Error { static void error(string message) { System.err.println("ERROR: "+message); System.exit(1); class Log { public static boolean dologparser = true, dologtree = true; private static int parselevel = 0; public static void enterparser(string symbol) { if (! dologparser) return; for (int i = 1; i <= parselevel; ++i) System.out.print(" "); System.out.println(symbol); ++parselevel; public static void leaveparser(string symbol) { if (! dologparser) return; --parselevel; for (int i = 1; i <= parselevel; ++i) System.out.print(" "); System.out.println(symbol); public static void write(string s) { if (! dologtree) return; System.out.print(s+" "); public static void writeln() { if (! dologtree) return; System.out.println(); Tilleggsspørsmål 2a Metodene eval og printtree vil ikke lenger være virtuelle, så vi ville få feilmeldinger for alle @Override-ene våre. Om vi også fjernet alle @Override, ville vi stadig få feilmeldinger, for eksempel om vi utfører i Factor.eval: operands.get(i).eval() siden kompilatoren ikke kunne vite at Operand inneholder en eval-metode. 7