SlideShare ist ein Scribd-Unternehmen logo
1 von 75
Downloaden Sie, um offline zu lesen
Grammarware Memes
   Eelco Visser & Guido Wachsmuth
Background
Spoofax Language Workbench
WebDSL Web Programming Language

  define page post(p: Post, title: String) {
    init{ p.update(); }
    title{ output(p.title) }
    bloglayout(p.blog){
      placeholder view { postView(p) }
      postComments(p)
    }
  }

  define ajax postView(p: Post) {
    pageHeader2{ output(p.title) }
    postBodyLayout(p) {
  	   postContent(p)
  	   postExtendedContent(p)
  	   postActions(p)
  	 }
  }
Researchr Bibliography Management System
WebLab Programming Education on the Web
Some Philosophical Considerations
Grammarware vs Modelware?




 GPCE                   MODELS
OOPSLA                   ICMT
Grammarware vs Modelware?




 GPCE                   MODELS
              SLE
OOPSLA                   ICMT
Functional vs Object-Oriented vs
            Logic vs ...
Remember the Programming Language Wars?




    ICFP                     OOPSLA
Remember the Programming Language Wars?




    ICFP         GPCE        OOPSLA
Scala: Object-Oriented or
        Functional?



‘closure’: a purely functional feature?
X-ware is a Memeplex



memeplex: selection of memes from the meme pool
What is Grammarware?
Grammarware is about
  (Parsing) Text

               module users

               imports library

               entity User {
                 email    : String
                 password : String
                 isAdmin : Bool
               }
Grammarware is about
                           Structure
Module(
  "users"
, [ Imports("library")
  , Entity(
      "User"
    , [ Property("email", Type("String"))
      , Property("password", Type("String"))
      , Property("isAdmin", Type("Bool"))
      ]
    )
  ]
)
Grammarware: Text & Structure
Grammarware is about Transformation
Source to Source Transformation
Source to Source Transformation
Transformation & Analysis


  name resolution

    type checking

      desugaring

  code generation
Some Memes from
the Spoofax Memeplex
EnFun: Entities with Functions
 module blog
   entity String {
     function plus(that:String): String
   }
   entity Bool { }
   entity Set<T> {
     function add(x: T)
     function remove(x: T)
     function member(x: T): Bool
   }
   entity Blog {
     posts : Set<Post>
     function newPost(): Post {
       var p : Post := Post.new();
       posts.add(p);
     }
   }
   entity Post {
     title : String
   }
Structure
Signature & Terms


constructors
  Module : ID * List(Definition) -> Module
  Imports : ID -> Definition




         Module(
           "application"
         , [Imports("library"),
            Imports("users"),
            Imports("frontend")]
         )
Entities & Properties

constructors
  Entity : ID * List(Property) -> Definition
  Type   : ID -> Type
  New    : Type -> Exp

constructors
  Property     : ID * Type -> Property
  This         : Exp
  PropAccess   : Exp * ID -> Exp



Module("users"
, [ Imports("library")
  , Entity("User"
    , [ Property("email",    Type("String"))
      , Property("password", Type("String"))
      , Property("isAdmin", Type("Bool"))])])
Constants & Operators & Variables
constructors                           constructors
  String : STRING -> Exp                 Geq    : Exp     * Exp ->   Exp
  Int    : INT -> Exp                    Leq    : Exp     * Exp ->   Exp
  False : Exp                            Gt     : Exp     * Exp ->   Exp
  True   : Exp                           Lt     : Exp     * Exp ->   Exp
                                         Eq     : Exp     * Exp ->   Exp
                                         Mul    : Exp     * Exp ->   Exp
                                         Minus : Exp      * Exp ->   Exp
                                         Plus   : Exp     * Exp ->   Exp
                                         Or     : Exp     * Exp ->   Exp
                                         And    : Exp     * Exp ->   Exp
                                         Not    : Exp     -> Exp


                           constructors
                             VarDecl       :   ID * Type -> Stat
                             VarDeclInit   :   ID * Type * Exp -> Stat
                             Assign        :   Exp * Exp -> Stat
                             Var           :   ID -> Exp
Statements & Functions

constructors
  Exp    : Exp -> Stat
  Block : List(Stat) -> Stat
  Seq    : List(Stat) -> Stat
  While : Exp * List(Stat) -> Stat
  IfElse : Exp * List(Stat) * List(ElseIf) * Option(Else) -> Stat
  Else   : List(Stat) -> Else
  ElseIf : Exp * List(Stat) -> ElseIf


constructors
  FunDef   :   ID * List(Arg) * Type * List(Stat) -> Property
  FunDecl :    ID * List(Arg) * Type -> Property
  Arg      :   ID * Type -> Arg
  Return   :   Exp -> Stat
  MethCall :   Exp * ID * List(Exp) -> Exp
  ThisCall :   ID * List(Exp) -> Exp
Transformation
Transformation by Strategic Rewriting

 rules

   desugar:
     Plus(e1, e2) -> MethCall(e1, "plus", [e2])

   desugar:
     Or(e1, e2) -> MethCall(e1, "or", [e2])

   desugar :
     VarDeclInit(x, t, e) ->
     Seq([VarDecl(x, t),
          Assign(Var(x), e)])

 strategies

   desugar-all = topdown(repeat(desugar))
Return-Lifting Applied



function fact(n: Int): Int {       function fact(n: Int): Int {
                                     var res: Int;
    if(n == 0) {                     if(n == 0) {
      return 1;                        res := 1;
    } else {                         } else {
      return this * fact(n - 1);       res := this * fact(n - 1);
    }                                }
                                     return res;
}                                  }
Return-Lifting Rules

rules

  lift-return-all =
    alltd(lift-return; normalize-all)

  lift-return :
    FunDef(x, arg*, Some(t), stat1*) ->
    FunDef(x, arg*, Some(t), Seq([
      VarDecl(y, t),
      Seq(stat2*),
      Return(Var(y))
    ]))
    where y := <new>;
          stat2* := <alltd(replace-return(|y))> stat1*

  replace-return(|y) :
    Return(e) -> Assign(y, e)
Seq Normalization

strategies

  normalize-all = innermost-L(normalize)

