INF2100. Oppgaver uke 40 og

Like dokumenter
INF2100. Oppgaver 9. oktober 2012 C 100 X 10

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

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: Mer 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 (kalt kildekoden): Hva er kompilering?

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: 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: Resten av det dere trenger til del 1

Dagens tema: Resten av det dere trenger til del 1

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

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

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

Oversikt Kodegenerering Variabler Setninger Uttrykk While-setningen

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen Oppsummering

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen

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

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

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

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

Programmeringsspråket C

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

TOD063 Datastrukturer og algoritmer

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

INF1010 våren 2018 tirsdag 23. januar

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: Nødvendig Java. De ulike modulene Prosjektet. Strukturen Pakker i Java Avbrudd («exceptions») Enum-klasser i Java Hvilket objekt er jeg?

Dagens tema: Sjekking

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

UNIVERSITETET I OSLO

INF 1000 høsten 2011 Uke september

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

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

Repetisjon. INF gruppe 13

INF1000 undervisningen INF 1000 høsten 2011 Uke september

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen

Sortering med tråder - Quicksort

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

INF 1000 (uke 2) Variabler, tilordninger og uttrykk

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

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

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

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

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

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

INF Seminaroppgaver til uke 3

UNIVERSITETET I OSLO

Løsningsforslag Test 2

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

Programmeringsspråket C

INF Løsning på seminaropppgaver til uke 8

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

Forelesning inf Java 5

Forelesning inf Java 5

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

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

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

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

Algoritmer og datastrukturer Kapittel 11 - Delkapittel 11.2

Programmeringsspråket C

Løsningsforslag til eksamen i INF1000 våren 2006

Avdeling for ingeniørutdanning Institutt for teknologi

Videregående programmering 6

INF1010 våren Arv og subklasser - del 2

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

Jentetreff INF1000 Debugging i Java

Dagens tema: Mer av det dere trenger til del 1

UNIVERSITETET I OSLO

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

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

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

Kapittel 8: Programutvikling

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

INF våren 2017

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

UNIVERSITETET I OSLO

INF Uke 10. Ukesoppgaver oktober 2012

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

INF 1000 (uke 2) Variabler, tilordninger og uttrykk

Transkript:

INF2100 Oppgaver uke 40 og 41 2014 For å få trening i å programmere en parser, skal vi aller først gjøre det for et veldig enkelt programmeringsspråk: E. Dette språket 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 = 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; 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 static Program parse() { 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> factors = new ArrayList<Factor>(); List<Token> opers = new ArrayList<Token>(); 2

static Term parse() { class Factor extends SyntaxUnit { List<Operand> operands = new ArrayList<Operand>(); List<Token> opers = new ArrayList<Token>(); static Factor parse() { abstract class Operand extends SyntaxUnit { static Operand parse() { class OperandName extends Operand { char id; static OperandName parse() { class OperandNumber extends Operand { long n; static OperandNumber parse() { 3

class OperandExpr extends Operand { Expression e; static OperandExpr parse() { 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 ) { 4

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); 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(); Eksempel Om vi sender inn programmet M+M+X+1 skal svaret av evalueringen bli > java E <e1.e The value is 2011 5

Oppgave 1 Tegn parseringstreet til programmet i eksemplet over og til eksemplet i oppgave 4. Oppgave 2 Fyll ut de tomme utgavene av parse og eval. Tilleggsspørsmål 2a Trenger vi klassen SyntaxUnit? Hva skjer om vi fjerner den (og alle referanser til den)? Oppgave 3 Legg inn kall på enterparser og leaveparser i hver parse-metode slik at vi kan følge kallene. 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> 6

</term> </expression> </program> Oppgave 4 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 7