Struktur des MicroJava- Compilers

Ähnliche Dokumente
UE 2: Lexikalische Analyse (Scanner)

Einstieg in die Informatik mit Java

Programmieren in Java

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Einführung in die Programmierung I. 2.0 Einfache Java Programme. Thomas R. Gross. Department Informatik ETH Zürich

Lexikalische Programmanalyse der Scanner

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Arbeitsblätter für die Lehrveranstaltung OOP JAVA 1

1. Grundzüge der Objektorientierung 2. Methoden, Unterprogramme und Parameter 3. Datenabstraktion 4. Konstruktoren 5. Vordefinierte Klassen

RO-Tutorien 3 / 6 / 12

Sprachkonstrukte Verzweigungen und Array-Strukturen

Programmieren I + II Regeln der Code-Formatierung

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

RO-Tutorien 15 und 16

Java Einführung Methoden. Kapitel 6

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

1. Grundzüge der Objektorientierung 2. Methoden, Unterprogramme und Parameter 3. Datenabstraktion 4. Konstruktoren 5. Vordefinierte Klassen

Welche Informatik-Kenntnisse bringen Sie mit?

C# - Einführung in die Programmiersprache Methoden. Leibniz Universität IT Services

Lex und Yacc Lt. Worf, scannen Sie das Schiff! 300dpi, Sir?

Vorlesung Objektorientierte Programmierung Klausur

Heap vs. Stack vs. statisch. 6 Speicherorganisation. Beispiel Statische Variablen. Statische Variablen

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

Einstieg in die Informatik mit Java

Konstruktor/Destruktor

Anweisungen zur Ablaufsteuerung

Programmieren I + II Regeln der Code-Formatierung

Heap vs. Stack vs. statisch. 6 Speicherorganisation. Beispiel Statische Variablen. Statische Variablen

C++ - Einführung in die Programmiersprache Fehler abfangen. Leibniz Universität IT Services Anja Aue

AuD-Tafelübung T-B5b

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

5 Grundlagen der Java-Syntax

C++ Notnagel. Ziel, Inhalt. Programmieren in C++

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 1 - Variablen und Kontrollstrukturen

Informatik-Seminar Thema: Monaden (Kapitel 10)

Programmieren in Java

Algorithmen zur Datenanalyse in C++

Grundlagen der Informatik 8. Funktionen I

5. Tutorium zu Programmieren

Variablen. int Flugzeug. float. I write code Hund. String. long. Borchers: Programmierung für Alle (Java), WS 06/07 Kapitel

1. Erste Schritte 2. Einfache Datentypen 3. Anweisungen und Kontrollstrukturen 4. Verifikation 5. Reihungen (Arrays)

Programmier-Befehle - Woche 10

Tutorium Rechnerorganisation

Einführung in den Einsatz von Objekt-Orientierung mit C++ I

Programmieren in Java

Erste Schritte der Programmierung in C

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

Übersetzerbau / Compiler Construction

Java I Vorlesung 6 Referenz-Datentypen

Interaktive Programme mit Scanner

Schachtelung der 2. Variante (Bedingungs-Kaskade): if (B1) A1 else if (B2) A2 else if (B3) A3 else if (B4) A4 else A

Programmierpraktikum Java Entdecken Merkblatt 2

Java Einführung Vererbung und Polymorphie. Kapitel 13

Vererbung I. Kfz Eigenschaften und Methoden der Klasse Kfz Lkw. Pkw. Eigenschaften und Methoden der Klasse Kfz

12 Abstrakte Klassen, finale Klassen und Interfaces

Theorie zu Übung 8 Implementierung in Java

Algorithmen und Datenstrukturen

Programmieren in C / C++ Grundlagen C 4

Programmiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften

S. d. I.: Programieren in C Folie 4-1. im Gegensatz zu Pascal gibt es in C kein Schlüsselwort "then"

Vorkurs C++ Programmierung

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

THE GO PROGRAMMING LANGUAGE. Michael Karnutsch & Marko Sulejic

Die Programmiersprache C99: Zusammenfassung

Objektorientierung (OO)

Grundlagen der Programmierung Prof. H. Mössenböck. 14. Schrittweise Verfeinerung

javascript Coding-Guidelines 2. Ausgabe Februar 2015 Der Guideline beschreibt den verwendeten Coding-Stil von javascript als eigene Richtline.

Klassen und Objekte. Einführung in Java. Folie 1 von Mai Ivo Kronenberg

Arrays. Einleitung. Deklarieren einer Array Variablen

Java: Eine kurze Einführung an Beispielen