rules // seq lifting

  normalize :
    [Seq(stat1*) | stat2*@[_|_]] -> [Seq([stat1*,stat2*])]

  normalize :
    [stat, Seq(stat*)] -> [Seq([stat | stat*])]

  normalize :
    Block([Seq(stat1*)]) -> Block(stat1*)

  normalize :
    FunDef(x, arg*, t, [Seq(stat*)]) -> FunDef(x, arg*, t, stat*)
Interpretation



     eval
Small Step Operational Semantics



rules // driver

    steps = repeat(step)
	
    step:
      State([Frame(fn, this, slots, cont)|f*], heap) ->
      State(stack', heap')
    where
      cont' := <eval> cont;
      stack' := <update-stack (|...)> [Frame(..., cont')|f*];
      heap' := <update-heap(|...)> heap
Small Step Operational Semantics



eval(|this, slots, heap):
	 Var(x) -> val
	 where val := <lookup> (x, slots)
	
eval(|this, slots, heap):
	 PropAccess(Ptr(p), prop) -> val
	 where
	 	 Object(_, props) 	:= <lookup> (p, heap);
	 	 val	 	 	 	 	 	 := <lookup> (prop, props)
From Text to Structure
Declarative Syntax DeïŹnition




                              Entity("User", [
                                 Property("first", Type("String")),
                                 Property("last", Type("String"))
                              ])



signature
  constructors
    Entity   : ID * List(Property) -> Definition
    Type     : ID                  -> Type
    Property : ID * Type           -> Property
Declarative Syntax DeïŹnition




entity User {                 Entity("User", [
  first : String                 Property("first", Type("String")),
  last   : String                Property("last", Type("String"))
}                             ])



signature
  constructors
    Entity   : ID * List(Property) -> Definition
    Type     : ID                  -> Type
    Property : ID * Type           -> Property
Declarative Syntax DeïŹnition

context-free syntax
  "entity" ID "{" Property* "}" -> Definition {"Entity"}
  ID                            -> Type       {"Type"}
  ID ":" Type                   -> Property   {"Property"}



entity User {                 Entity("User", [
  first : String                 Property("first", Type("String")),
  last   : String                Property("last", Type("String"))
}                             ])



signature
  constructors
    Entity   : ID * List(Property) -> Definition
    Type     : ID                  -> Type
    Property : ID * Type           -> Property
Declarative Syntax DeïŹnition

context-free syntax
  "entity" ID "{" Property* "}" -> Definition {"Entity"}
  ID                            -> Type       {"Type"}
  ID ":" Type                   -> Property   {"Property"}



entity User {                 Entity("User", [
  first : String                 Property("first", Type("String")),
  last   : String                Property("last", Type("String"))
}                             ])



signature
  constructors
    Entity   : ID * List(Property) -> Definition
    Type     : ID                  -> Type
    Property : ID * Type           -> Property
Context-free Syntax
context-free syntax                 constructors
  "true"       -> Exp   {"True"}      True   : Exp
  "false"      -> Exp   {"False"}     False : Exp
  "!" Exp      -> Exp   {"Not"}       Not    : Exp -> Exp
  Exp "&&" Exp -> Exp   {"And"}       And    : Exp * Exp -> Exp
  Exp "||" Exp -> Exp   {"Or"}        Or     : Exp * Exp -> Exp
Lexical Syntax
context-free syntax                 constructors
  "true"       -> Exp   {"True"}      True   : Exp
  "false"      -> Exp   {"False"}     False : Exp
  "!" Exp      -> Exp   {"Not"}       Not    : Exp -> Exp
  Exp "&&" Exp -> Exp   {"And"}       And    : Exp * Exp -> Exp
  Exp "||" Exp -> Exp   {"Or"}        Or     : Exp * Exp -> Exp


lexical syntax                      constructors
  [a-zA-Z][a-zA-Z0-9]* -> ID         : String -> ID
  "-"? [0-9]+          -> INT        : String -> INT
  [ tnr]           -> LAYOUT




           scannerless generalized (LR) parsing
Ambiguity
context-free syntax                        constructors
  "true"       -> Exp   {"True"}             True   : Exp
  "false"      -> Exp   {"False"}            False : Exp
  "!" Exp      -> Exp   {"Not"}              Not    : Exp -> Exp
  Exp "&&" Exp -> Exp   {"And"}              And    : Exp * Exp -> Exp
  Exp "||" Exp -> Exp   {"Or"}               Or     : Exp * Exp -> Exp



          isPublic || isDraft && (author == principal())




amb([
   And(Or(Var("isPublic"), Var("isDraft")),
       Eq(Var("author"), ThisCall("principal", []))),
   Or(Var("isPublic"),
      And(Var("isDraft"), Eq(Var("author"), ThisCall("principal", []))))
])
Disambiguation by Encoding Precedence
context-free syntax                      constructors
  "true"       -> Exp   {"True"}           True   : Exp
  "false"      -> Exp   {"False"}          False : Exp
  "!" Exp      -> Exp   {"Not"}            Not    : Exp -> Exp
  Exp "&&" Exp -> Exp   {"And"}            And    : Exp * Exp -> Exp
  Exp "||" Exp -> Exp   {"Or"}             Or     : Exp * Exp -> Exp




context-free syntax
  "(" Exp ")"    ->   Exp0   {bracket}
  "true"         ->   Exp0   {"True"}
  "false"        ->   Exp0   {"False"}
  Exp0           ->   Exp1
  "!" Exp0       ->   Exp1   {"Not"}
  Exp1           ->   Exp2
  Exp1 "&&" Exp2 ->   Exp2   {"And"}
  Exp2           ->   Exp3
  Exp2 "||" Exp3 ->   Exp3   {"Or"}
Declarative Disambiguation
context-free syntax
  "true"       -> Exp {"True"}
  "false"      -> Exp {"False"}
  "!" Exp      -> Exp {"Not"}
  Exp "&&" Exp -> Exp {"And", left}
  Exp "||" Exp -> Exp {"Or", left}
  "(" Exp ")" -> Exp {bracket}
context-free priorities
  {left: Exp.Not} >
  {left: Exp.Mul} >
  {left: Exp.Plus Exp.Minus} >
  {left: Exp.And} >
  {non-assoc: Exp.Eq Exp.Lt Exp.Gt Exp.Leq Exp.Geq}


isPublic || isDraft && (author == principal())


             Or(Var("isPublic"),
                And(Var("isDraft"),
                    Eq(Var("author"), ThisCall("principal", []))))
