Domain-Specific. Languages. Martin Fowler. AAddison-Wesley. Sydney Tokyo. With Rebecca Parsons

Similar documents
PYTHON. p ykos vtawynivis. Second eciitiovl. CO Ve, WESLEY J. CHUN

Using Scala for building DSL s

Programming in Python 3

Index. Comma-separated values (CSV), 30 Conditional expression, 16 Continuous integration (CI), 34 35, 41 Conway s Law, 75 CurrencyPair class,

Framework Design Guidelines

Quality Code. Software Testing Principles, Practices, and Patterns. Stephen Vance. AAddison-Wesley

The Unified Modeling Language User Guide

JAVASCRIPT FOR PROGRAMMERS

ECLIPSE MODELING PROJECT

SQL Queries. for. Mere Mortals. Third Edition. A Hands-On Guide to Data Manipulation in SQL. John L. Viescas Michael J. Hernandez

Developer's HTML5. Cookbook. AAddison-Wesley. Chuck Hudson. Tom Leadbetter. Upper Saddle River, NJ Boston Indianapolis San Francisco

The Power of Events. An Introduction to Complex Event Processing in Distributed Enterprise Systems. David Luckham

CJT^jL rafting Cm ompiler

MariaDB Crash Course. A Addison-Wesley. Ben Forta. Upper Saddle River, NJ Boston. Indianapolis. Singapore Mexico City. Cape Town Sydney.

World Wide Web PROGRAMMING THE PEARSON EIGHTH EDITION. University of Colorado at Colorado Springs

building dsl s in static & dynamic languages

\ Smart Client 0" Deploymentwith v^ ClickOnce

Rails AntiPatterns. Chad Pytel. Best Practice Ruby on Rails Refactoring. Tammer Saleh. AAddison-Wesley

Digital System Design with SystemVerilog

Database Concepts. David M. Kroenke UNIVERSITATSBIBLIOTHEK HANNOVER

Fit for Developing Software

ony Gaddis Haywood Community College STARTING OUT WITH PEARSON Amsterdam Cape Town Dubai London Madrid Milan Munich Paris Montreal Toronto

Refactoring HTML. Improving the Design of Existing Web Applications. Elliotte Rusty Harold. TT rvaddison-wesley

Visual C# Tony Gaddis. Haywood Community College STARTING OUT WITH. Piyali Sengupta. Third Edition. Global Edition contributions by.

ECLIPSE RICH CLIENT PLATFORM

Programming Wireless Devices with the Java 2 Platform, Micro Edition

Practical DSL Design. Groovy Sydney Meetup May 4th, Peter Bell CEO/CTO SystemsForge

Essentials. Oracle Solaris Cluster. Tim Read. Upper Saddle River, NJ Boston Indianapolis San Francisco. Capetown Sydney Tokyo Singapore Mexico City

IPHONE FOR PROGRAMMERS: AN APP-DRIVEN APPROACH

Prelude to Programming

Programming Guide. Aaftab Munshi Dan Ginsburg Dave Shreiner. TT r^addison-wesley

LATEX. Leslie Lamport. Digital Equipment Corporation. Illustrations by Duane Bibby. v ADDISON-WESLEY

CLASSIC DATA STRUCTURES IN JAVA

DB2 SQL Tuning Tips for z/os Developers

Application Programming

Domain-Specific Languages Language Workbenches

Programming. Principles and Practice Using C++ Bjarne Stroustrup. / Addison-Wesley. Second Edition

PROBLEM SOLVING USING JAVA WITH DATA STRUCTURES. A Multimedia Approach. Mark Guzdial and Barbara Ericson PEARSON. College of Computing

Programming. In Ada JOHN BARNES TT ADDISON-WESLEY

Core Java Volume Ii Advanced Features 10th Edition

Programming in Scala Second Edition

Syntax and Grammars 1 / 21

The Java Tutorial. A Short Course on the Basics. Raymond Gallardo. Sowmya Kannan. AAddison-Wesley. Sharon Biocca Zakhour.

Cloud Computing and SOA Convergence in Your Enterprise

