30. Parser-Generatoren

Ähnliche Dokumente
45. Werkzeuge zur Programmüberführung (Codegenerierung und Round-Trip Engineering) 45.1 Codegenerierung. Literatur. CASE-Code-Generatoren

Praktikum Softwareanalyse und -transformation

Vorlesung Programmieren

JavaCC Rainer Schmidberger

Rainer Stropek cubido. Baumschule Expression Trees in C#, CLR und DLR

Compilerbau für die Common Language Run-Time

Software Entwicklung 1. Fallstudie: Arithmetische Ausdrücke. Rekursive Klassen. Überblick. Annette Bieniusa / Arnd Poetzsch-Heffter

Übersetzergenerierung mit lex und yacc

34. Werkzeuge zur Programmüberführung (Codegenerierung und Round-Trip Engineering)

32. Werkzeuge zur Visualisierung

Definition Compiler. Bekannte Compiler

Lexikalische Programmanalyse der Scanner

Einführung Compilergenerierung Bewertung Referenzen. SableCC. Benjamin Daeumlich

Es gibt keinen Algorithmus zum Schreiben eines Programms bzw. Algorithmus.

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

ANTLR und Eclipse-Xtext zwei ll Kumpane

Software-Engineering im Sommersemester 2014

Programmieren in Java

Übungs- und Praktikumsaufgaben zur Systemprogrammierung Dipl.-Ing. H. Büchter (Lehrbeauftragter) FH-Dortmund WS 2001/2002 / SS 2002

Praktikum Compilerbau Sitzung 4 Abstrakter Syntaxbaum

Compilerbau. Einführung in Bison