Generating Text from Structure
Code Generation by String Concatenation



 to-java:
   Property(x, Type(t)) -> <concat-strings>[
     "private ", t, " ", x, ";nn",
     "public ", t, " get_", x, " {n",
     "    return ", x, ";n",
     "}n",
     "public void set_", x, " (", t, " ", x, ") {n",
     "    this.", x, " = ", x, ";n",
     "}"
   ]
String Interpolation Templates


  to-java:
    Property(x, Type(t)) -> $[
      private [t] [x];

        public [t] get_[x] {
          return [x];
        }

        public void set_[x] ([t] [x]) {
          this.[x] = [x];
        }
    ]
Code Generation by
Model Transformation
Generating Structured Representations


to-java:
  Property(x, Type(t)) -> [
    Field([Private()], Type(t), Var(x)),

      Method([Public()], Type(t), $[get_[x]], [], [
        Return(Var(x))
      ]),

      Method([Public()], None(), $[set_[x]], [Param(Type(t), x)], [
         Assign(FieldAccess(This(), x), Var(x))
      ])
  ]
Concrete Object Syntax


 to-java:
   Property(x, Type(t)) -> |[
    private t x;

        public t get_#x {
            return x;
        }

        public void set_#x (t x) {
            this.x = x;
        }
   ]|
Rewriting with Concrete Object Syntax

  module desugar

  imports Enfun

  strategies

    desugar-all = topdown(repeat(desugar))

  rules
    desugar: |[ !e       ]| -> |[ e.not() ]|
    desugar: |[ e1 && e2 ]| -> |[ e1.and(e2) ]|
    desugar: |[ e1 || e2 ]| -> |[ e1.or(e2) ]|

    desugar: |[ e1 +   e2 ]| -> |[ e1.plus(e2) ]|
    desugar: |[ e1 *   e2 ]| -> |[ e1.times(e2) ]|
    desugar: |[ e1 -   e2 ]| -> |[ e1.minus(e2) ]|
Rewriting with Concrete Object Syntax

lift-return-cs :
  |[ function x(arg*) : t { stat1* } ]| ->
  |[ function x(arg*): t {
       var y : t;
       ( stat2* )
       return y;
     } ]|
  where y := <new>;
        stat2* := <alltd(replace-return(|y))> stat1*




         lift-return :
           FunDef(x, arg*, Some(t), stat1*) ->
           FunDef(x, arg*, Some(t), Seq([
             VarDecl(y, t),
             Seq(stat2*),
             Return(Var(y))
           ]))
           where y := <new>;
                 stat2* := <alltd(replace-return(|y))> stat1*
Pretty-Printing by
Model Transformation
Code Formatting
module users
  entity String { }
  entity User { first : String last : String }




       Module(
         "demo1"
                                                   module users
       , [ Entity("String", None(), None(), [])
         , Entity(                                 entity String   {
             "User"
                                                   }
           , [ Property("first", Type("String"))
             , Property("last", Type("String"))
             ]                                     entity User {
           )                                         first : String
         ]
       )
                                                     last : String
                                                   }
Pretty-Printer SpeciïŹcation


prettyprint-Definition :
  Entity(x, prop*) ->
    [ H([SOpt(HS(), "0")]
       , [ S("entity ")
         , <pp-one-Z(prettyprint-ID)> x
         , S(" {")
         ]
       )
     , <pp-indent(|"2")> [<pp-V-list(prettyprint-Property)> p*]
     , H([SOpt(HS(), "0")], [S("}")]
       )
     ]
Structure Editors
Discoverability
Editors with Syntactic Completion
Completion Templates



completions

  completion template Definition : "entity ID { }" =
    "entity " <ID:ID> " {nt" (cursor) "n}" (blank)

  completion template Type : "ID" =
    <ID:ID>

  completion template Property : "ID : ID " =
    <ID:ID> " : " <ID:Type> (blank)
Syntax Templates: Structure + Layout
                                    context-free syntax
                                      "entity" ID "{" Property* "}" -> Definition {"Entity"}
                                      ID                            -> Type       {"Type"}
                                      ID ":" Type                   -> Property   {"Property"}



templates
                                    signature
                                      constructors
                                        Entity   : ID * List(Property) -> Definition
  Definition.Entity = <                 Type     : ID                  -> Type
                                        Property : ID * Type           -> Property
    entity <ID> {
      <Property*; separator="n">
                                    completions
    }                                 completion template Definition : "entity ID { }" =

  >                                     "entity " <ID:ID> " {nt" (cursor) "n}" (blank)

                                      completion template Type : "ID<>" =
                                        <ID:ID> "<" <:Type> ">"

  Type.Type = <<ID>>                  completion template Property : "ID : ID " =
                                        <ID:ID> " : " <ID:Type> (blank)




  Property.Property = <
                                    prettyprint-Definition =
    <ID> : <Type>                     ?Entity(x, prop*)
                                      ; ![ H(

  >                                           [SOpt(HS(), "0")]
                                           , [ S("entity ")
                                              , <pp-one-Z(prettyprint-ID)> x
                                              , S(" {")
                                              ]
                                           )
                                         , <pp-indent(|"2")> [<pp-V-list(prettyprint-Property)> p*]
                                         , H([SOpt(HS(), "0")], [S("}")]
                                           )
                                         ]
Type Checking
Example: Checking Method Calls

module renaming

  entity String {
    function plus(that:String): String { ... }
  }

  entity User {
    firstName : String
    lastName : String
    fullName : String
    function rename(first: String, last: String) {
      fullName := first.plus(0);          // argument has wrong type
      fullName := first.plus();           // too few arguments
      fullName := first.plus(last, last); // too many arguments
      fullName := first.plus(last);       // correct
    }
  }
Constraint Checks

