Domain Specific Languages in der Praxis! Inhalt. Laborsprache Businessprache Regelsprache Transaktionsaufzeichnungsprache Translators

Ähnliche Dokumente
Implementierung eines LR-Parser-Generators mit syntaktischen Prädikaten

30. Parser-Generatoren

DSLs mit Xtext entwerfen , A. Arnold

Definitionen/Vorarbeit zum Thema Java

Vorlesung Programmieren

Praktikum Softwareanalyse und -transformation

Definition von LR(k)-Grammatiken

Graphische Entwicklungsumgebung für eine Echtzeitprogrammiersprache

Wer ich bin Christoph Knauf

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

Einführung. (Compiler) Prof. Dr. Oliver Braun. Letzte Änderung: :49. Einführung 1/26

Codegenerierung mit Xtend. 21. Januar 2015

Java: Kapitel 1. Überblick. Programmentwicklung WS 2008/2009. Holger Röder Holger Röder

Userinterfaces für Computer Theorem Prover, Machbarkeits-Studie im ISAC-Projekt

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

Testen von sicherheitskritischer Embedded Software mit frei verfügbaren Tools. - ein Erfahrungsbericht

Der Parsergenerator BTRACC2

Compiler. Einführung. Prof. Dr. Oliver Braun. Fakultät für Informatik und Mathematik Hochschule München. Letzte Änderung:

Compiler: Einführung

Speech Recognition Grammar Compilation in Grammatikal Framework. von Michael Heber

Übung 5. Implementierung einer Datenbank. Prof. Dr. Andreas Schmietendorf 1. Übung 5

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

Rapid Java wie mit Forms

Software Entwicklung 1

Vorgetragen von. Sanaz Mostowfi Anna Polovets Mandy Neumann

MDSD Einführung und Überblick

Modellgetriebene Softwareentwicklung: Zusammenfassung und Ausblick. 7. Februar 2013

(Building) Flexible Functional Programming Interfaces. Von Amos Treiber

Compilerbau für die Common Language Run-Time

Earley Parser. Flutura Mestani

Guile Die Erweiterungssprache des GNU-Projekts

Syntax von Programmiersprachen

Lexikalische Programmanalyse der Scanner

Compilerbau Syntaxanalyse 68. LR(1)-Syntaxanalyse

Anforderungen gezielter umsetzen, Optimieren, Transparenz schaffen

Ergänzungen zur Theoretischen Informatik. Compilerbau mit ANTLR. Literatur Das Standardwerk zum Compilerbau ist [1].

Inhalt Kapitel 11: Formale Syntax und Semantik

Language Workbench. Aktuelle Themen der Softwaretechnologie. Vortrag von: Arthur Rehm Steven Cardoso. Betreut von: Prof. Dr.

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

Continuous Delivery mit Orcas

Interpreter - Gliederung

Modellgetriebene Entwicklung eingebetteter Systeme mit Eclipse

Sourcecode generieren? Ja, aber wie?

Alfred V. Aho Monica S. Lam Ravi Sethi Jeffrey D. Ullman. Compiler. informatik. Prinzipien, Techniken und Werkzeuge. 2., aktualisierte Auflage

Comparing Software Factories and Software Product Lines

FitNesse. Testen von Software. Lehrstuhl Datenstrukturen und Softwarezuverlässigkeit WS 15/16. Jonas Ahlers

MDRE die nächste Generation des Requirements Engineerings

Einführung in die Modelltransformation mit Xtend

Modellgetriebene Softwareentwicklung

Aufbau eines dynamischen ETL Frameworks auf Basis eines PL/SQL Codegenerators

Automatisierte Entwickler VMs works on my machine zählt nicht mehr ;-)

Tool-Chain. Übung. Eclipse, SVN, Ant, Cobertura, Metrics Labor "Software Engineering Experiment" Sebastian Meyer und Kai Stapel

Compilerbau für die Common Language Run-Time

Generatives Programmieren

Einführung in die Programmiertechnik

Syntaxanalyse Ausgangspunkt und Ziel

Stratego/XT und ASF+SDF Meta-Environment. Paul Weder Seminar Transformationen Datum:

UNIVERSITÄT LEIPZIG. Mainframe Internet Integration SS2013. Java Remote Method Invocation Teil 3 RMI over IIOP

Kapitel 4. Einführung in den Scannergenerator Flex. Einführung in den Scannergenerator Flex Wintersemester 2008/09 1 / 9

Java Scripting. Java Erweiterungen mittels Groovy- oder JavaScript Sprachen. Prof. Dr. Nikolaus Wulff