Real-Time Systems and Programming Languages

Elements Of Programming Interviews In Python The Insiders Guide

THE AVR MICROCONTROLLER AND EMBEDDED SYSTEMS. Using Assembly and С

ECE251 Midterm practice questions, Fall 2010

Information Modeling and Relational Databases

Secure Coding in C and C++

Systems:;-'./'--'.; r. Ramez Elmasri Department of Computer Science and Engineering The University of Texas at Arlington

An Introduction to Search Engines and Web Navigation

A Document Preparation System. User's Guide and Reference Manual. Leslie Lamport

Essentials of Database Management

Elements Of Programming Interviews In Java The Insiders Guide

DATABASE SYSTEM CONCEPTS

flex is not a bad tool to use for doing modest text transformations and for programs that collect statistics on input.

Functional Parsing A Multi-Lingual Killer- Application

Opengl Programming On Mac Os X Architecture Performance

Effective Stl 50 Specific Ways To Improve Your Use Of The... Effective Stl: 50 Specific Ways To Improve The Use Of The...

Program generation for schema-based, typed data access

Advanced Topics in Software Engineering (02265) Ekkart Kindler

HAWK Language Reference Manual

Modern C++ Design. Generic Programming and Design Patterns Applied. Andrei Alexandrescu. AAddison-Wesley

Better Extensibility through Modular Syntax. Robert Grimm New York University

ABAP DSL Workbench SAP TechED 2016

Building Compilers with Phoenix

CSE 413 Languages & Implementation. Hal Perkins Winter 2019 Structs, Implementing Languages (credits: Dan Grossman, CSE 341)

JavaScript: Sort of a Big Deal,

DATA ABSTRACTION AND PROBLEM SOLVING WITH JAVA

The Designer's Guide to VHDL Second Edition

Eclipse Building Commercial-Quality Plug-ins Second Edition

Semantic Analysis. Lecture 9. February 7, 2018

Search Engines Information Retrieval in Practice

Scala, Your Next Programming Language

PeopleSoft PeopleTools Tips & Techniques

FUNDAMENTALS OF. Database S wctpmc. Shamkant B. Navathe College of Computing Georgia Institute of Technology. Addison-Wesley

Project 2: Scheme Lexer and Parser

1 Lexical Considerations

Trustworthy Compilers

Language Extension and Composition with Language Workbenches

FrontPage 98: The Complete Reference

Transition from EBNF to Xtext

Grammars and Parsing. Paul Klint. Grammars and Parsing

Chapter 3: Describing Syntax and Semantics. Introduction Formal methods of describing syntax (BNF)

Lecture 4: Syntax Specification

Theoretical Part. Chapter one:- - What are the Phases of compiler? Answer:

Logic and its Applications

Writing a Simple DSL Compiler with Delphi. Primož Gabrijelčič / primoz.gabrijelcic.org

Index. caps method, 180 Character(s) base, 161 classes

COP 3402 Systems Software Syntax Analysis (Parser)

CMPE 152 Compiler Design

Lexical Analysis. Lexical analysis is the first phase of compilation: The file is converted from ASCII to tokens. It must be fast!

DSL vs. Library API Shootout

Technical aspects of VTL to SQL translation Prepared by Regional Statistical Office in Olsztyn, Poland

Programming Modeling Two Worlds? Programmierung Modellierung Zwei Welten? und. and. Markus Voelter Independent/itemis

Business Driven Data Communications

CMSC 330: Organization of Programming Languages

Network Programming With Go Essential Skills For Using And Securing Networks

Parser Tools: lex and yacc-style Parsing

Transcription:

Domain-Specific Languages Martin Fowler With Rebecca Parsons AAddison-Wesley Upper Saddle River, NJ Boston Indianapolis San Francisco New York Toronto Montreal London Munich Paris Madrid Sydney Tokyo Singapore Mexico City