Kapitel Was ist ein Header? Was ist ein Body? Header: public Account(String newowner, int newpin)

Methoden und Wrapperklassen

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

Lexikalische Analyse, Tokenizer, Scanner

Primitive Datentypen, Eingaben, Kontrollstrukturen und Methodendeklaration

Programmiersprachen Einführung in C. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm

2. Programmierung in C

Verwendung Vereinbarung Wert einer Funktion Aufruf einer Funktion Parameter Rekursion. Programmieren in C

Übung zur Vorlesung Wissenschaftliches Rechnen Sommersemester 2012 Auffrischung zur Programmierung in C++, 1. Teil

Tag 4 Repetitorium Informatik (Java)

6 Speicherorganisation

Einführung in C. EDV1-04C-Einführung 1

Tag 4 Repetitorium Informatik (Java)

1 Aufgaben 1.1 Umgebungsvariable setzen: CLASSPATH

Transkript:

Struktur des MicroJava- Compilers Compiler Parser.mj Scanner Code- Generator.obj Symboltabelle UE zu Übersetzerbau Lexikalische Analyse 1

Grammatik ohne Scanner Expr = Term { "+" Term }. Term = Factor { "*" Factor }. Factor = ident. erlaube Kommentare an beliebiger Stelle Expr = {Comment} [Comment] Term {Comment} [Comment] { "+"{Comment} [Comment] Term {Comment} [Comment] }. Term = {Comment} [Comment] Factor {Comment} [Comment] { "*"{Comment} [Comment] Factor {Comment} [Comment] }. Factor = {Comment} [Comment] ident {Comment} [Comment].... erlaube Whitespace an beliebiger Stelle UE zu Übersetzerbau Lexikalische Analyse 2

Struktur des MicroJava- Compilers Package ssw.mj Token.java: Terminalsymbole Hilfsklassen für Fehlermeldungen, Virtuelle Machine Package ssw.mj.symtab Obj.java, Scope.java: Verwaltung der Symboltabelle Package ssw.mj.codegen Code-Generator Package ssw.mj.impl ScannerImpl.java: Übung 2 ParserImpl.java: Übung 3 und alle weiteren Übungen TabImpl.java: Übung 4 StructImpl.java: Übung 5 CodeImpl.java: Übung 5-6 LabelImpl.java: Übung 6 UE zu Übersetzerbau Lexikalische Analyse 3

Struktur des MicroJava- Compilers Strukturelle Unterschiede zur Vorlesung Implementierung im ssw.mj.impl Package Objekt-Felder: Vereinfacht JUnit-Testfälle Enumerationen: Typsicherheit bei Konstanten Diese Struktur muss beibehalten werden Keine zusätzlichen Klassen nötig Klassen außerhalb des ssw.mj.impl Package gleich lassen UE zu Übersetzerbau Lexikalische Analyse 4

Fehlermeldungen Klasse Errors sammelt alle Fehlermeldungen void error(int line, int col, Message msg, Object... msgparams); Fehlermeldungen sind in Errors.Message definiert Der error-methode wird die Meldung übergeben Manche Fehlermeldungen benötigen Parameter Zusätzliche Parameter der error-methode Meldungstexte sind in der Enumeration definiert Hilfsmethode im Scanner (später auch im Parser) void error(token t, Message msg, Object... msgparams); Übernimmt die Fehlerposition aus dem angegebenen Token (Muss später in ParserImpl überschrieben werden) UE zu Übersetzerbau Lexikalische Analyse 5

