Embedding Languages
    without Breaking Tools
Lukas Renggli, Tudor Gîrba, Oscar Nierstrasz




              CHOOSE
                       Swiss Group for
                       Object-Oriented
                       Systems and Environments
Marco Zanoli, cc-by-sa, 2.5, www.wikipedia.de, 2006
Marco Zanoli, cc-by-sa, 2.5, www.wikipedia.de, 2006
Marco Zanoli, cc-by-sa, 2.5, www.wikipedia.de, 2006
§
§
    §

            Marco Zanoli, cc-by-sa, 2.5, www.wikipedia.de, 2006
Language Engineering
Multiple Context
Dependent Languages
Homogeneous
Data Abstraction
Homogeneous
Tool Integration
Existing
Host Language
Context Specific Languages
with Homogeneous Tool Integration
x=1        x=2

y=1   Package Name   (2, 1)



y=2      (1, 2)      (2, 2)
aBuilder row grow.
aBuilder row fill.

aBuilder column grow.
aBuilder column fill.

aBuilder x: 1 y: 1 add: (LabelShape new
	  text: [ :each | each name ];
	  borderColor: #black;
	  borderWidth: 1;
	  yourself).
aBuilder x: 1 y: 2 w: 2 h: 1 add: (RectangleShape new
	  borderColor: #black;
	  borderWidth: 1;                                x=1        x=2
	  width: 200;                          y=1   Package Name   (2, 1)
	  height: 100;
	  yourself)
                                        y=2       (1, 2)     (2, 2)
row = grow.
row = fill.

column = grow.
column = fill.

(1 , 1) = label
	    	    text: [ :each | each name ];
	    	    borderColor: #black;
	    	    borderWidth: 1.

(1 , 2) - (2 , 1) = rectangle
	    	    borderColor: #black;
	    	    borderWidth: 1;                          x=1        x=2
	    	    width: 200;                    y=1   Package Name   (2, 1)
	    	    height: 100.

                                         y=2      (1, 2)      (2, 2)
AST Transformation
➊ Pidgin
syntax ‧ vocabulary ‧ semantics
row = grow.
row = fill.

column = grow.
column = fill.

(1 , 1) = label
	    	    text: [ :each | each name ];
	    	    borderColor: #black;
	    	    borderWidth: 1.

(1 , 2) - (2 , 1) = rectangle
	    	    borderColor: #black;
	    	    borderWidth: 1;                          x=1        x=2
	    	    width: 200;                    y=1   Package Name   (2, 1)
	    	    height: 100.

                                         y=2      (1, 2)      (2, 2)
shape {
	   cols: #grow, #fill;
	   rows: #grow, #fill;
}
label {
	   position: 1 , 1;
	   text: [ :each | each name ];
	   borderColor: #black;
	   borderWidth: 1;
}
rectangle {
	   position: 1 , 2;
	   colspan: 2;
	   borderColor: #black;
                                             x=1        x=2
	   borderWidth: 1;
	   width: 200;                    y=1   Package Name   (2, 1)

	   height: 100;
}                                  y=2      (1, 2)      (2, 2)
Custom Parser
AST Transformation
➋ Creole
syntax ‧ vocabulary ‧ semantics
shape {
	   cols: #grow, #fill;
	   rows: #grow, #fill;
}
label {
	   position: 1 , 1;
	   text: [ :each | each name ];
	   borderColor: #black;
	   borderWidth: 1;
}
rectangle {
	   position: 1 , 2;
	   colspan: 2;
	   borderColor: #black;
                                             x=1        x=2
	   borderWidth: 1;
	   width: 200;                    y=1   Package Name   (2, 1)

	   height: 100;
}                                  y=2      (1, 2)      (2, 2)
➌ Argot
syntax ‧ vocabulary ‧ semantics
Transactional Memory

Object Relationships
How does
Helvetia work?
Rules




         <parse>                   <transform>              <attribute>                <bytecode>




Source                 Smalltalk                 Semantic                 Bytecode                  Executable
Code                    Parser                   Analysis                 Generation                  Code

         Traditional Smalltalk Compiler
Rules




         <parse>                   <transform>              <attribute>                <bytecode>




Source                 Smalltalk                 Semantic                 Bytecode                  Executable
Code                    Parser                   Analysis                 Generation                  Code

         Traditional Smalltalk Compiler