Preface xix Part 1: Narratives 1 Chapter 1: An Introductory Example 3 Gothic Security 3 Miss Grant's Controller 4 The State Machine Model 5 Programming Miss Grant's Controller 9 Languages and Semantic Model 16 Using Code Generation 19 Using Language Workbenches 22 Visualization 24 Chapter 2: Using Domain-Specific Languages 27 Defining Domain-Specific Languages 27 Boundaries ofdsls 29 Fragmentary and Stand-alone DSLs 32 Why Use a DSL? 33 Improving Development Productivity 33 Communication with Domain Experts 34 Change in Execution Context 35 Alternative Computational Model 36 Problems with DSLs 36 Language Cacophony 37 Cost ofbuilding Ghetto Language Blinkered Abstraction 39 37 38

Wider Language Processing 39 DSL Lifecycle 40 What Makes a Good DSL Design? 42 Chapter 3: Implementing DSLs 43 Architecture of DSL Processing 43 The Workings of a Parser 47 Grammars, Syntax, and Semantics 49 Parsing Data 50 Macros -52 Testing DSLs 53 Testing the Semantic Model 53 Testing the Parser 57 Testing the Scripts 61 Handling Errors 62 Migrating DSLs 64 Chapter 4: Implementing an Internal DSL 67 - Fluent and Command-Query APIs 68 The Need for a Parsing Layer 71 Using Functions 72 Literal Collections 77 Using Grammars to Choose Internal Elements 79 Closures 80 Parse Tree Manipulation 82 Annotation 84 Literal Extension 85 Reducing the Syntactic Noise 85 Dynamic Reception 86 Providing Some Type Checking 87 Chapter 5: Implementing an External DSL 89 Syntactic Analysis Strategy 89 Output Production Strategy 92 Parsing Concepts 94 Separated hexing 94 Grammars and Languages 95 Regular, Context-Free, and Context-Sensitive Grammars 96 Top-Down and Bottom-Up Parsing 98

Mixing-in Another Language 100 XML DSLs 101 Chapter 6: Choosing between Internal and External DSLs 105 Learning Curve 105 Cost of Building 106 Programmer Familiarity 107 Communication with Domain Experts 108 Mixing In the Host Language 108 Strong Expressiveness Boundary 109 Runtime Configuration 110 Sliding into Generality Composing DSLs Summing Up HO Ill Ill Chapter 7: Alternative Computational Models 113 A Few Alternative Models 116 Decision Table 116 Production Rule System 117 State Machine 118 Dependency Network 119 Choosing a Model 120 Chapter 8: Code Generation 121 Choosing What to Generate 122 How to Generate 124 Mixing Generated and Handwritten Code 126 Generating Readable Code 127 Preparse Code Generation 128 Further Reading 128 Chapter 9: Language Workbenches 129 Elements of Language Workbenches 130 Schema Definition Languages and Meta-Models 131 Source and Projectional Editing 136 Multiple Representations 138 Illustrative Programming 138 Tools Tour 140 Language Workbenches and CASE tools 141 Should You Use a Language Workbench? 142

