INF2100. Oppgaver 9. oktober 2012 C 100 X 10

Like dokumenter
INF2100. Oppgaver uke 40 og

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

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

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

Del 3: Evaluere uttrykk

Oversikt Kompilering Syntaksanalyse Java Feilsjekking Oppsummering

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

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. Hva er kompilering? Anta at vi lager dette lille programmet (kalt kildekoden): Hva er kompilering?

Dagens tema: Resten av det dere trenger til del 1

Dagens tema: Resten av det dere trenger til del 1

Oversikt Kodegenerering Variabler Setninger Uttrykk While-setningen

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen

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

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

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

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen Oppsummering

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

Språktyper og syntaksanalyseteknikker. Dagens temaer. Hvordan lage en deterministisk automat? Fra jernbanediagram til ID-automat

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

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

INF1010 våren 2018 tirsdag 23. januar

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

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

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

Dagens tema: Sjekking

TOD063 Datastrukturer og algoritmer

Programmeringsspråket C

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

Repetisjon. INF gruppe 13

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

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen

UNIVERSITETET I OSLO

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

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

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

OPPGAVE 5b og 8b Java Kode

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

Litt om pakker og mest om data inn og ut

INF 1000 høsten 2011 Uke september

Sortering med tråder - Quicksort

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

INF1000 undervisningen INF 1000 høsten 2011 Uke september

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

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

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

INF 1000 (uke 2) Variabler, tilordninger og uttrykk

Løsningsforslag Test 2

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

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

Forelesning inf Java 5

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

Forelesning inf Java 5

HØGSKOLEN I SØR-TRØNDELAG

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

TDT4100 Objektorientert programmering

Stein Gjessing. Institutt for informatikk. Universitetet i Oslo. Institutt for informatikk

Algoritmer og datastrukturer Kapittel 11 - Delkapittel 11.2

Løsningsforslag til eksamen i INF1000 våren 2006

INF Seminaroppgaver til uke 3

UNIVERSITETET I OSLO

Avdeling for ingeniørutdanning Institutt for teknologi

Videregående programmering 6

INF1010 våren Arv og subklasser - del 2

UNIVERSITETET I OSLO

INF110 Algoritmer og datastrukturer TRÆR. Vi skal i denne forelesningen se litt på ulike typer trær:

INF Løsning på seminaropppgaver til uke 8

INF1010, 22. mai Prøveeksamen (Eksamen 12. juni 2012) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

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

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

UNIVERSITETET I OSLO

INF1000 (Uke 6) Mer om metoder, tekster

Jentetreff INF1000 Debugging i Java

IN Notat om I/O i Java

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

Oversikt Oversettelse Logging Implementasjon Oppsummering

Rep: Metoder. INF1000 (Uke 6) Mer om metoder, tekster. Rep: Metoder. 3 typer variable: Klassevariable. Java-programmene så langt i kurset:

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

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

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

Kapittel 8: Programutvikling

Oppsummering. Kort gjennomgang av klasser etc ved å løse halvparten av eksamen Klasser. Datastrukturer. Interface Subklasser Klasseparametre

Konstruktører. Bruk av konstruktører når vi opererer med "enkle" klasser er ganske ukomplisert. Når vi skriver. skjer følgende:

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

INF Uke 10. Ukesoppgaver oktober 2012

Transkript:

INF2100 Oppgaver 9. oktober 2012 Oppgave 1 Vi skal se på et meget enkelt språk E som består av uttrykk med de fire vanligste regneartene +,, * og /; grammatikken 1 ser du i figur 1 på neste side. Tallkonstanter består av bare ett siffer 2 og variabelnavn er på bare én bokstav. Tre variabler er forhåndsdefinert: 3 M 1000 C 100 X 10 En implementasjon 4 av en interpret 5 av dette språket ser slik ut: 6 import java.io.*; import java.util.*; class E { public static void main(string arg[]) { Scanner.init(); Program p = new Program(); p.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 parse(); abstract void printtree(); class Program extends SyntaxUnit { Expression e; return 0; 1 Grammatikken til E viser at E har operatorer med ulik prioritet: * og / binder sterkere enn + og så uttrykket 2+3*5 gir verdien 17. 2 Selv om konstantene bare har ett siffer, kan godt resultatet bli større; se eksemplet. 3 Det er ikke mulig å definere flere variabler selv (i tilfelle du lurte på det). 4 I denne implementasjonen av E får vi lov å bruke alt vi ønsker fra Java-biblioteket. 5 Siden dette er en interpret og ikke en vanlig kompilator, vil den beregne verdien av uttrykket i stedet for å lage kode som gjør det. Men både en interpret og en kompilator vil først gjøre en syntaksanalyse (en «parsering») av koden. 6 Denne koden finnes i ~inf2100/kode/e/e.java som du også finner på nettet ved å klikke på denne linken: http://inf2100.at.ifi.uio.no/kode/e/e.java. 1

program expression term + - factor expression term number factor operand * / operand name digit0-9 number name letteraz ( expression ) Figur 1: Grammatikken til språket E class Expression extends SyntaxUnit { Term t = new Term(); return t.eval(); Log.enterParser("<expression>"); t.parse(); Log.leaveParser("</expression>"); t.printtree(); class Term extends SyntaxUnit { List<Factor> factors = new ArrayList<Factor>(); List<Token> opers = new ArrayList<Token>(); return 0; 2

class Factor extends SyntaxUnit { List<Operand> operands = new ArrayList<Operand>(); List<Token> opers = new ArrayList<Token>(); return 0; abstract class Operand extends SyntaxUnit { class OperandName extends Operand { char id; return 0; class FactorNumber extends Factor { long n; return 0; class OperandExpr extends Operand { Expression e = new Expression(); 3

return 0; 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: // System.out.println("Scanner: Read a "+curtoken); 4

class Error { static void error(string message) { System.err.println("ERROR: "+message); System.exit(1); class Log { public static boolean dologparser = false, dologtree = false; 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(); Fyll ut de tomme utgavene av parse og eval. Eksempel Om vi sender inn programmet M+M+X+1 skal svaret av evalueringen bli > java E <e1.e The value is 2011 Tilleggsspørsmål 1 Trenger vi klassen SyntaxUnit? Hva skjer om vi fjerner den (og alle referanser til den)? Oppgave 2 Legg inn kall på enterparser og leaveparser i hver parse-metode slik at vi kan følge kallene. 5

Eksempel Om vi sender inn dette uttrykket 5 + 2*C - 2*(M-1)/3 bør resultatet bli slik: <program> <expression> <term> <operand> (a name) <operand> (an inner expression) <expression> <term> <operand> (a name) </term> </expression> </term> </expression> </program> Oppgave 3 Legg inn en metode printtree i hver klasse slik at den interne formen av uttrykket blir skrevet ut. Eksempel Om vi sender inn eksemplet fra oppgave 1, skal resultatet bli M + M + X + 1 6