Programmieren in Java

Ähnliche Dokumente
Programmieren in Java

Programmieren I + II Regeln der Code-Formatierung

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

Elementare Konzepte von

Einstieg in die Informatik mit Java

Java Einführung Abstrakte Klassen und Interfaces

Einstieg in die Informatik mit Java

JavaScript. Dies ist normales HTML. Hallo Welt! Dies ist JavaScript. Wieder normales HTML.

Musterlösung Stand: 5. Februar 2009

Java I Vorlesung Collections

Arten von Klassen-Beziehungen

System.out.println("TEXT");

PROGRAMMIERUNG IN JAVA

Programmierung 2. Übersetzer: Das Frontend. Sebastian Hack. Klaas Boesche. Sommersemester

Javakurs für Anfänger

Aufgabe 1.90: Ein Geschäft gibt ihren Kunden unterschiedliche Rabatte. Schreiben ein Programm, das folgende Rabattklassen vorsieht:

AuD-Tafelübung T-B5b

Theorie zu Übung 8 Implementierung in Java

Beispiele für Ausdrücke. Der imperative Kern. Der imperative Kern. Imperativer Kern - Kontrollstrukturen. Deklarationen mit Initialisierung

Operatoren für elementare Datentypen Bedingte Anweisungen Schleifen. Programmieren I. Martin Schultheiß. Hochschule Darmstadt Wintersemester 2010/2011

JAVA - Methoden

JAVA - Methoden - Rekursion

6. Globalübung (zu Übungsblatt 8)

Praktische Übung 'JUnit-Test'

Java-Schulung Grundlagen

Programmieren in Java