Part II: Common Topics 145 Chapter 10: A Zoo of DSLs 147 Graphviz 147 JMock 149 CSS 150 Hibernate Query Language (HQL) 151 XAML 152 FIT 155 Make et al 156 Chapter 11: Semantic Model 159 How It Works 159 When to Use It 162 The Introductory Example (Java) 163 Chapter 12: Symbol Table 165 How It Works J 66 Statically Typed Symbols 167 When to Use It 168 Further Reading 168 Dependency Network in an External DSL (Java and ANTLR) 168 Using Symbolic Keys in an Internal DSL (Ruby) 170 Using Enums for Statically Typed Symbols (Java) 172 Chapter 13: Context Variable 175 How It Works 175 When to Use It 176 Reading an INI File (C#) 176 Chapter 14: Construction Builder 179 How It Works 179 When to Use It 180 Building Simple Flight Data (C#) 180 Chapter 15: Macro 183 How It Works 184 Textual Macros 184 Syntactic Macros 188 When to Use It 192

Chapter 16: Notification 193 How It Works 194 When to Use It 194 A Very Simple Notification (C#) 194 Parsing Notification (Java) 195 Part III: External DSL Topics 199 Chapter 17: Delimiter-Directed Translation 201 How It Works 201 When to Use It 204 Frequent Customer Points (C#) 205 Semantic Model 205 The Parser 207 Parsing Nonautonomous Statements with Miss Grant's Controller (Java) 211 Chapter 18: Syntax-Directed Translation 219 How It Works 220 The Lexer 221 Syntactic Analyzer 223 Output Production 226 Semantic Predicates 226 When to Use It 227 Further Reading 227 Chapter 19: BNF 229 How It Works 229 Multiplicity Symbols (Kleene Operators) 231 Some Other Useful Operators 232 Parsing Expression Grammars - 233 Converting EBNF to Basic BNF 234 Code Actions 236 When to Use It 238 Chapter 20: Regex Table Lexer (by Rebecca Parsons) 239 How It Works 240 When to Use It 241 Lexing Miss Grant's Controller (Java) 241

Chapter 21: Recursive Descent Parser (by Rebecca Parsons) 245 How It Works 246 When to Use It 249 Further Reading 249 Recursive Descent and Miss Grant's Controller (Java) 250 Chapter 22: Parser Combinator (by Rebecca Parsons) 255 How It Works 256 Dealing with the Actions 259 Functional Style of Combinators 260 When to Use It 261 Parser Combinators and Miss Grant's Controller (Java) 261 Chapter 23: Parser Generator 269 How It Works 269 Embedding Actions 270 When to Use It 272 Hello World (Java and ANTLR) 272 Writing the Basic Grammar 272 Building the Syntactic Analyzer 274 Adding Code Actions to the Grammar 276 Using Generation Gap 278 Chapter 24: Tree Construction 281 How It Works 281 When to Use It 284 Using ANTLR's Tree Construction Syntax (Java and ANTLR) 284 Tokenizing 285 Parsing 286 Populating the Semantic Model 288 Tree Construction Using Code Actions (Java and ANTLR) 292 Chapter 25: Embedded Translation 299 How It Works 299 When to Use It 300 Miss Grant's Controller (Java and ANTLR) 300 Chapter 26: Embedded Interpretation 305 How It Works 305 When to Use It 306 A Calculator (ANTLR and Java) 306

Chapter 27: Foreign Code 309 How It Works 309 When to Use It 311 Embedding Dynamic Code (ANTLR, Java, and Javascript) 311 Semantic Model 312 Parser 315 Chapter 28: Alternative Tokenization 319 How It Works 319 Quoting 320 Lexical State 322 Token Type Mutation 324 Ignoring Token Types 325 When to Use It 326 Chapter 29: Nested Operator Expression 327 How It Works 327 Using Bottom-Up Parsers 328 Top-Down Parsers 329 When to Use It 331 Chapter 30: Newline Separators 333 How It Works 333 When to Use It 335 Chapter 31: External DSL Miscellany 337 Syntactic Indentation 337 Modular Grammars 339 Part IV: Internal DSL Topics 341 Chapter 32: Expression Builder 343 How It Works 344 When to Use It 344 A Fluent Calendar with and without a Builder (Java) 345 Using Multiple Builders for the Calendar (Java) 348 Chapter 33: Function Sequence 351 How It Works 351 When to Use It 352 Simple Computer Configuration (Java) 352

Chapter 34: Nested Function 357 How It Works 357 When to Use It 359 The Simple Computer Configuration Example (Java) 360 Handling Multiple Different Arguments with Tokens (C#) 361 Using Subtype Tokens for IDE Support (Java) 363 Using Object Initializers (C#) 365 Recurring Events (C#) 366 Semantic Model 366 The DSL 369 Chapter 35: Method Chaining 373 How It Works 373 Builders or Values 375 Finishing Problem 375 Hierarchic Structure 376 Progressive Interfaces 377 When to Use It 377 The Simple Computer Configuration Example (Java) 378 Chaining with Properties (C#) 381 Progressive Interfaces (C#) 382 Chapter 36: Object Scoping 385 How It Works 386 When to Use It 386 Security Codes (C#) 387 Semantic Model 387 DSL 390 Using Instance Evaluation (Ruby) 392 Using an Instance Initializer (Java) 394 Chapter 37: Closure 397 How It Works 397 When to Use It 402 Chapter 38: Nested Closure 403 How It Works 403 When to Use It 405 Wrapping a Function Sequence in a Nested Closure (Ruby) 405 Simple C# Example (C#) 408 Using Method Chaining (Ruby) 409

Function Sequence with Explicit Closure Arguments (Ruby) 411 Using Instance Evaluation (Ruby) 412 Chapter 39: Literal List 417 How It Works 417 When to Use It 417 Chapter 40: Literal Map 419 How It Works 419 When to Use It 420 The Computer Configuration Using Lists and Maps (Ruby) 420 Evolving to Greenspun Form (Ruby) 422 Chapter 41: Dynamic Reception 427 How It Works 428 When to Use It 429 Promotion Points Using Parsed Method Names (Ruby) 430 Model 431 Builder 433 Promotion Points Using Chaining (Ruby) 434 Model 435 Builder 435 Removing Quoting in the Secret Panel Controller (JRuby) 438 Chapter 42: Annotation 445 How It Works 446 Defining an Annotation 446 Processing Annotations 447 When to Use It 449 Custom Syntax with Runtime Processing (Java) 449 Using a Class Method (Ruby) 451 Dynamic Code Generation (Ruby)...452 Chapter 43: Parse Tree Manipulation 455 How It Works 455 When to Use It 456 Generating IMAP Queries from C# Conditions (C#) 457 Semantic Model 458 Building from C# 460 Stepping Back 465

Chapter 44: Class Symbol Table 467 How It Works 468 When to Use It 469 Statically Typed Class Symbol Table (Java) 469 Chapter 45: Textual Polishing 477 How It Works 477 When to Use It 478 Polished Discount Rules (Ruby) ; 478 Chapter 46: Literal Extension 481 How It Works 481 When to Use It 482 Recipe Ingredients (C#) 483 Part V: Alternative Computational Models 485 Chapter 47: Adaptive Model 487 How It Works 488 Incorporating Imperative Code into an Adaptive Model 489 Tools 491 When to Use It 492 Chapter 48: Decision Table 495 How It Works 495 When to Use It 497 Calculating the Fee for an Order (C#) 497 Model 497 The. Parser 502 Chapter 49: Dependency Network 505 How It Works 506 When to Use It 508 Analyzing Potions (C#) 508 Semantic Model 509 The Parser 511 Chapter 50: Production Rule System 513 How It Works 514 Chaining Contradictory Inferences 515 Patterns in Rule Structure 516 When to Use It 517 515

Validations for club membership (C#) 517 Model 518 Parser 519 Evolving the DSL 520 Eligibility Rules: extending the club membership (C#) 521 The Model 523 The Parser 525 Chapter 51: State Machine 527 How It Works 527 When to Use It 529 Secret Panel Controller (Java) 530 Part VI: Code Generation 531 Chapter 52: Transformer Generation 533 How It Works 533 When to Use It 535 Secret Panel Controller (Java generating C) 535 Chapter 53: Templated Generation 539 How It Works 539 When to Use It 541 Generating the Secret Panel State Machine with Nested Conditionals (Velocity and Java generating C) 541 Chapter 54: Embedment Helper 547 How It Works 548 When to Use It 549 Secret Panel States (Java and ANTLR) 549 Should a Helper Generate HTML? (Java and Velocity) 552 Chapter 55: Model-Aware Generation 555 How It Works 556 When to Use It 556 Secret Panel State Machine (C) 557 Loading the State Machine Dynamically (C) 564 Chapter 56: Model Ignorant Generation How It Works When to Use It 567 567 568 Secret Panel State Machine as Nested Conditionals (C) 568

Chapter 57: Generation Gap 571 How It Works 571 When to Use It 573 Generating Classes from a Data Schema (Java and a Little Ruby)...573 Bibliography 579 Index 581