Aufgabe11. Methode test1. import java.util.hashmap; import java.util.arraylist; public class Aufgabe11 {

II.4.5 Generische Datentypen - 1 -

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2017/18. Vorbereitende Aufgaben

Syntaxanalyse. Parsergeneratoren. Kurzform für: Was ist das? GOLD Parser. Beispiele. G.O.L.D. Grammatiken. Funktionsweise

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2016/17. Vorbereitende Aufgaben

Interpreter - Gliederung

Test-Klausuraufgaben Softwaretechnik Fachbereich BW, für WINFO

Selbststudium OOP7 & ALG2 Auftrag

7. Syntax: Grammatiken, EBNF

Definition von LR(k)-Grammatiken

Übung zu Grundlagen des Übersetzerbaus

CS1005 Objektorientierte Programmierung Bachelor of Science (Informatik)

Programmiersprachen und Übersetzer

Programmieren in Java -Eingangstest-

5. Syntaxanalyse und der Parser-Generator yacc. 5.5 Aufsteigende Analyse. Absteigende Analyse versus aufsteigende Analyse. 5.5 Aufsteigende Analyse

11. Rekursion. - Wiederholung von Anweisungen: durch Iteration und Rekursion - Anwendungsfälle der Rekursion

Klausur: Java (Liste P)

Definition von domänenspezifischen Sprachen mit Xtext: Einführung

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

Übungsstunde 11. Einführung in die Programmierung

9 Compilerbau-Werkzeuge

Hashmap: Video Erklärung

Grammatiken und ANTLR

Übersetzergenerierung mit lex und yacc

! 1. Rekursive Algorithmen.! 2. Rekursive (dynamische) Datenstrukturen. II.3.2 Rekursive Datenstrukturen - 1 -

Programmieren in Java

Kompilerbau Semantische Aktionen & Abstrakte Syntax. Michael Leuschel

Die Klasse MiniJava ist in der Datei MiniJava.java definiert:

Guile Die Erweiterungssprache des GNU-Projekts

Exkurs: ANONYME KLASSEN. Techniken der Programmentwicklung Prof. Dr. Wolfgang Schramm

Schwerpunkte. Verkettete Listen. Verkettete Listen: 7. Verkettete Strukturen: Listen. Überblick und Grundprinzip. Vergleich: Arrays verkettete Listen

Universität Karlsruhe (TH)

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Prof. Dr. Wolfgang Schramm. Vorlesung. Techniken der Programmentwicklung. Exkurs: Anonyme Klassen

Exceptions - Klausuraufgaben

Inhalt Kapitel 11: Formale Syntax und Semantik

Struktur des MicroJava-Compilers

Programmierung für Mathematik HS11

Programmieren I. Dokumentation mit javadoc Heusch 10.4 Ratz Institut für Angewandte Informatik

Aufgabenblatt 4. Aufgabe 3. Aufgabe 1. Aufgabe 2. Prof. Dr. Th. Letschert Algorithmen und Datenstrukturen

Generische Datenstrukturen

Repetitorium Informatik (Java)

Syntax von Programmiersprachen

Institut für Programmierung und Reaktive Systeme 2. Februar Programmieren I. Übungsklausur

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

Die Programmiersprache C Eine Einführung

Institut für Programmierung und Reaktive Systeme 25. Januar Programmieren I. Übungsklausur

Transkript:

30. Parser-Generatoren Prof. Dr. rer. nat. Uwe Aßmann Institut für Software- und Multimediatechnik Lehrstuhl Softwaretechnologie Fakultät für Informatik TU Dresden http://st.inf.tu-dresden.de Version 11-0.1, 29.12.11 1) Grundlagen 2) Beispiel Taschenrechner SEW, Prof. Uwe Aßmann 1

Literatur Obligatorisch: http://www.antlr.org Zusätzlich: Cocktail www.cocolab.de, die Compiler-Toolbox für die schnellsten Compiler der Welt (kommerziell, Demoversionen erhältlich) Prof. U. Aßmann, SEW 2

Phasen eines Compilers typische Werkzeuge Scanner lex, fl ex Front- Parser antlr yacc, bison End AG-Werkzeug ELI, MAX, MUG, JastAdd, Silver Back-End (Codegenerator) Optimierergener. (Ziel- PAG, Optimix, sprachen- abhängig) Codegeneratorgenert. grgen BEG, cggg Quelldiagramm lexikalische Analyse syntaktische Analyse semantische Analyse Zwischencode Codeoptimierung Codegenerierung der kleinsten syntakt. Einheiten des Quelldiagramms (reguläre Ausdrücke) der Modellsyntax (kontextfreie Grammatiken) Prüfg. auf semantische Fehler (attributierte Grammatiken) interne Darstellg. im aktuellen Zustand (Bäume, Listen, Tabellen) Codeverbesserung (Effi zienz, Laufzeit, Speicher) Endgültige Zuordnung des Codes der Zielsprache Zielprogramm Prof. U. Aßmann, SEW 3

Problem Wie Wie arbeite arbeite ich ich flexibel flexibel mit mit mehreren mehreren Programmiersprachen Programmiersprachen oder oder DSL? DSL? Prof. U. Aßmann, SEW 4

Antwort Technikraum Grammarware In In dem dem ich ich aus aus Grammatiken Grammatiken Parser Parser (Zerteiler) (Zerteiler) generiere generiere und und zusätzlich zusätzlich Prettyprinter Prettyprinter Prof. U. Aßmann, SEW 5

Beispiel EMFText Nutzt Parser-Generator ANTLR zur Generierung von Parsern Parser und Metamodell werden aufeinander abgebildet (mapping), um konkrete auf abstrakte Syntax abzubilden Nutzt schablonengesteuerte Codegenerierung zur Erzeugung von Text und Programmen (siehe später). Prof. U. Aßmann, SEW 6

Beispiel EMFText Nutzt Parser-Generator ANTLR zur Generierung von Parsern Parser und Metamodell werden aufeinander abgebildet (mapping), um konkrete auf abstrakte Syntax abzubilden Nutzt schablonengesteuerte Codegenerierung zur Erzeugung von Text und Programmen (siehe später). Prof. U. Aßmann, SEW 7

ANTLR www.antlr.org In den 90ger Jahren gab es für C viele Parsergeneratoren Cocktail's lalr, ell, lark www.cocolab.de fnc2 flex und bison (gnu) Für Java ist ANTLR populär geworden LL(k) Generierter Parser mit Algorithmus rekursiver Abstieg Etwas gefärbte Seite mit Geschichte http://www.bearcave.com/software/antlr/antlr_expr.html Prof. U. Aßmann, SEW 8

Prof. U. Aßmann, SEW 9

Prof. U. Aßmann, SEW 10

Prof. U. Aßmann, SEW 11

Prof. U. Aßmann, SEW 12

Prof. U. Aßmann, SEW 13

30.2 Ein Taschenrechner SEW, Prof. Uwe Aßmann 14

grammar Expr; @header { package test; import java.util.hashmap; } @lexer::header {package test;} @members { /** Map variable name to Integer object holding value */ HashMap memory = new HashMap(); } prog: stat+ ; stat: expr NEWLINE {System.out.println($expr.value);} ID '=' expr NEWLINE {memory.put($id.text, new Integer($expr.value));} NEWLINE ; expr returns [int value] : e=multexpr {$value = $e.value;} ( '+' e=multexpr {$value += $e.value;} '-' e=multexpr {$value -= $e.value;} )* ; multexpr returns [int value] : e=atom {$value = $e.value;} ('*' e=atom {$value *= $e.value;})* ; atom returns [int value] : INT {$value = Integer.parseInt($INT.text);} ID { Integer v = (Integer)memory.get($ID.text); if ( v!=null ) $value = v.intvalue(); else System.err.println("undefined variable "+$ID.text); } '(' e=expr ')' {$value = $e.value;} ; ID : ('a'..'z' 'A'..'Z')+ ; INT : '0'..'9'+ ; NEWLINE:'\r'? '\n' ; WS : (' ' '\t')+ {skip();} ; Prof. U. Aßmann, SEW 15

Ansteuerung import org.antlr.runtime.*; public class Test { public static void main(string[] args) throws Exception { ANTLRInputStream input = new ANTLRInputStream(System.in); ExprLexer lexer = new ExprLexer(input); CommonTokenStream tokens = new CommonTokenStream(lexer); ExprParser parser = new ExprParser(tokens); parser.prog(); } } Prof. U. Aßmann, SEW 16

Prof. U. Aßmann, SEW 17

Prof. U. Aßmann, SEW 18

Prof. U. Aßmann, SEW 19

Was haben wir gelernt? Parsergeneratoren gehören heute zum Werkzeugsatz jeden Softwareingenieurs Neben Cocktail gibt es freie Initiativen, z.b. ANTLR Prof. U. Aßmann, SEW 20

The End Prof. U. Aßmann, SEW 21