public class SternchenRechteckGefuellt {

Einstieg in die Informatik mit Java

1 Aufgaben 1.1 Umgebungsvariable setzen: CLASSPATH

Programmieren 2 Java Überblick

Thread-Synchronisation in in Java. Threads Wechselseitiger Ausschluss Bedingte Synchronisation Beispiel: Warteschlangen

Kapitel 4: Klassen und Unterklassen

Einstieg in die Informatik mit Java

Informatik I - Einstiegskurs

3 Objektorientierte Konzepte in Java

3.4 Struktur von Programmen

Einstieg in die Informatik mit Java

Beispiel für überladene Methode

3. Anweisungen und Kontrollstrukturen

Programmierkonventionen - 1 -

Vorlesung Programmieren

Eine kleine Befehlssammlung für Java Teil1

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

Übersicht Shell-Scripten

C++ Teil 2. Sven Groß. 16. Apr IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Apr / 22

Programmierkurs Java

Eine JAVA Einführung ... Quellcode:... COMA Übung 3. T.Bosse. A.Griewank. Vorschau JAVA Programme Sprachen Kate

6. Iteration (Schleifenanweisungen)

Technische Universität München WS 2004/2005 Fakultät für Informatik 11. Dezember 2004 Prof. Dr. Seidl

Programmieren I. Kapitel 5. Kontrollfluss

Das Test-Framework JUnit ETIS SS04

Die Programmiersprache C Eine Einführung

Organisatorisches. drei Gruppen Gruppe 1: 10:10-11:40, Gruppe 2: 11:45-13:15 Gruppe 3: 13:20-14:50

5 Grundlagen der Java-Syntax

Welche Informatik-Kenntnisse bringen Sie mit?

Klassendefinitionen verstehen

Probeklausur: Programmierung WS04/05

Erwin Grüner

Stapel (Stack, Keller)

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung

Bei jedem Arduino-Projekt muss man ein Grundgerüst "bauen". Das sieht dann so aus:

1. Der Einstieg in Java. Was heißt Programmieren?

Vorlesung Programmieren

Grundlagen der Programmierung Teil1 Einheit III Okt. 2009

Einstieg in die Informatik mit Java

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Klassen und Objekte. Klassen sind Vorlagen für Objekte. Objekte haben. Attribute. Konstruktoren. Methoden. Merkblatt

Wie entwerfe ich ein Programm?

Lexikalische Programmanalyse der Scanner

CS1005 Objektorientierte Programmierung Bachelor of Science (Informatik)

Binärbäume. Prof. Dr. E. Ehses,

1. Typen und Literale (6 Punkte) 2. Zuweisungen (6 = Punkte)

Java I Vorlesung 6 Referenz-Datentypen

Wiederholung zur Vorlesung Programmieren

Java 8. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Oktober 2014 JAV8

Repetitorium Informatik (Java)

Java für Anfänger Teil 2: Java-Syntax. Programmierkurs Manfred Jackel

Interfaces und Vererbung

Aufgaben Objektentwurf

Kurze Einführung in die Programmiersprache C++ und in Root

Einführung Datentypen Verzweigung Schleifen. Java Crashkurs. Kim-Manuel Klein May 4, 2015

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

Klausur Software-Entwicklung September 00

Objektorientierte Programmierung OOP Programmieren mit Java

Quellcode-Repräsentation in Eclipse. Seminarvortrag PG Reclipse Jan Rieke

Test zu Grundlagen der Programmierung Leitung: Michael Hahsler. 21. November 2003

3. Klassen Statische Komponenten einer Klasse. Klassenvariablen

Objektorientierte Programmierung

Algorithmen zur Datenanalyse in C++

Transkript:

Programmieren in Java Vorlesung 10: Ein Interpreter für While Prof. Dr. Peter Thiemann Albert-Ludwigs-Universität Freiburg, Germany SS 2015 Peter Thiemann (Univ. Freiburg) Programmieren in Java JAVA 1 / 18

Inhalt Interpreter für While Die Sprache While Ausführung von While Testen Peter Thiemann (Univ. Freiburg) Programmieren in Java JAVA 2 / 18

Interpreter Ein Interpreter ist ein Programm zur Ausführung von anderen Programmen Eingaben Ein Programm (-text) P in einer Sprache L Die Eingabe für das Programm P Ausgabe Die Ausgabe des Programms P Peter Thiemann (Univ. Freiburg) Programmieren in Java JAVA 4 / 18

Architektur des Interpreters Parser Einlesen des Programmtextes Erstellen einer Objektrepräsentation des Programmtextes abstract syntax tree (AST) Runner Durchlaufen des AST Ausführen der Statements Auswerten von Ausdrücken Peter Thiemann (Univ. Freiburg) Programmieren in Java JAVA 5 / 18

Die Sprache While

Die Sprache While Syntax von While BNF für While stmt ::= var = expr Zuweisung if ( expr ) stmt else stmt Bedingte Anweisung while ( expr ) stmt While Schleife { stmt1 Sequenz stmt1 ::= }... leer stmt ; stmt1 nächste Anweisung stmt = Statement = Anweisung stmt1 spezifiziert eine Liste von Anweisungen, wobei jede Anweisung durch Semikolon abgeschlossen ist und das Ende mit schließender geschweifter Klammer markiert ist expr = arithmetische Ausdrücke, wie gehabt Peter Thiemann (Univ. Freiburg) Programmieren in Java JAVA 7 / 18

Die Sprache While Objektrepräsentation (AST) Composite und Visitor Pattern Hier: Visitor ohne Rückgabewert 1 public interface IStmt { 2 void accept(stmtvisitor v); 3 } 1 public interface StmtVisitor { 2 void visitassign(assign s); 3 void visitif(if s); 4 void visitsequence(sequence s); 5 void visitwhile(while s); 6 } Peter Thiemann (Univ. Freiburg) Programmieren in Java JAVA 8 / 18

Die Sprache While Objektrepräsentation (AST) II 1 public class Assign implements IStmt { 2 public final String var; 3 public final IExpr exp; 4 public void accept(stmtvisitor v) { 5 v.visitassign(this); 6 } 7 } 1 public class While implements IStmt { 2 public final IExpr condition; 3 public final IStmt body; 4 public void accept(stmtvisitor v) { 5 v.visitwhile(this); 6 } 7 } 1 public class If implements IStmt { 2 public final IExpr condition; 3 public final IStmt truebranch; 4 public final IStmt falsebranch; 5 public void accept(stmtvisitor v) { 6 v.visitif(this); 7 } 8 } 1 public class Sequence implements IStmt { 2 public final Collection<IStmt> stmts; 3 public void accept(stmtvisitor v) { 4 v.visitsequence(this); 5 } 6 } Für jede Art Anweisung eine Klasse (mit Standardkonstruktor) Peter Thiemann (Univ. Freiburg) Programmieren in Java JAVA 9 / 18

Parser für While

Die Sprache While Parser für While Gleiches Muster wie für Ausdrücke: recursive descent parser Möglichkeit: Erweiterung des Ausdrucksparsers mittels Vererbung Kleine Änderungen am Ausdrucksparser lecture20150622.parser erforderlich: die privaten Methoden für den Scanner müssen protected gemacht werden 1 protected boolean lookingat(string regex) { 2 return scan.lookingat(regex); 3 } 4 protected String getlexeme(string regex) { 5 return scan.getlexeme(regex); 6 } Peter Thiemann (Univ. Freiburg) Programmieren in Java JAVA 11 / 18

Die Sprache While Parser für If-Anweisung (Beispiel, Auszug) 1 public IStmt parsestmt() { 2 String lexeme = scan.getlexeme(regex WORD); 3 if ( if.equals(lexeme)) { 4 // if. ( <expr> ) <stmt> else <stmt> 5 if (scan.getlexeme(regex OPEN PAREN)!= null) { 6 // if (. <expr> ) <stmt> else <stmt> 7 IExpr condition = parseexpr(); 8 // if ( <expr>. ) <stmt> else <stmt> 9 if (scan.getlexeme(regex CLOSE PAREN)!= null) { 10 // if ( <expr> ). <stmt> else <stmt> 11 IStmt truebranch = parsestmt(); 12 // if ( <expr> ) <stmt>. else <stmt> 13 if (scan.getlexeme( else )!= null) { 14 // if ( <expr> ) <stmt> else. <stmt> 15 IStmt falsebranch = parsestmt(); 16 // if ( <expr> ) <stmt> else <stmt>. 17 return new If(condition, truebranch, falsebranch); 18 } } } } Peter Thiemann (Univ. Freiburg) Programmieren in Java JAVA 12 / 18

Ausführung von While

Ausführung von While Ausführung von While Durch RunVisitor, eine Implementierung von StmtVisitor Interner Zustand des RunVisitor ist die Belegung der Variablen Repräsentiert durch eine Abbildung von Variablennamen auf Zahlen: Map<String,Integer> Peter Thiemann (Univ. Freiburg) Programmieren in Java JAVA 14 / 18

Ausführung von While RunVisitor 1 public class RunVisitor 2 implements StmtVisitor { 3 4 public final Map<String,Integer> state; 5 private final IExprVisitor eval; 6 7 public RunVisitor( 8 Map<String,Integer> state) { 9 this.state = state; 10 this.eval = new Eval(state); 11 } 12 13 public void visitassign(assign s) { 14 int value = s.exp.accept(eval); 15 state.put(s.var, value); 16 } 1 public void visitif(if s) { 2 if (s.condition.accept(eval)!= 0) { 3 s.truebranch.accept(this); 4 } else { 5 s.falsebranch.accept(this); 6 } 7 } 8 public void visitsequence(sequence s) { 9 for(istmt stmt : s.stmts) { 10 stmt.accept(this); 11 } 12 } 13 public void visitwhile(while s) { 14 while( s.condition.accept(eval)!= 0) { 15 s.body.accept(this); 16 } 17 } 18 } Peter Thiemann (Univ. Freiburg) Programmieren in Java JAVA 15 / 18

Testen des Interpreters

Testen Testen des Interpreters Mittels JUnit Testfällen Für jeden Testfall muss zunächst eine Belegung der Variablen, also eine Map, generiert werden und damit ein RunVisitor instanziert werden: 1 Map<String,Integer> state = new HashMap<String,Integer>(); 2 RunVisitor r = new RunVisitor(state); Anstatt diese Anweisungen in jedem Testfall zu wiederholen, kann eine Before-Methode geschrieben werden. Dafür müssen die Werte in Instanzvariable der Testklasse verlagert werden. Peter Thiemann (Univ. Freiburg) Programmieren in Java JAVA 17 / 18

Testen Before-Methode 1 public class RunVisitorTest { 2 private Map<String, Integer> state; 3 private RunVisitor r; 4 @Before public void setup() { 5 state = new HashMap<String,Integer>(); 6 r = new RunVisitor(state); 7 } 8 @Test public void test() { 9 IStmt ass1 = new Assign( x, cnst(1)); 10 ass1.accept(r); 11 assertequals(state.get( x ), new Integer(1)); 12 } 13 } Vor jedem Testfall mit Annotation @Test wird eine neue RunVisitorTest Instanz erzeugt werden die Methoden mit Annotation @Before ausgeführt Peter Thiemann (Univ. Freiburg) Programmieren in Java JAVA 18 / 18