JavaCC Rainer Schmidberger

Kapitel 02. Java was, wann, warum, wieso. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz

Deterministische PDAs

Opentext Business Intelligence. edocs DM. Brava! Exceed TurboX Remotedesktop. Roadshow April, 2018 Helmut Reimann

Symphony und das Hierarchische Reflexion Modell

Übersetzergenerierung mit lex und yacc

Software-Engineering im Sommersemester 2014

SIG Development. 100%ige Generierung von Formsmasken mit Designer 6i. Gabriele Friedel. Dr. Peter Koch

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

Software-Notationen. K. Bürtlmair. Masterstudiengang ITS //2010/11 Fachhochschule Salzburg. 3. Oktober 2013

Von der Grammatik zum AST

Shift Reduce Parser (Bottom up Parser) Historie Grundbegriffe Tabellengesteuerter LR(1) Parser Konstruktion der Elementmengen Tabellenkonstruktion

Integration von Model-Driven Development und formaler Verfikation in den Softwareentwicklungsprozess

Einführung Compilergenerierung Bewertung Referenzen. SableCC. Benjamin Daeumlich

Ein kleiner Blick auf die generische Programmierung

So schreiben Sie ein Parser-Programm

v i r t u a l 7 G m b H Consulting- und Softwarepartner Unternehmergeführt 1996 gegründet 85 Mitarbeiter 1 Team aus Spezialisten W E R W I R S I N D

Eclipse Modeling Framework Modellgetriebene Softwareentwicklung Prof. Andreas Schmidt

Transformations. Die API des Oracle Datamodeler. Dr. Gudrun Pabst. Trivadis GmbH Lehrer-Wirth-Straße München.

Build Management Tool

Domainspezifische Sprachen

Modellgetriebene Entwicklungsprozesse in der Praxis - eine Bestandsaufnahme. Tillmann Schall, anaptecs GmbH

Kapitel 14. Objekt-relationales Mapping (ORM) mit Hibernate bzw. Java Persistance API (JPA) Prof. Dr. Wolfgang Weber Vorlesung Datenbanken

Parsing SystemVerilog 2012

Modellgetriebene Entwicklung einer Eclipse RAP-Anwendung unter Verwendung des Eclipse Modeling Frameworks

yacc - eine Einführung

VU Software Paradigmen / SS 2014

Software Engineering I

Einführung in das Graphical Modeling Framework. 13. November 2012

Ein Erfahrungsbericht beim Einsatz von generierenden Ansätzen im Vergleich zu generischen Lösungen

Praktikum Funktionale Programmierung Organisation und Überblick

Aktueller Stand Entwicklung eines Parser- und Instrumentierungssystems für den strukturorientierten Programmtest

8. April 2013 Vorlagenmanagement effizient umgesetzt

Mathematik Seminar WS 2003: Simulation und Bildanalyse mit Java. Software-Architektur basierend auf dem Plug-in-Konzept

Modellgetriebene Softwareentwicklung: Zusammenfassung und Ausblick. 11. Februar 2015

Compilerbau (1 KU) SS 2011

Faktor-IPS. Modellgetriebene Softwareentwicklung mit Faktor-IPS. Faktor Zehn AG. Seite 1

Definition von domänenspezifischen Sprachen mit Xtext: Der abstrakte Syntaxbaum in EMF

Notationen für Transformationsregeln

Programmieren II. Java im Vergleich zu anderen Sprachen. Einführung: GUI. Einführung: Grafische Benutzeroberflächen. Dr.

Transkript:

Domain Specific Languages in der Praxis! Andres Koch, Object Engineering dipl. El. Ing. HTL, M. Math, akoch@objeng.ch Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 1 www.object-engineering.ch Inhalt Vorstellung Sprachen und deren Background Was ist eine DSL Bestandteile zur DSL-Übersetzung Parsertypen (bottom up, top down) Parser-Generatoren und -Arbeitsweise DSL-Design-Vorgehen Praxisbeispiele Laborsprache Businessprache Regelsprache Transaktionsaufzeichnungsprache Translators Zusammenfassung, Fragen und Diskussion Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 2 www.object-engineering.ch

Software Engineering nach Mass Seit 1995 Spezialist für Modernisierung, Integration und Ablösung von Alt-Software und Alt-Systemen Tätig in verschiedenen Branchen (Telco, Finanz, Versicherungen, Industrie) und vernetzt mit Partnern. Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 3 www.object-engineering.ch Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 4 www.object-engineering.ch