Rules




         <parse>                   <transform>              <attribute>                <bytecode>




Source                 Smalltalk                 Semantic                 Bytecode                  Executable
Code                    Parser                   Analysis                 Generation                  Code

         Traditional Smalltalk Compiler
...        <complete>               <highlight>        ...




                                                  Rules




         <parse>                   <transform>              <attribute>                <bytecode>




Source                 Smalltalk                 Semantic                 Bytecode                  Executable
Code                    Parser                   Analysis                 Generation                  Code

         Traditional Smalltalk Compiler
...        <complete>               <highlight>        ...




         Creole path
                                                  Rules
         Pidgin path

         Argot path




         <parse>                   <transform>              <attribute>                <bytecode>




Source                 Smalltalk                 Semantic                 Bytecode                  Executable
Code                    Parser                   Analysis                 Generation                  Code

         Traditional Smalltalk Compiler
Rule Types

‣ Conditional Rule
  Reflection
‣ Source Rule
  Parser, Regex
‣ AST Rule
  Tree Matcher
Rule Actions



‣ Transformations
‣ Code blocks
‣ Call other rules
<complete>               <highlight>        ...




                                                  Rules




         <parse>                   <transform>              <attribute>                <bytecode>




Source                 Smalltalk                 Semantic                 Bytecode                  Executable
Code                    Parser                   Analysis                 Generation                  Code

         Traditional Smalltalk Compiler
IV + VII = XI
Assignments and Swapping   Positional Arguments

Automaton                  Quasiquoting and Unquoting

Asynchronous Calls         Regular Expression

Brainfuck                  Roman Numbers

Functional Language        SQL

Grammar Definition          Schematic Tables

Mondrian                   String Interpolation

Object Relationships       Transactional Memory