Klasse Scanner + Token class Scanner { public Scanner(Reader r); public Token next(); } class Token { Kind kind; // z.b. Kind.ident, Kind.assign, int line; // Zeilenposition int col; // Spaltenposition int val; // numerischer Wert für number und charconst String str; // Name von ident } Scanner wird (ab der 3. Übung) vom Parser aufgerufen Jeder Aufruf von next() liefert das nächste Token Scanner wartet, bis er aufgerufen wird UE zu Übersetzerbau Lexikalische Analyse 6

Aufgaben des Scanners Erkennen von Terminalsymbolen Überlesen unbedeutender Zeichen (Blanks, Tabs, Zeilenumbrüche,...) Überlesen von Kommentaren Erkennen von: Namen Schlüsselwörtern Zahlen Zeichenkonstanten Bilden von Terminalklassen (ident, number,...) int, char, null, chr, ord, len sind keine Schlüsselwörter, nur vordeklarierte Namen ( Erkennung als ident) Erkennen des Dateiendes Melden lexikalischer Fehler (Zahlenformat, ungültige Zeichen,...) Einstellen der Token-Attribute (Symbolart, Position, Wert,...) UE zu Übersetzerbau Lexikalische Analyse 7

ScannerImpl.next() (1) public Token next() { while (Character.isWhitespace(ch)) { nextch(); // skip white space } Token t = new Token(none, line, col); switch (ch) { //----- identifier or keyword case 'a': case 'b':... case 'z': case 'A': case 'B':... case 'Z': readname(t); // distinguish between identifier and keyword break; //----- number case '0':... case '9': readnumber(t); break;... UE zu Übersetzerbau Lexikalische Analyse 8

ScannerImpl.next() (2)... //----- simple tokens case ';': t.kind = semicolon; nextch(); break; case EOF: t.kind = eof; /* no nextch() */ break; //----- compound tokens case '=': nextch(); if (ch == '=') { t.kind = eql; nextch(); } else { t.kind = assign; } break; case '/': nextch(); if (ch == '*') { skipcomment(t); t = next(); /* recursion */ } else {... } break; default: error(t, INVALID_CHAR, ch); nextch(); break; } return t; } UE zu Übersetzerbau Lexikalische Analyse 9

Hilfsmethoden void nextch() Liest das nächste Eingabezeichen und speichert es im Feld ch oder EOF beim Dateiende Erkennt Zeilenumbrüche: LF und CR LF Führt die Position in den Feldern line und col mit void readname(token t) Liest einen Bezeichner Erkennt Schlüsselwörter (HashMap String Token.Kind) void readnumber(token t) Liest eine Zahl void readcharconst(token t) Liest eine Zeichenkonstante void skipcomment(token t) Überliest geschachtelte Kommentare ch enthält anschließend das Zeichen nach dem Kommentar UE zu Übersetzerbau Lexikalische Analyse 10

Zahlen-Konstanten Gültige Zahlen Positive Zahlen: 123 Ein Token: number Negative Zahlen: -123 Zwei Tokens: minus und number Buchstaben: 123abc Zwei Tokens: number und ident Identifier: abc123 Ein Token: ident Fehlerhafte Zahlen Zu große Zahlen: 2147483648 error(t, BIG_NUM, str); Spezialfall: -2147483648 error(t, BIG_NUM, str); UE zu Übersetzerbau Lexikalische Analyse 11

Zeichen-Konstanten Gültige Zeichen-Konstanten Zeichen: 'A' Escape-Sequenzen: '\r', '\n', '\'' und '\\' Fehlerhafte Zeichen-Konstanten Kein Zeichen: '' error(t, EMPTY_CHARCONST); Fehlendes Ende: 'A error(t, MISSING_QUOTE); Escape-Sequenzen: '\A' error(t, UNDEFINED_ESCAPE, ch); Zeilenumbruch: ' error(t, ILLEGAL_LINE_END); UE zu Übersetzerbau Lexikalische Analyse 12

Kommentare Nur Block-Kommentare Scanner ignoriert alles zwischen /* und */ Kommentare können auch geschachtelt sein /* a /* b */ c */ Methode skipcomment() muss daher die Schachtelungstiefe mitführen Fehlerhafte Kommentare Fehlendes Ende: /* ohne */ error(t, EOF_IN_COMMENT); UE zu Übersetzerbau Lexikalische Analyse 13

MicroJava eine einzige Quellcode-Datei Hauptmethode void main(): kein Rückgabewert, keine Parameter Typen: int (4 Byte), char (1 Byte, ASCII) globale und lokale Variablen, globale Konstanten eindimensionale Arrays Records (sehen aus wie innere Klassen) Parameterübergabe call-by-value (Objektparameter sind aber Referenzen) Ein-/Ausgabe mit Hilfe der read- und print-anweisung eingebaute Methoden ord(), chr(), len() und Konstante null keine Packages oder Importanweisungen kein GC oder delete (Objekte bleiben übrig who cares ) nur while-schleife keine Ausnahmebehandlung (exception handling) keine Zeiger UE zu Übersetzerbau Lexikalische Analyse 14

UE 2: Lexikalische Analyse (Scanner) Angabe svn://ssw.jku.at/2016w/ub/k<matrnr>/trunk/ svn://ssw.jku.at/2016w/ub/k<matrnr>/tests/ Klassengerüst JUnit-Testfälle Abgabe Mittwoch, 26.10.2016, 18:00 svn://ssw.jku.at/2016w/ub/k<matrnr>/branches/ue2 UE zu Übersetzerbau Lexikalische Analyse 15