Sprachen und deren Background Sprachen mächtiger als jedes GUI-basierte Tool Unzählige Kombinationen von Elementen möglich Dem Menschen eher vertraut (Sprache in Schrift), der Entwickler-Guilde sowieso Maschinell verarbeitbar Generierbar Sprachen bilden virtuelle Maschinen oberhalb des Betriebssystems (vgl. JVM) Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 5 www.object-engineering.ch Was ist eine DSL Eine domänenspezifische Sprache (engl. domain-specific language, DSL) ist eine formale Sprache, die speziell für ein bestimmtes Problemfeld (die Domäne) entworfen und implementiert wird. Beim Entwurf einer DSL wird man bemüht sein, einen hohen Grad an Problemspezifität zu erreichen: die Sprache soll alle Probleme der Domäne darstellen können und nichts darstellen können, was außerhalb der Domäne liegt. Dadurch ist sie durch Domänenspezialisten ohne besonderes Zusatzwissen bedienbar [Ref. wikipedia.org] Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 6 www.object-engineering.ch

Beispiele Business-Kalkulationssprache, als Excel-Ersatz: Summe Budget pro Spalte in % von Summe VJBudget pro Spalte Experimentdefinitions-Sprache für Laborversuche Ansteuerung von Messinstrumenten, Sensoren, Heizungen u.a. In einem sequentiell- und parallel-laufenden Teil Regelsprache als Ersatz für Legacy-Sprache Sprache für die Plausibilisierung von Eingaben, da C++ zum Zeitpunkt nicht für die Regelprogrammierer geeignet gewesen wäre. Aufgezeichnete Transaktionssprache Sprache, die von einem Service bei echten Transaktionen aufgezeichnet und später geändert und zu Testzwecken (Regression) wiedergegeben werden kann. Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 7 www.object-engineering.ch Bestandteile zur DSL- Übersetzung (traditionell) DSL Lexer Parser Symboltabelle Codegenerator Code Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 8 www.object-engineering.ch

Bestandteile zur DSL-Übersetzung DSL-Source DSL-Parser AST Symbol Table Generators Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 9 www.object-engineering.ch Parsertypen (bottom up, top down) Kontextfreie Sprachen typisch in der IT Klassen von Parser: Top down Syntax-Analyse LL(k) Bottom-up: LR, SLR, LALR(1) (z.b yacc) Top-Down-Vorgehen ist typisch für handgeschriebene Parser Bottom-up-Vorgehen ist typisch für generierte Parser Bei DSLs kann man kontextfreie Sprachen so entwerfen, dass sie keine Mehrdeutigkeiten haben. LL(1) top down 1 look ahead LR(1) bottom up 1 look ahead Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 10 www.object-engineering.ch

Grammatik einer DSL Term Nonterminals Logexpr ::= Factor:v1 {: RESULT = v1; :} Term:v1 ADDOP Factor:v2 {: RESULT = v1.add(v2); :} Term:v1 SUBOP Factor:v2 {: RESULT = v1.sub(v2); :} ; ::= Term:v1 {: RESULT = v1; :} Logexpr:v1 EQUOP Term:v2 {: RESULT = v1.eq(v2); :}... Terminals Codegeneration (gehört nicht zum Parser) Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 11 www.object-engineering.ch Interpreter vs. Translator Interpreter können auf die optimale Verarbeitung einer DSL abgestimmt werden. Bei Interpretern verwendet man in der Regel einen Zwischencode (z.b. Byte-Code) der optimal durch eine Stackmaschine verarbeitet werden kann. Translators sind dort gefragt, wo bereits eine Laufzeit- Umgebung vorhanden ist (z.b. JVM). Translators sind auch zur Umwandlung von Sprachdialekten geeignet. Translator vs Interpreter, ist eine Design-Entscheid, der aufgrund der Anforderungen zu fällen ist. Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 12 www.object-engineering.ch