rules // errors

  type-error :
    (e, t) -> (e, $[Type [<pp>t] expected instead of [<pp>t']])
    where <type-of> e => t'; not(<subtype>(t', t))

rules // functions

  constraint-error:
    |[ e.x(e*) ]| -> (x, $[Expects [m] arguments, found [n]])
    where <lookup-type> x => (t*, t);
          <length> e* => n; <length> t* => m;
          not(<eq>(m, n))

  constraint-error:
    |[ e.x(e*) ]| -> <zip; filter(type-error)> (e*, t*)
    where <lookup-type> x => (t*, t)
Type Analysis




rules // constants

  type-of   :   |[ true ]|    ->   TypeBool()
  type-of   :   |[ false ]|   ->   TypeBool()
  type-of   :   Int(i)        ->   TypeInt()
  type-of   :   String(x)     ->   TypeString()
Types of Names

rules // names

  type-of :
    Var(x) -> <lookup-type> x

  type-of :
    |[ e.x ]| -> t
    where <lookup-type> x => t

  type-of :
    |[ e.x(e*) ]| -> t
    where <lookup-type> x => (t*, t)

  type-of :
    |[ f(e*) ]| -> t
    where <lookup-type> f => (t*, t)
Analysis: Name Resolution




                   +
DeïŹnitions and References

                                  deïŹnition

  test type refers to entity [[
    module test
    entity [[String]] { }
    entity User {
      first : [[String]]
      last : String
    }
  ]] resolve #2 to #1
                                  reference
From Tree to Graph



Module(
  "test"
, [ Entity("String", [])
  , Entity(
      "User"
    , [ Property("first",   )
      , Property("last",    )
      ]
    )
  ]
)
Unique Names


Module(
  "users"{[Module(), "users"]}
  , [ Entity("String"{[Type(), "String", "users"]}, [])
    , Entity(
        "User"{[Type(), "User", "users"]}
      , [ Property(
            "first"{[Property(), "first", "User", "users"]}
          , Type("String"{[Type(), "String", "users"]}))
        , Property(
            "last"{[Property(), "last", "User", "users"]}
          , Type("String"{[Type(), "String", "users"]}))
        ]
      )
    ]
  )




      + index mapping unique names to values
Spoofax Name Binding Language
      namespaces Module Type             See the full story in
                                          SLE talk on Friday
      rules

        Entity(c, _) :
          defines Type c
              	 	 	
        Type(x, _) :
          refers to Type x
      	 	
        Module(m, _) :
          defines Module m
          scopes Type
      	 	
        Imports(m) :
          imports Type from Module m



  abstract from name resolution algorithmics
spoofax.org




http://spoofax.org

Weitere Àhnliche Inhalte

Was ist angesagt?

Model-Driven Software Development - Static Analysis & Error Checking
Model-Driven Software Development - Static Analysis & Error CheckingModel-Driven Software Development - Static Analysis & Error Checking
Model-Driven Software Development - Static Analysis & Error Checking
Eelco Visser
 
Scala presentation by Aleksandar Prokopec
Scala presentation by Aleksandar ProkopecScala presentation by Aleksandar Prokopec
Scala presentation by Aleksandar Prokopec
LoĂŻc Descotte
 

Was ist angesagt? (20)

Joy of scala
Joy of scalaJoy of scala
Joy of scala
 
Idiomatic Kotlin
Idiomatic KotlinIdiomatic Kotlin
Idiomatic Kotlin
 
Haskell in the Real World
Haskell in the Real WorldHaskell in the Real World
Haskell in the Real World
 
Java string handling
Java string handlingJava string handling
Java string handling
 
Model-Driven Software Development - Static Analysis & Error Checking
Model-Driven Software Development - Static Analysis & Error CheckingModel-Driven Software Development - Static Analysis & Error Checking
Model-Driven Software Development - Static Analysis & Error Checking
 
Scala collections api expressivity and brevity upgrade from java
Scala collections api  expressivity and brevity upgrade from javaScala collections api  expressivity and brevity upgrade from java
Scala collections api expressivity and brevity upgrade from java
 
Swift와 Objective-Cë„Œ 핚께 쓰는 ë°©ëȕ
Swift와 Objective-Cë„Œ 핚께 쓰는 ë°©ëȕSwift와 Objective-Cë„Œ 핚께 쓰는 ë°©ëȕ
Swift와 Objective-Cë„Œ 핚께 쓰는 ë°©ëȕ
 
Scala for curious
Scala for curiousScala for curious
Scala for curious
 
Scala presentation by Aleksandar Prokopec
Scala presentation by Aleksandar ProkopecScala presentation by Aleksandar Prokopec
Scala presentation by Aleksandar Prokopec
 
OO in JavaScript
OO in JavaScriptOO in JavaScript
OO in JavaScript
 
Scala in Places API
Scala in Places APIScala in Places API
Scala in Places API
 
Scala in practice
Scala in practiceScala in practice
Scala in practice
 
Pig Introduction to Pig
Pig Introduction to PigPig Introduction to Pig
Pig Introduction to Pig
 
Java script arrays
Java script arraysJava script arrays
Java script arrays
 
Scala - brief intro
Scala - brief introScala - brief intro
Scala - brief intro
 
From android/java to swift (3)
From android/java to swift (3)From android/java to swift (3)
From android/java to swift (3)
 
ddd+scala
ddd+scaladdd+scala
ddd+scala
 
Pragmatic Real-World Scala (short version)
Pragmatic Real-World Scala (short version)Pragmatic Real-World Scala (short version)
Pragmatic Real-World Scala (short version)
 
JDays Lviv 2014: Java8 vs Scala: Difference points & innovation stream
JDays Lviv 2014:  Java8 vs Scala:  Difference points & innovation streamJDays Lviv 2014:  Java8 vs Scala:  Difference points & innovation stream
JDays Lviv 2014: Java8 vs Scala: Difference points & innovation stream
 
Scala jargon cheatsheet
Scala jargon cheatsheetScala jargon cheatsheet
Scala jargon cheatsheet
 

Ähnlich wie Grammarware Memes

An introduction to scala
An introduction to scalaAn introduction to scala
An introduction to scala
Mohsen Zainalpour
 
Working With JQuery Part1
Working With JQuery Part1Working With JQuery Part1
Working With JQuery Part1
saydin_soft
 
Pragmatic Real-World Scala
Pragmatic Real-World ScalaPragmatic Real-World Scala
Pragmatic Real-World Scala
parag978978
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
Hiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
Hiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
Hiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
Hiroshi Ono
 

Ähnlich wie Grammarware Memes (20)

Writing a compiler in go
Writing a compiler in goWriting a compiler in go
Writing a compiler in go
 
Model-Driven Software Development - Pretty-Printing, Editor Services, Term Re...
Model-Driven Software Development - Pretty-Printing, Editor Services, Term Re...Model-Driven Software Development - Pretty-Printing, Editor Services, Term Re...
Model-Driven Software Development - Pretty-Printing, Editor Services, Term Re...
 
An introduction to scala
An introduction to scalaAn introduction to scala
An introduction to scala
 
Scott Anderson [InfluxData] | New & Upcoming Flux Features | InfluxDays 2022
Scott Anderson [InfluxData] | New & Upcoming Flux Features | InfluxDays 2022Scott Anderson [InfluxData] | New & Upcoming Flux Features | InfluxDays 2022
Scott Anderson [InfluxData] | New & Upcoming Flux Features | InfluxDays 2022
 
Elm: give it a try
Elm: give it a tryElm: give it a try
Elm: give it a try
 
Meet scala
Meet scalaMeet scala
Meet scala
 
360|iDev
360|iDev360|iDev
360|iDev
 
Working With JQuery Part1
Working With JQuery Part1Working With JQuery Part1
Working With JQuery Part1
 
Functional programming ii
Functional programming iiFunctional programming ii
Functional programming ii
 
Building DSLs With Eclipse
Building DSLs With EclipseBuilding DSLs With Eclipse
Building DSLs With Eclipse
 
Imugi: Compiler made with Python
Imugi: Compiler made with PythonImugi: Compiler made with Python
Imugi: Compiler made with Python
 
JavaScript, TypeScipt and React Native
JavaScript, TypeScipt and React NativeJavaScript, TypeScipt and React Native
JavaScript, TypeScipt and React Native
 
Pragmatic Real-World Scala
Pragmatic Real-World ScalaPragmatic Real-World Scala
Pragmatic Real-World Scala
 
Scala Bootcamp 1
Scala Bootcamp 1Scala Bootcamp 1
Scala Bootcamp 1
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
Introducing scala
Introducing scalaIntroducing scala
Introducing scala
 
Improving Correctness with Types Kats Conf
Improving Correctness with Types Kats ConfImproving Correctness with Types Kats Conf
Improving Correctness with Types Kats Conf
 

Mehr von Eelco Visser

Declarative Type System Specification with Statix
Declarative Type System Specification with StatixDeclarative Type System Specification with Statix
Declarative Type System Specification with Statix
Eelco Visser
 

Mehr von Eelco Visser (20)

CS4200 2019 | Lecture 5 | Transformation by Term Rewriting
CS4200 2019 | Lecture 5 | Transformation by Term RewritingCS4200 2019 | Lecture 5 | Transformation by Term Rewriting
CS4200 2019 | Lecture 5 | Transformation by Term Rewriting
 
CS4200 2019 | Lecture 4 | Syntactic Services
CS4200 2019 | Lecture 4 | Syntactic ServicesCS4200 2019 | Lecture 4 | Syntactic Services
CS4200 2019 | Lecture 4 | Syntactic Services
 
CS4200 2019 | Lecture 3 | Parsing
CS4200 2019 | Lecture 3 | ParsingCS4200 2019 | Lecture 3 | Parsing
CS4200 2019 | Lecture 3 | Parsing
 
CS4200 2019 | Lecture 2 | syntax-definition
CS4200 2019 | Lecture 2 | syntax-definitionCS4200 2019 | Lecture 2 | syntax-definition
CS4200 2019 | Lecture 2 | syntax-definition
 
CS4200 2019 Lecture 1: Introduction
CS4200 2019 Lecture 1: IntroductionCS4200 2019 Lecture 1: Introduction
CS4200 2019 Lecture 1: Introduction
 
A Direct Semantics of Declarative Disambiguation Rules
A Direct Semantics of Declarative Disambiguation RulesA Direct Semantics of Declarative Disambiguation Rules
A Direct Semantics of Declarative Disambiguation Rules
 
Declarative Type System Specification with Statix
Declarative Type System Specification with StatixDeclarative Type System Specification with Statix
Declarative Type System Specification with Statix
 
Compiler Construction | Lecture 17 | Beyond Compiler Construction
Compiler Construction | Lecture 17 | Beyond Compiler ConstructionCompiler Construction | Lecture 17 | Beyond Compiler Construction
Compiler Construction | Lecture 17 | Beyond Compiler Construction
 
Domain Specific Languages for Parallel Graph AnalytiX (PGX)
Domain Specific Languages for Parallel Graph AnalytiX (PGX)Domain Specific Languages for Parallel Graph AnalytiX (PGX)
Domain Specific Languages for Parallel Graph AnalytiX (PGX)
 
Compiler Construction | Lecture 15 | Memory Management
Compiler Construction | Lecture 15 | Memory ManagementCompiler Construction | Lecture 15 | Memory Management
Compiler Construction | Lecture 15 | Memory Management
 
Compiler Construction | Lecture 14 | Interpreters
Compiler Construction | Lecture 14 | InterpretersCompiler Construction | Lecture 14 | Interpreters
Compiler Construction | Lecture 14 | Interpreters
 
Compiler Construction | Lecture 13 | Code Generation
Compiler Construction | Lecture 13 | Code GenerationCompiler Construction | Lecture 13 | Code Generation
Compiler Construction | Lecture 13 | Code Generation
 
Compiler Construction | Lecture 12 | Virtual Machines
Compiler Construction | Lecture 12 | Virtual MachinesCompiler Construction | Lecture 12 | Virtual Machines
Compiler Construction | Lecture 12 | Virtual Machines
 
Compiler Construction | Lecture 11 | Monotone Frameworks
Compiler Construction | Lecture 11 | Monotone FrameworksCompiler Construction | Lecture 11 | Monotone Frameworks
Compiler Construction | Lecture 11 | Monotone Frameworks
 
Compiler Construction | Lecture 10 | Data-Flow Analysis
Compiler Construction | Lecture 10 | Data-Flow AnalysisCompiler Construction | Lecture 10 | Data-Flow Analysis
Compiler Construction | Lecture 10 | Data-Flow Analysis
 
Compiler Construction | Lecture 9 | Constraint Resolution
Compiler Construction | Lecture 9 | Constraint ResolutionCompiler Construction | Lecture 9 | Constraint Resolution
Compiler Construction | Lecture 9 | Constraint Resolution
 
Compiler Construction | Lecture 8 | Type Constraints
Compiler Construction | Lecture 8 | Type ConstraintsCompiler Construction | Lecture 8 | Type Constraints
Compiler Construction | Lecture 8 | Type Constraints
 
Compiler Construction | Lecture 7 | Type Checking
Compiler Construction | Lecture 7 | Type CheckingCompiler Construction | Lecture 7 | Type Checking
Compiler Construction | Lecture 7 | Type Checking
 
Compiler Construction | Lecture 6 | Introduction to Static Analysis
Compiler Construction | Lecture 6 | Introduction to Static AnalysisCompiler Construction | Lecture 6 | Introduction to Static Analysis
Compiler Construction | Lecture 6 | Introduction to Static Analysis
 
Compiler Construction | Lecture 5 | Transformation by Term Rewriting
Compiler Construction | Lecture 5 | Transformation by Term RewritingCompiler Construction | Lecture 5 | Transformation by Term Rewriting
Compiler Construction | Lecture 5 | Transformation by Term Rewriting
 

KĂŒrzlich hochgeladen

Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎+971_581248768%)**%*]'#abortion pills for sale in dubai@
 