Pattern Matching           Tuple Spaces

                                 [http://scg.unibe.ch/research/helvetia/examples]
Existing Host Language
Multiple Context
Dependent Languages
Homogeneous
Data Abstraction
Homogeneous
Tool Integration
http://scg.unibe.ch/research/helvetia
Rules
Marco Zanoli, cc-by-sa, 2.5, www.wikipedia.de, 2006
Marco Zanoli, cc-by-sa, 2.5, www.wikipedia.de, 2006
Language
                                               *
                                                               Change


     Language                                  *              Language
       Box                                                     Concern
                             *

                                               *              Language
                                                               Scope


L. Renggli, M. Denker, O. Nierstrasz. Language Boxes: Bending the Host Language with Modular Language
   Changes. In SLE 2009, Denver, Colorado, October 5-6, 2009, LNCS 5969 p. 274—293, Springer, 2009.
http://scg.unibe.ch/research/helvetia

Embedding Languages Without Breaking Tools

  • 1.
    Embedding Languages without Breaking Tools Lukas Renggli, Tudor Gîrba, Oscar Nierstrasz CHOOSE Swiss Group for Object-Oriented Systems and Environments
  • 2.
    Marco Zanoli, cc-by-sa,2.5, www.wikipedia.de, 2006
  • 3.
    Marco Zanoli, cc-by-sa,2.5, www.wikipedia.de, 2006
  • 4.
    Marco Zanoli, cc-by-sa,2.5, www.wikipedia.de, 2006
  • 5.
    § § § Marco Zanoli, cc-by-sa, 2.5, www.wikipedia.de, 2006
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
    Context Specific Languages withHomogeneous Tool Integration
  • 12.
    x=1 x=2 y=1 Package Name (2, 1) y=2 (1, 2) (2, 2)
  • 13.
    aBuilder row grow. aBuilderrow fill. aBuilder column grow. aBuilder column fill. aBuilder x: 1 y: 1 add: (LabelShape new text: [ :each | each name ]; borderColor: #black; borderWidth: 1; yourself). aBuilder x: 1 y: 2 w: 2 h: 1 add: (RectangleShape new borderColor: #black; borderWidth: 1; x=1 x=2 width: 200; y=1 Package Name (2, 1) height: 100; yourself) y=2 (1, 2) (2, 2)
  • 14.
    row = grow. row= fill. column = grow. column = fill. (1 , 1) = label text: [ :each | each name ]; borderColor: #black; borderWidth: 1. (1 , 2) - (2 , 1) = rectangle borderColor: #black; borderWidth: 1; x=1 x=2 width: 200; y=1 Package Name (2, 1) height: 100. y=2 (1, 2) (2, 2)
  • 15.
  • 16.
    ➊ Pidgin syntax ‧vocabulary ‧ semantics
  • 17.
    row = grow. row= fill. column = grow. column = fill. (1 , 1) = label text: [ :each | each name ]; borderColor: #black; borderWidth: 1. (1 , 2) - (2 , 1) = rectangle borderColor: #black; borderWidth: 1; x=1 x=2 width: 200; y=1 Package Name (2, 1) height: 100. y=2 (1, 2) (2, 2)
  • 18.
    shape { cols: #grow, #fill; rows: #grow, #fill; } label { position: 1 , 1; text: [ :each | each name ]; borderColor: #black; borderWidth: 1; } rectangle { position: 1 , 2; colspan: 2; borderColor: #black; x=1 x=2 borderWidth: 1; width: 200; y=1 Package Name (2, 1) height: 100; } y=2 (1, 2) (2, 2)
  • 19.
  • 20.
    ➋ Creole syntax ‧vocabulary ‧ semantics
  • 21.
    shape { cols: #grow, #fill; rows: #grow, #fill; } label { position: 1 , 1; text: [ :each | each name ]; borderColor: #black; borderWidth: 1; } rectangle { position: 1 , 2; colspan: 2; borderColor: #black; x=1 x=2 borderWidth: 1; width: 200; y=1 Package Name (2, 1) height: 100; } y=2 (1, 2) (2, 2)
  • 22.
    ➌ Argot syntax ‧vocabulary ‧ semantics
  • 23.
  • 24.
  • 25.
    Rules <parse> <transform> <attribute> <bytecode> Source Smalltalk Semantic Bytecode Executable Code Parser Analysis Generation Code Traditional Smalltalk Compiler
  • 26.
    Rules <parse> <transform> <attribute> <bytecode> Source Smalltalk Semantic Bytecode Executable Code Parser Analysis Generation Code Traditional Smalltalk Compiler
  • 27.
    Rules <parse> <transform> <attribute> <bytecode> Source Smalltalk Semantic Bytecode Executable Code Parser Analysis Generation Code Traditional Smalltalk Compiler
  • 28.
    ... <complete> <highlight> ... Rules <parse> <transform> <attribute> <bytecode> Source Smalltalk Semantic Bytecode Executable Code Parser Analysis Generation Code Traditional Smalltalk Compiler
  • 29.
    ... <complete> <highlight> ... Creole path Rules Pidgin path Argot path <parse> <transform> <attribute> <bytecode> Source Smalltalk Semantic Bytecode Executable Code Parser Analysis Generation Code Traditional Smalltalk Compiler
  • 30.
    Rule Types ‣ ConditionalRule Reflection ‣ Source Rule Parser, Regex ‣ AST Rule Tree Matcher
  • 31.
    Rule Actions ‣ Transformations ‣Code blocks ‣ Call other rules
  • 32.
    <complete> <highlight> ... Rules <parse> <transform> <attribute> <bytecode> Source Smalltalk Semantic Bytecode Executable Code Parser Analysis Generation Code Traditional Smalltalk Compiler
  • 33.
  • 34.
    Assignments and Swapping Positional Arguments Automaton Quasiquoting and Unquoting Asynchronous Calls Regular Expression Brainfuck Roman Numbers Functional Language SQL Grammar Definition Schematic Tables Mondrian String Interpolation Object Relationships Transactional Memory Pattern Matching Tuple Spaces [http://scg.unibe.ch/research/helvetia/examples]
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
    Marco Zanoli, cc-by-sa,2.5, www.wikipedia.de, 2006
  • 42.
    Marco Zanoli, cc-by-sa,2.5, www.wikipedia.de, 2006
  • 43.
    Language * Change Language * Language Box Concern * * Language Scope L. Renggli, M. Denker, O. Nierstrasz. Language Boxes: Bending the Host Language with Modular Language Changes. In SLE 2009, Denver, Colorado, October 5-6, 2009, LNCS 5969 p. 274—293, Springer, 2009.
  • 45.