Parser-Generatoren und Arbeitsweise Parsergeneratoren generieren aus der Grammatik-Definition (typ. EBNF) den Code für den Parser. Sowohl Top-Down-Parser wie auch Bottom-Up-Parser Top-Down-Parser sind Programme, welche wie von Hand geschriebene Parser aussehen: If (nexttolken() == IF_TOK) { parseif(); }... Bottom-up Parser generieren State-Event-Tabellen für eine Stackmaschine. Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 13 www.object-engineering.ch Parser-Generatoren und Arbeitsweise (bottom-up) short yytable[] = { 37, 174, 67, 38, 130, 39, 67, 67, 67, 67, 67, 3, 67, 6, 120, 190, 146, 275, 86, 6, 59, 277, 129, 118, 67, 79, 80, 123, 101, 1, 284, 69, 7, 257, 4, 69, 69, 69, 69, 69, 102, 69, 87, 88, 89, 90, 91, 92, 157, 162, 143, 144, 163, 69, 37, 101, 68, 38, 67, 39, 68, 68, 68, 68, 68, 175, 68, 235, 176, 10, 206, 134, 135, 84, 224, 85, 258, 11, 68, 93, 94, 83, 131, 132, 133, 187, 81, 69, 12, 158, 54, 82, 56, 59, 60, 146, 244, 245, 246, 247, 248, 249, 159, 61, 62, 63, 64, 65, 37, 95, 167, 38, 68, 39, 168, 153, 66, 100, 170, 96, 172, 98, 205, 18, 255, 137, 138, 139, 140, 141, 142, 67, 68, 69, 70, 71, 72, 73, 74, 278, 75,... usw... Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 14 www.object-engineering.ch

Parser-Generatoren und Arbeitsweise (top-down) if ( ((LA41_0>=NOT_OP && LA41_0<=NOT_OP2) (LA41_0>=PLUS_OP && LA41_0<=MINUS_OP) LA41_0==IDENT LA41_0==SINGLE_QUOTED_STRING (LA41_0>=DECIM AL_CONSTANT && LA41_0<=DOUBLE_QUOTED_STRING) LA41_0==73) ) { alt41=1; } switch (alt41) { case 1 : // Q:\\proj\\OE\\PLI2J/grammar/PLI2J.g:0:0: expression { pushfollow(follow_expression_in_attachparameter2852); expression258=expression(); state._fsp--; if (state.failed) return retval; if ( state.backtracking==0 ) adaptor.addchild(root_0, expression258.gettree()); } } break; Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 15 www.object-engineering.ch Populäre Parser-Generatoren Oldies: yacc, lex (Unix) C, C++ (bottom-up) Bison (Linux) C, C++ (gleiche Grammatik wie yacc) Newbies: JavaCup (bottom-up) Java JavaCC (Java Compiler Compiler) Java Super-Newbies: ANTLR (antlr.org) Top-down, mit DFAs für Look-ahead Lexer integriert Tree-Syntax String-Templates Java und andere Parser-Sprachen Eclipse Plugin Xtext 1.0 (eclipse.org/xtext) Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 16 www.object-engineering.ch

Design-Vorgehen Genauen Zweck bestimmen (Input, Output) Grammatik entwerfen und verifizieren Infrastruktur (Parser-Gen, Lexer, Symbol-Table) Grammatik übersetzen und code-freien Parser mit obiger Infrastruktur erstellen. Grammatik mit vielen Beispielen verifizieren (in min. Infrastruktur). Rest des Übersetzers/Interpreters implementieren/testen: Codegenerator AST-Visitors/Generatoren User-Interface Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 17 www.object-engineering.ch Praxisbeispiele Laborsprache Businesssprache Regelsprache Transaktionsaufzeichnungsprache Sprach-Translator Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 18 www.object-engineering.ch

Laborsprache Laborsystem für Prozess-Experimente im Kleinen Bestehende Hardware (Messinstrumente, Heizungen, Sensoren, Ventile, Rührwerke etc.) Gefordert: Laborsprache für den Laboranten, der den Prozess programmieren kann. Paralell laufender Teil (Loop, Thread) Sequentieller-Teil, der den Prozessablauf bestimmt Realisierung: yacc C QNX (von yacc generierter C-Code darauf portiert) Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 19 www.object-engineering.ch Businesssprache PC-Software-Pallette benötigte eine Kalkulation-Sprache, welche individuelle Bedürfnisse abdecken konnte Sprache wurde neu entworfen Vorbild APL (A Programming Language) aber les- und schreibbar. Einfache Tabellen-Verarbeitung Deutsche Syntax, intuitiv formulierbar Gescheitert am mangelnden Intellekt des Benutzers, denn auch wenn Sprache einfach formuliert werden kann, benötigt es Analyse. Realisierung: yacc C, sowohl MSDOS + UNIX, Interpreter Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 20 www.object-engineering.ch

Businesssprache Beispiel Dollar.Kurs=1.32 Offerte.VS1= erz 5 3 aus 896.320 0 0 0 0 OffV1(;2)= 560.280 0 0 0 0 OffV1(;3)= 7.0 0 0 0 0 OffV1:titel= "VS1 License Pricing" OffV1(2;) = OffV1(1;) * DolK OffV1(3;) = OffV1(2;) + 6.5% OffV1(4;) = OffV1(2;) * 25% * 70% OffV1(5;) = OffV1(2;) * 25% * 30% OffV1:oben="k$-Preis Lief" "ksfr." "ksfr.+mwst" "Prov. DU" "Prov. KSE" OffV1:links = "Company Lic" "58-Package" "add. Unit" VS1.Preis.per.Unit = OffV1(3;) / spiegel 90 58 1 KSE.Add.Marge = 10% VS1.Preis.Liste = Erz 5 3 aus 20 0 0 0 0 VS1PL(;2) = 13.6 0 0 0 0 VS1PL(;3) = 10.0 0 0 0 0 VS1PL:links= "1-10" "11-50" "51-100" VS1PL:oben="K-$-EndUser" "$-Dist" "sfr-eu" "sfr-eu+mwst" "EU-KSE" VS1PL(3;) = VS1PL(1;) * DolK VS1PL(4;) = VS1PL(1;) * DolK + 6.5% VS1PL(5;) = VS1PL(1;) * DolK + KSEAM + 6.5% Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 21 www.object-engineering.ch Regelsprache Regelsprache als Ersatz für Legacy-Sprache Sprache für die Plausibilisierung von Eingaben C++ wäre zum Zeitpunkt nicht für die Regelprogrammierer geeignet gewesen. Letzte zwei Programmierer, welche die alte Software verstanden haben, haben umgeschrieben. Start mit Grundsprach-Set, während Umschreibphase wurde nach Bedarf erweitert. Compiler (yacc-basiert) generiert Byte-Code Byte-Code-Interpreter zur Laufzeit in Service integriert Spätere Generierung von Java-Regelklassen Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 22 www.object-engineering.ch

Regelsprache Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 23 www.object-engineering.ch Regelsprache Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 24 www.object-engineering.ch

Regelsprache Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 25 www.object-engineering.ch Regelsprache (Entwicklungsumgebung) Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 26 www.object-engineering.ch

Transaktions- Aufzeichnungsprache Aufzeichnungsformat für Regressions-Tests Client-Transaktionen werden direkt vom Service aufgezeichnet und in lesbarer Form zurückgeliefert Interpreter kann die Aufzeichnung entweder abspielen, oder man kann sie vor der Ausführung bearbeiten und mit externen Daten ergänzen Realisation: JavaCup Interpreter (in Java) Logging Data-Feeding Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 27 www.object-engineering.ch Transaktions- Aufzeichnungsprache (Bsp) start("test"); start("goiz8"); logln("efkzxx00="+a2100.efkzxx00); A2100.EFKZXX00="01"; A2100.ERNXXX00 = "2341111"; A2100.EIZXXX00 = "41"; ** 19.04.2002;20:37:14 commit; stop("goiz8"); ** 19.04.2002;20:37:21 ** logln("a2111.enrfmt00=" + A2111.ENRFMT00); logln("a2116.enrfmt00=" + A2116.ERNXXX00); #NR=1+#NR; $TIME=stop("TEST"); #Sum=0 + $TIME + #Sum; #Avg=(0+#Sum)/(#NR); reportln("time of Run#"+#NR+"="+ $TIME +" ms Avg=" + #Avg); close; Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 28 www.object-engineering.ch

Sprach-Translator PL/1-Source Manual or Automatic Adjustment PLI2JParser AST Repository Crossreference Code statistics References Java Code (EJB) Java Code DB-Access Additional Products Generators Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 29 www.object-engineering.ch Sprach-Translator nicht wirklich eine DSL Portierung alter Programmiersprachen auf neue Plattformen PL/1 Umfangreiche Sprache Parser-Generatoren kommen an den Anschlag Generierter Code: Lexer: 14 500 Parser: 37 600 Zeilen Grammatik 2 200 Zeilen Code-Generierung über AST Realisation ANTLR (Top-Down) Java Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 30 www.object-engineering.ch

Fazit - DSL Sprachen sind oft mächtiger als andere Mechanismen DSL muss nicht so umfangreich wie eine Programmiersprache sein. Erstellung eines Parsers mit Parser-Generatoren heute ein Kinderspiel Design gehört dazu und darf nicht vernachlässigt werden Einsatzgebiete sind sehr zahlreich Viel Spass beim Experimentieren! Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 31 www.object-engineering.ch Domain Specific Languages in der Praxis Fragen? Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 32 www.object-engineering.ch