KĂŒrzlich hochgeladen (20)

Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Navi Mumbai Call Girls đŸ„° 8617370543 Service Offer VIP Hot Model
Navi Mumbai Call Girls đŸ„° 8617370543 Service Offer VIP Hot ModelNavi Mumbai Call Girls đŸ„° 8617370543 Service Offer VIP Hot Model
Navi Mumbai Call Girls đŸ„° 8617370543 Service Offer VIP Hot Model
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 

Grammarware Memes

  • 1. Grammarware Memes Eelco Visser & Guido Wachsmuth
  • 4. WebDSL Web Programming Language define page post(p: Post, title: String) { init{ p.update(); } title{ output(p.title) } bloglayout(p.blog){ placeholder view { postView(p) } postComments(p) } } define ajax postView(p: Post) { pageHeader2{ output(p.title) } postBodyLayout(p) { postContent(p) postExtendedContent(p) postActions(p) } }
  • 8. Grammarware vs Modelware? GPCE MODELS OOPSLA ICMT
  • 9. Grammarware vs Modelware? GPCE MODELS SLE OOPSLA ICMT
  • 10. Functional vs Object-Oriented vs Logic vs ...
  • 11. Remember the Programming Language Wars? ICFP OOPSLA
  • 12. Remember the Programming Language Wars? ICFP GPCE OOPSLA
  • 13. Scala: Object-Oriented or Functional? ‘closure’: a purely functional feature?
  • 14. X-ware is a Memeplex memeplex: selection of memes from the meme pool
  • 16. Grammarware is about (Parsing) Text module users imports library entity User { email : String password : String isAdmin : Bool }
  • 17.
  • 18. Grammarware is about Structure Module( "users" , [ Imports("library") , Entity( "User" , [ Property("email", Type("String")) , Property("password", Type("String")) , Property("isAdmin", Type("Bool")) ] ) ] )
  • 19. Grammarware: Text & Structure
  • 20. Grammarware is about Transformation
  • 21. Source to Source Transformation
  • 22. Source to Source Transformation
  • 23. Transformation & Analysis name resolution type checking desugaring code generation
  • 24. Some Memes from the Spoofax Memeplex
  • 25. EnFun: Entities with Functions module blog entity String { function plus(that:String): String } entity Bool { } entity Set<T> { function add(x: T) function remove(x: T) function member(x: T): Bool } entity Blog { posts : Set<Post> function newPost(): Post { var p : Post := Post.new(); posts.add(p); } } entity Post { title : String }
  • 27. Signature & Terms constructors Module : ID * List(Definition) -> Module Imports : ID -> Definition Module( "application" , [Imports("library"), Imports("users"), Imports("frontend")] )
  • 28. Entities & Properties constructors Entity : ID * List(Property) -> Definition Type : ID -> Type New : Type -> Exp constructors Property : ID * Type -> Property This : Exp PropAccess : Exp * ID -> Exp Module("users" , [ Imports("library") , Entity("User" , [ Property("email", Type("String")) , Property("password", Type("String")) , Property("isAdmin", Type("Bool"))])])
  • 29. Constants & Operators & Variables constructors constructors String : STRING -> Exp Geq : Exp * Exp -> Exp Int : INT -> Exp Leq : Exp * Exp -> Exp False : Exp Gt : Exp * Exp -> Exp True : Exp Lt : Exp * Exp -> Exp Eq : Exp * Exp -> Exp Mul : Exp * Exp -> Exp Minus : Exp * Exp -> Exp Plus : Exp * Exp -> Exp Or : Exp * Exp -> Exp And : Exp * Exp -> Exp Not : Exp -> Exp constructors VarDecl : ID * Type -> Stat VarDeclInit : ID * Type * Exp -> Stat Assign : Exp * Exp -> Stat Var : ID -> Exp
  • 30. Statements & Functions constructors Exp : Exp -> Stat Block : List(Stat) -> Stat Seq : List(Stat) -> Stat While : Exp * List(Stat) -> Stat IfElse : Exp * List(Stat) * List(ElseIf) * Option(Else) -> Stat Else : List(Stat) -> Else ElseIf : Exp * List(Stat) -> ElseIf constructors FunDef : ID * List(Arg) * Type * List(Stat) -> Property FunDecl : ID * List(Arg) * Type -> Property Arg : ID * Type -> Arg Return : Exp -> Stat MethCall : Exp * ID * List(Exp) -> Exp ThisCall : ID * List(Exp) -> Exp
  • 32. Transformation by Strategic Rewriting rules desugar: Plus(e1, e2) -> MethCall(e1, "plus", [e2]) desugar: Or(e1, e2) -> MethCall(e1, "or", [e2]) desugar : VarDeclInit(x, t, e) -> Seq([VarDecl(x, t), Assign(Var(x), e)]) strategies desugar-all = topdown(repeat(desugar))
  • 33. Return-Lifting Applied function fact(n: Int): Int { function fact(n: Int): Int { var res: Int; if(n == 0) { if(n == 0) { return 1; res := 1; } else { } else { return this * fact(n - 1); res := this * fact(n - 1); } } return res; } }
  • 34. Return-Lifting Rules rules lift-return-all = alltd(lift-return; normalize-all) lift-return : FunDef(x, arg*, Some(t), stat1*) -> FunDef(x, arg*, Some(t), Seq([ VarDecl(y, t), Seq(stat2*), Return(Var(y)) ])) where y := <new>; stat2* := <alltd(replace-return(|y))> stat1* replace-return(|y) : Return(e) -> Assign(y, e)
  • 35. Seq Normalization strategies normalize-all = innermost-L(normalize) rules // seq lifting normalize : [Seq(stat1*) | stat2*@[_|_]] -> [Seq([stat1*,stat2*])] normalize : [stat, Seq(stat*)] -> [Seq([stat | stat*])] normalize : Block([Seq(stat1*)]) -> Block(stat1*) normalize : FunDef(x, arg*, t, [Seq(stat*)]) -> FunDef(x, arg*, t, stat*)
  • 37. Small Step Operational Semantics rules // driver steps = repeat(step) step: State([Frame(fn, this, slots, cont)|f*], heap) -> State(stack', heap') where cont' := <eval> cont; stack' := <update-stack (|...)> [Frame(..., cont')|f*]; heap' := <update-heap(|...)> heap
  • 38. Small Step Operational Semantics eval(|this, slots, heap): Var(x) -> val where val := <lookup> (x, slots) eval(|this, slots, heap): PropAccess(Ptr(p), prop) -> val where Object(_, props) := <lookup> (p, heap); val := <lookup> (prop, props)
  • 39. From Text to Structure
  • 40. Declarative Syntax DeïŹnition Entity("User", [ Property("first", Type("String")), Property("last", Type("String")) ]) signature constructors Entity : ID * List(Property) -> Definition Type : ID -> Type Property : ID * Type -> Property
  • 41. Declarative Syntax DeïŹnition entity User { Entity("User", [ first : String Property("first", Type("String")), last : String Property("last", Type("String")) } ]) signature constructors Entity : ID * List(Property) -> Definition Type : ID -> Type Property : ID * Type -> Property
  • 42. Declarative Syntax DeïŹnition context-free syntax "entity" ID "{" Property* "}" -> Definition {"Entity"} ID -> Type {"Type"} ID ":" Type -> Property {"Property"} entity User { Entity("User", [ first : String Property("first", Type("String")), last : String Property("last", Type("String")) } ]) signature constructors Entity : ID * List(Property) -> Definition Type : ID -> Type Property : ID * Type -> Property
  • 43. Declarative Syntax DeïŹnition context-free syntax "entity" ID "{" Property* "}" -> Definition {"Entity"} ID -> Type {"Type"} ID ":" Type -> Property {"Property"} entity User { Entity("User", [ first : String Property("first", Type("String")), last : String Property("last", Type("String")) } ]) signature constructors Entity : ID * List(Property) -> Definition Type : ID -> Type Property : ID * Type -> Property
  • 44. Context-free Syntax context-free syntax constructors "true" -> Exp {"True"} True : Exp "false" -> Exp {"False"} False : Exp "!" Exp -> Exp {"Not"} Not : Exp -> Exp Exp "&&" Exp -> Exp {"And"} And : Exp * Exp -> Exp Exp "||" Exp -> Exp {"Or"} Or : Exp * Exp -> Exp
  • 45. Lexical Syntax context-free syntax constructors "true" -> Exp {"True"} True : Exp "false" -> Exp {"False"} False : Exp "!" Exp -> Exp {"Not"} Not : Exp -> Exp Exp "&&" Exp -> Exp {"And"} And : Exp * Exp -> Exp Exp "||" Exp -> Exp {"Or"} Or : Exp * Exp -> Exp lexical syntax constructors [a-zA-Z][a-zA-Z0-9]* -> ID : String -> ID "-"? [0-9]+ -> INT : String -> INT [ tnr] -> LAYOUT scannerless generalized (LR) parsing
  • 46. Ambiguity context-free syntax constructors "true" -> Exp {"True"} True : Exp "false" -> Exp {"False"} False : Exp "!" Exp -> Exp {"Not"} Not : Exp -> Exp Exp "&&" Exp -> Exp {"And"} And : Exp * Exp -> Exp Exp "||" Exp -> Exp {"Or"} Or : Exp * Exp -> Exp isPublic || isDraft && (author == principal()) amb([ And(Or(Var("isPublic"), Var("isDraft")), Eq(Var("author"), ThisCall("principal", []))), Or(Var("isPublic"), And(Var("isDraft"), Eq(Var("author"), ThisCall("principal", [])))) ])
  • 47. Disambiguation by Encoding Precedence context-free syntax constructors "true" -> Exp {"True"} True : Exp "false" -> Exp {"False"} False : Exp "!" Exp -> Exp {"Not"} Not : Exp -> Exp Exp "&&" Exp -> Exp {"And"} And : Exp * Exp -> Exp Exp "||" Exp -> Exp {"Or"} Or : Exp * Exp -> Exp context-free syntax "(" Exp ")" -> Exp0 {bracket} "true" -> Exp0 {"True"} "false" -> Exp0 {"False"} Exp0 -> Exp1 "!" Exp0 -> Exp1 {"Not"} Exp1 -> Exp2 Exp1 "&&" Exp2 -> Exp2 {"And"} Exp2 -> Exp3 Exp2 "||" Exp3 -> Exp3 {"Or"}
  • 48. Declarative Disambiguation context-free syntax "true" -> Exp {"True"} "false" -> Exp {"False"} "!" Exp -> Exp {"Not"} Exp "&&" Exp -> Exp {"And", left} Exp "||" Exp -> Exp {"Or", left} "(" Exp ")" -> Exp {bracket} context-free priorities {left: Exp.Not} > {left: Exp.Mul} > {left: Exp.Plus Exp.Minus} > {left: Exp.And} > {non-assoc: Exp.Eq Exp.Lt Exp.Gt Exp.Leq Exp.Geq} isPublic || isDraft && (author == principal()) Or(Var("isPublic"), And(Var("isDraft"), Eq(Var("author"), ThisCall("principal", []))))
  • 49. Generating Text from Structure
  • 50. Code Generation by String Concatenation to-java: Property(x, Type(t)) -> <concat-strings>[ "private ", t, " ", x, ";nn", "public ", t, " get_", x, " {n", " return ", x, ";n", "}n", "public void set_", x, " (", t, " ", x, ") {n", " this.", x, " = ", x, ";n", "}" ]
  • 51. String Interpolation Templates to-java: Property(x, Type(t)) -> $[ private [t] [x]; public [t] get_[x] { return [x]; } public void set_[x] ([t] [x]) { this.[x] = [x]; } ]
  • 52. Code Generation by Model Transformation
  • 53. Generating Structured Representations to-java: Property(x, Type(t)) -> [ Field([Private()], Type(t), Var(x)), Method([Public()], Type(t), $[get_[x]], [], [ Return(Var(x)) ]), Method([Public()], None(), $[set_[x]], [Param(Type(t), x)], [ Assign(FieldAccess(This(), x), Var(x)) ]) ]
  • 54. Concrete Object Syntax to-java: Property(x, Type(t)) -> |[ private t x; public t get_#x { return x; } public void set_#x (t x) { this.x = x; } ]|
  • 55. Rewriting with Concrete Object Syntax module desugar imports Enfun strategies desugar-all = topdown(repeat(desugar)) rules desugar: |[ !e ]| -> |[ e.not() ]| desugar: |[ e1 && e2 ]| -> |[ e1.and(e2) ]| desugar: |[ e1 || e2 ]| -> |[ e1.or(e2) ]| desugar: |[ e1 + e2 ]| -> |[ e1.plus(e2) ]| desugar: |[ e1 * e2 ]| -> |[ e1.times(e2) ]| desugar: |[ e1 - e2 ]| -> |[ e1.minus(e2) ]|
  • 56. Rewriting with Concrete Object Syntax lift-return-cs : |[ function x(arg*) : t { stat1* } ]| -> |[ function x(arg*): t { var y : t; ( stat2* ) return y; } ]| where y := <new>; stat2* := <alltd(replace-return(|y))> stat1* lift-return : FunDef(x, arg*, Some(t), stat1*) -> FunDef(x, arg*, Some(t), Seq([ VarDecl(y, t), Seq(stat2*), Return(Var(y)) ])) where y := <new>; stat2* := <alltd(replace-return(|y))> stat1*
  • 58. Code Formatting module users entity String { } entity User { first : String last : String } Module( "demo1" module users , [ Entity("String", None(), None(), []) , Entity( entity String { "User" } , [ Property("first", Type("String")) , Property("last", Type("String")) ] entity User { ) first : String ] ) last : String }
  • 59. Pretty-Printer SpeciïŹcation prettyprint-Definition : Entity(x, prop*) -> [ H([SOpt(HS(), "0")] , [ S("entity ") , <pp-one-Z(prettyprint-ID)> x , S(" {") ] ) , <pp-indent(|"2")> [<pp-V-list(prettyprint-Property)> p*] , H([SOpt(HS(), "0")], [S("}")] ) ]
  • 63. Completion Templates completions completion template Definition : "entity ID { }" = "entity " <ID:ID> " {nt" (cursor) "n}" (blank) completion template Type : "ID" = <ID:ID> completion template Property : "ID : ID " = <ID:ID> " : " <ID:Type> (blank)
  • 64. Syntax Templates: Structure + Layout context-free syntax "entity" ID "{" Property* "}" -> Definition {"Entity"} ID -> Type {"Type"} ID ":" Type -> Property {"Property"} templates signature constructors Entity : ID * List(Property) -> Definition Definition.Entity = < Type : ID -> Type Property : ID * Type -> Property entity <ID> { <Property*; separator="n"> completions } completion template Definition : "entity ID { }" = > "entity " <ID:ID> " {nt" (cursor) "n}" (blank) completion template Type : "ID<>" = <ID:ID> "<" <:Type> ">" Type.Type = <<ID>> completion template Property : "ID : ID " = <ID:ID> " : " <ID:Type> (blank) Property.Property = < prettyprint-Definition = <ID> : <Type> ?Entity(x, prop*) ; ![ H( > [SOpt(HS(), "0")] , [ S("entity ") , <pp-one-Z(prettyprint-ID)> x , S(" {") ] ) , <pp-indent(|"2")> [<pp-V-list(prettyprint-Property)> p*] , H([SOpt(HS(), "0")], [S("}")] ) ]
  • 66. Example: Checking Method Calls module renaming entity String { function plus(that:String): String { ... } } entity User { firstName : String lastName : String fullName : String function rename(first: String, last: String) { fullName := first.plus(0); // argument has wrong type fullName := first.plus(); // too few arguments fullName := first.plus(last, last); // too many arguments fullName := first.plus(last); // correct } }
  • 67. Constraint Checks rules // errors type-error : (e, t) -> (e, $[Type [<pp>t] expected instead of [<pp>t']]) where <type-of> e => t'; not(<subtype>(t', t)) rules // functions constraint-error: |[ e.x(e*) ]| -> (x, $[Expects [m] arguments, found [n]]) where <lookup-type> x => (t*, t); <length> e* => n; <length> t* => m; not(<eq>(m, n)) constraint-error: |[ e.x(e*) ]| -> <zip; filter(type-error)> (e*, t*) where <lookup-type> x => (t*, t)
  • 68. Type Analysis rules // constants type-of : |[ true ]| -> TypeBool() type-of : |[ false ]| -> TypeBool() type-of : Int(i) -> TypeInt() type-of : String(x) -> TypeString()
  • 69. Types of Names rules // names type-of : Var(x) -> <lookup-type> x type-of : |[ e.x ]| -> t where <lookup-type> x => t type-of : |[ e.x(e*) ]| -> t where <lookup-type> x => (t*, t) type-of : |[ f(e*) ]| -> t where <lookup-type> f => (t*, t)
  • 71. DeïŹnitions and References deïŹnition test type refers to entity [[ module test entity [[String]] { } entity User { first : [[String]] last : String } ]] resolve #2 to #1 reference
  • 72. From Tree to Graph Module( "test" , [ Entity("String", []) , Entity( "User" , [ Property("first", ) , Property("last", ) ] ) ] )
  • 73. Unique Names Module( "users"{[Module(), "users"]} , [ Entity("String"{[Type(), "String", "users"]}, []) , Entity( "User"{[Type(), "User", "users"]} , [ Property( "first"{[Property(), "first", "User", "users"]} , Type("String"{[Type(), "String", "users"]})) , Property( "last"{[Property(), "last", "User", "users"]} , Type("String"{[Type(), "String", "users"]})) ] ) ] ) + index mapping unique names to values
  • 74. Spoofax Name Binding Language namespaces Module Type See the full story in SLE talk on Friday rules Entity(c, _) : defines Type c Type(x, _) : refers to Type x Module(m, _) : defines Module m scopes Type Imports(m) : imports Type from Module m abstract from name resolution algorithmics