IN2030. Oppgave 1 3. Løsningsforslag. Uke De ferdige klassene for å skanne og parsere minispråket E. ESyntax. Expression.

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

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

INF2100. Oppgaver uke 40 og

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

Del 3: Evaluere uttrykk

INF2100. Oppgaver 26. september til 1. oktober 2007

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: Nødvendig Java. De ulike modulene i prosjektet vårt Prosjektet

INF Løsning på seminaropppgaver til uke 8

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

Repetisjon. INF gruppe 13

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

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

INF1010 våren 2018 tirsdag 23. januar

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

/** *Kamp klassen inneholder kampfakte og hoveddelen av kampmotoren. young */

Dagens tema: Mer av det dere trenger til del 1

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

import java.util.arraylist;

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

Litt om pakker og mest om data inn og ut

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

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

Avdeling for ingeniørutdanning Institutt for teknologi

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

TOD063 Datastrukturer og algoritmer

HØGSKOLEN I SØR-TRØNDELAG

Løsningsforslag INF desember 2007

Løsningsforslag Test 2

Dagens tema: Mer av det dere trenger til del 2

Dagens tema: Sjekking

Algoritmer og datastrukturer Kapittel 11 - Delkapittel 11.2

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

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

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

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

INF1010 våren Arv og subklasser - del 2

Mer objektorientert programmering

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.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

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

OPPGAVE 5b og 8b Java Kode

Dagens tema: Resten av det dere trenger til del 2

Sortering med tråder - Quicksort

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

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

Å lese tall fra en fil, klassen Scanner

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

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring AITeL

Forelesning inf Java 5

Forelesning inf Java 5

Løsningsforslag til eksamen i INF1000 våren 2006

Læreboken på 45 minutter

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

TDT4100 Objektorientert programmering

Forelesning inf Java 4

Objektorientert Programmering Ekstraordinær eksamen 2014

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

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

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

INF1010 Eksamenstips. Løsningsforslag prøveeksamen del 1.

LO191D/LC191D Videregående programmering

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

Eksamen INF1010 V2009 Del B prøveeksamen V2010 Vekt 60 %

INF1010. Grensesnittet Comparable<T>

Videregående programmering 6

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen

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

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

IN 211 Programmeringsspråk. Java. på 20 enkle ark. spesielt for de som kan. Simula. (og gjerne litt C) Ark 1 av 20

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

Eksamen i fag SIF8005 Programmering. Torsdag 10. mai 2001 kl

IN Notat om I/O i Java

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

Oversikt Kodegenerering Variabler Setninger Uttrykk While-setningen

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

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

INF1010 våren Generalisering -spesialisering Gjenbruk av klasser. Ved arv. Klasse-hierarkier. Stein Gjessing.

UNIVERSITETET I OSLO

Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

LC191D/LO191D Videregående programmering mai 2010

Kapittel 9. Distribusjon. Fjernbruker. Tjenermaskin LAN WAN. Nærbruker. Figur 9-1: En enkel klient/tjener distribusjon

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

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen Oppsummering

INF100 Institutt for informatikk Universitetet i Bergen Øving 5

Oppgave 1. INF1000 Uke 13. Oppgave 2. Oppgave 3. Er dette lovlige deklarasjoner (når de foretas inni en metode)? JA NEI

Løsningsforslag, inf101, våren 2001

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

Innhold. INF1000 Høst Unified Modeling Language (UML) Unified Modeling Language (UML)

INF1000 (Uke 6) Mer om metoder, tekster

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

Transkript:

IN2030 Løsningsforslag Uke 39 2021 Oppgave 1 3 De ferdige klassene for å skanne og parsere minispråket E. E class E { public static void main(string arg[]) { Scanner s = new Scanner(arg[0]); Expression e = Expression.parse(s); e.prettyprint(); System.out.println(); ESyntax abstract class ESyntax { abstract void prettyprint(); static int parselevel = 0; static void enterparser(string nonterm) { for (int i = 1; i <= parselevel; ++i) System.out.print(" "); System.out.println("<"+nonterm+">"); parselevel++; static void leaveparser(string nonterm) { parselevel--; for (int i = 1; i <= parselevel; ++i) System.out.print(" "); System.out.println("</"+nonterm+">"); Expression abstract class Expression extends ESyntax { static Expression parse(scanner s) { enterparser("expression"); Expression e = Term.parse(s); leaveparser("expression"); return e; Term import java.util.arraylist; class Term extends Expression { ArrayList<Factor> operands = new ArrayList<>(); 1

ArrayList<Token> oprs = new ArrayList<>(); static Term parse(scanner s) { enterparser("term"); Term t = new Term(); t.operands.add(factor.parse(s)); while (s.curtoken().kind == TokenKind.plusToken s.curtoken().kind == TokenKind.minusToken) { t.oprs.add(s.curtoken()); t.operands.add(factor.parse(s)); leaveparser("term"); return t; operands.get(0).prettyprint(); for (int i = 1; i < operands.size(); i++) { System.out.print(" " + oprs.get(i-1).kind + " "); operands.get(i).prettyprint(); Factor import java.util.arraylist; class Factor extends ESyntax { ArrayList<Atom> operands = new ArrayList<>(); ArrayList<Token> oprs = new ArrayList<>(); static Factor parse(scanner s) { enterparser("factor"); Factor f = new Factor(); f.operands.add(atom.parse(s)); while (s.curtoken().kind == TokenKind.astToken s.curtoken().kind == TokenKind.slashToken) { f.oprs.add(s.curtoken()); f.operands.add(atom.parse(s)); leaveparser("factor"); return f; operands.get(0).prettyprint(); for (int i = 1; i < operands.size(); i++) { System.out.print(" " + oprs.get(i-1).kind + " "); operands.get(i).prettyprint(); Atom abstract class Atom extends ESyntax { static Atom parse(scanner s) { enterparser("atom"); Atom a; if (s.curtoken().kind == TokenKind.leftParToken) a = InnerExpr.parse(s); else 2

a = Number.parse(s); leaveparser("atom"); return a; InnerExpr class InnerExpr extends Atom { Expression expr; static InnerExpr parse(scanner s) { enterparser("inner expr"); InnerExpr ie = new InnerExpr(); // Skip past (. ie.expr = Expression.parse(s); // Skip past ). leaveparser("inner expr"); return ie; System.out.print("("); System.out.print(")"); expr.prettyprint(); Number class Number extends Atom { int val; static Number parse(scanner s) { enterparser("number"); Number n = new Number(); n.val = s.curtoken().numval; leaveparser("number"); return n; System.out.print(val); Scanner import java.io.*; import java.util.*; class Scanner { private LineNumberReader sourcefile = null; private ArrayList<Token> curlinetokens = new ArrayList<>(); public Scanner(String filename) { try { sourcefile = new LineNumberReader( new InputStreamReader( new FileInputStream(fileName), "UTF-8")); catch (IOException e) { readnextline(); 3

public Token curtoken() { return curlinetokens.get(0); public void readnexttoken() { if (! curlinetokens.isempty()) curlinetokens.remove(0); private void readnextline() { String line = null; try { line = sourcefile.readline(); catch (IOException e) { // Find all the tokens: int pos = 0; while (pos < line.length()) { char c = line.charat(pos++); if (Character.isWhitespace(c)) { // Ignore spaces. else if (isdigit(c)) { Token t = new Token(TokenKind.integerToken); t.integerlit = c - 0 ; curlinetokens.add(t); else if (c == * ) { curlinetokens.add(new Token(TokenKind.astToken)); else if (c == ( ) { curlinetokens.add(new Token(TokenKind.leftParToken)); else if (c == - ) { curlinetokens.add(new Token(TokenKind.minusToken)); else if (c == + ) { curlinetokens.add(new Token(TokenKind.plusToken)); else if (c == ) ) { curlinetokens.add(new Token(TokenKind.rightParToken)); else if (c == / ) { curlinetokens.add(new Token(TokenKind.slashToken)); curlinetokens.add(new Token(TokenKind.eofToken)); private boolean isdigit(char c) { return 0 <=c && c<= 9 ; Token class Token { TokenKind kind; long integerlit; Token(TokenKind k) { kind = k; String showinfo() { String t = kind + " token"; if (kind == TokenKind.integerToken) t += ": " + integerlit; return t; TokenKind enum TokenKind { integertoken("integer literal"), 4

asttoken("*"), leftpartoken("("), minustoken("-"), plustoken("+"), rightpartoken(")"), slashtoken("/"), eoftoken("e-o-f"); private String image; TokenKind(String im) { image = im; public String tostring() { return image; 5