Growing Languages with Metamorphic Syntax Macros

Post on 05-Jan-2016

38 views 0 download

description

Growing Languages with Metamorphic Syntax Macros. Claus Brabrand Michael Schwartzbach BRICS , University of Aarhus, Denmark. Outline. Introduction Metamorphisms vDSL Specificity parsing Related and future work Conclusion. Lexical Macros. M LEX : (TOKENS) n  TOKENS, n  0. - PowerPoint PPT Presentation

Transcript of Growing Languages with Metamorphic Syntax Macros

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Growing Languages with Metamorphic Syntax Macros

Claus Brabrand

Michael Schwartzbach

BRICS, University of Aarhus, Denmark

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Outline

• Introduction

• Metamorphisms

• vDSL

• Specificity parsing

• Related and future work

• Conclusion

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Lexical Macros

• MLEX: (TOKENS)n TOKENS, n 0

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Lexical Macros

• MLEX: (TOKENS)n TOKENS, n 0

#define square(X) X*X#define square(X) X*X

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Lexical Macros

• MLEX: (TOKENS)n TOKENS, n 0

#define square(X) X*X

square(y+1) y+1*y+1

#define square(X) X*X

square(y+1) y+1*y+1

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Lexical Macros

• MLEX: (TOKENS)n TOKENS, n 0

#define square(X) X*X

square(y+1) y+1*y+1

#define square(X) X*X

square(y+1) y+1*y+1

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Lexical Macros

• MLEX: (TOKENS)n TOKENS, n 0

#define square(X) X*X

square(y+1) y+1*y+1

#define square(X) X*X

square(y+1) y+1*y+1

#define square(X) (X)*(X)

square(y+1) (y+1)*(y+1)

#define square(X) (X)*(X)

square(y+1) (y+1)*(y+1)

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Lexical Macros

• MLEX: (TOKENS)n TOKENS, n 0

• Problem: Independent of syntax!• Unsafe: parse errors discovered at invocation-time

#define square(X) X*X

square(y+1) y+1*y+1

#define square(X) X*X

square(y+1) y+1*y+1

#define square(X) (X)*(X)

square(y+1) (y+1)*(y+1)

#define square(X) (X)*(X)

square(y+1) (y+1)*(y+1)

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Invocation Syntax

#define swap(X,Y) { int t=X; X=Y; Y=t; }#define swap(X,Y) { int t=X; X=Y; Y=t; }

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Invocation Syntax

#define swap(X,Y) { int t=X; X=Y; Y=t; }#define swap(X,Y) { int t=X; X=Y; Y=t; }

if (a>b) swap(a,b);

else b=0;

if (a>b) swap(a,b);

else b=0;*** parse error!

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Invocation Syntax

#define swap(X,Y) { int t=X; X=Y; Y=t; }#define swap(X,Y) { int t=X; X=Y; Y=t; }

if (a>b) swap(a,b);

else b=0;

if (a>b) swap(a,b);

else b=0;*** parse error!

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Invocation Syntax

#define swap(X,Y) { int t=X; X=Y; Y=t; }#define swap(X,Y) { int t=X; X=Y; Y=t; }

if (a>b) swap(a,b);

else b=0;

if (a>b) swap(a,b);

else b=0;*** parse error!

#define swap(X,Y) do { int t=X; X=Y; Y=t; } while (0)#define swap(X,Y) do { int t=X; X=Y; Y=t; } while (0)

if (a>b) swap(a,b);

else b=0;

if (a>b) swap(a,b);

else b=0;

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Invocation Syntax

• Problem: fixed invocation syntax!• same for exp / stm / …

#define swap(X,Y) { int t=X; X=Y; Y=t; }#define swap(X,Y) { int t=X; X=Y; Y=t; }

if (a>b) swap(a,b);

else b=0;

if (a>b) swap(a,b);

else b=0;*** parse error!

#define swap(X,Y) do { int t=X; X=Y; Y=t; } while (0)#define swap(X,Y) do { int t=X; X=Y; Y=t; } while (0)

if (a>b) swap(a,b);

else b=0;

if (a>b) swap(a,b);

else b=0;

M(x,y,z)M(x,y,z)

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Syntax Macro• MSYN: (AST)n AST, n 0

• Typed with nonterminals of the host grammar• Safe: no parse errors as a conseq. of expansion

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Syntax Macro• MSYN: (AST)n AST, n 0

• Typed with nonterminals of the host grammar• Safe: no parse errors as a conseq. of expansion

stm repeat stm until ( exp ) ;stm repeat stm until ( exp ) ;

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Syntax Macro• MSYN: (AST)n AST, n 0

• Typed with nonterminals of the host grammar• Safe: no parse errors as a conseq. of expansion

macro <stm> repeat <stm S> until ( <exp E> ) ; ::= { { bool first = true;

while (first || !<E>) {

<S>

first = false;

} }

}

macro <stm> repeat <stm S> until ( <exp E> ) ; ::= { { bool first = true;

while (first || !<E>) {

<S>

first = false;

} }

}

stm repeat stm until ( exp ) ;stm repeat stm until ( exp ) ;

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Syntax Macro• MSYN: (AST)n AST, n 0

• Typed with nonterminals of the host grammar• Safe: no parse errors as a conseq. of expansion

macro <stm> repeat <stm S> until ( <exp E> ) ; ::= { { bool first = true;

while (first || !<E>) {

<S>

first = false;

} }

}

macro <stm> repeat <stm S> until ( <exp E> ) ; ::= { { bool first = true;

while (first || !<E>) {

<S>

first = false;

} }

}

1. Invocation syntax: grammar extension

stm repeat stm until ( exp ) ;stm repeat stm until ( exp ) ;

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Syntax Macro• MSYN: (AST)n AST, n 0

• Typed with nonterminals of the host grammar• Safe: no parse errors as a conseq. of expansion

macro <stm> repeat <stm S> until ( <exp E> ) ; ::= { { bool first = true;

while (first || !<E>) {

<S>

first = false;

} }

}

macro <stm> repeat <stm S> until ( <exp E> ) ; ::= { { bool first = true;

while (first || !<E>) {

<S>

first = false;

} }

}

1. Invocation syntax: grammar extension

2. Transformation: morphing into host syntax

stm repeat stm until ( exp ) ;stm repeat stm until ( exp ) ;

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Syntax Flexibility?

macro <decls> enum { <id X> }; ::= {…}macro <decls> enum { <id X>, <id Y> }; ::= {…} macro <decls> enum { <id X>, <id Y>, <id Z> }; ::= {…}

macro <decls> enum { <id X> }; ::= {…}macro <decls> enum { <id X>, <id Y> }; ::= {…} macro <decls> enum { <id X>, <id Y>, <id Z> }; ::= {…}

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Syntax Flexibility?

macro <decls> enum { <id X> }; ::= {…}macro <decls> enum { <id X>, <id Y> }; ::= {…} macro <decls> enum { <id X>, <id Y>, <id Z> }; ::= {…}

macro <decls> enum { <id X> }; ::= {…}macro <decls> enum { <id X>, <id Y> }; ::= {…} macro <decls> enum { <id X>, <id Y>, <id Z> }; ::= {…}

decls enum { id } ;

enum { id , id } ;

enum { id , id , id } ;

decls enum { id } ;

enum { id , id } ;

enum { id , id , id } ;

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Syntax Flexibility?

macro <decls> enum { <id X> }; ::= {…}macro <decls> enum { <id X>, <id Y> }; ::= {…} macro <decls> enum { <id X>, <id Y>, <id Z> }; ::= {…}

macro <decls> enum { <id X> }; ::= {…}macro <decls> enum { <id X>, <id Y> }; ::= {…} macro <decls> enum { <id X>, <id Y>, <id Z> }; ::= {…}

decls enum { id } ;

enum { id , id } ;

enum { id , id , id } ;

decls enum { id } ;

enum { id , id } ;

enum { id , id , id } ;

• Problems:• Only fixed (finite) arity• Highly redundant

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Syntax Flexibility

• [Scheme]:• special list constructor: “...”

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Syntax Flexibility

• [Scheme]:• special list constructor: “...”

decls ( enum id * )decls ( enum id * )

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Syntax Flexibility

• [Scheme]:• special list constructor: “...”

• [MS2]:• lists +/, options ?, tuples {…}, and

token-separated lists T

decls ( enum id * )decls ( enum id * )

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Syntax Flexibility

• [Scheme]:• special list constructor: “...”

• [MS2]:• lists +/, options ?, tuples {…}, and

token-separated lists T

decls ( enum id * )decls ( enum id * )

decls enum { id , } ;decls enum { id

, } ; ~ E-BNF

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Syntax Flexibility!

• Allow user-defined nonterminals(in invocation syntax):

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Syntax Flexibility!

• Allow user-defined nonterminals(in invocation syntax):

decls enum { id enums } ;

enums , id enums

decls enum { id enums } ;

enums , id enums

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Syntax Flexibility!

• Allow user-defined nonterminals(in invocation syntax):

• Transformation?• without compromising safety

decls enum { id enums } ;

enums , id enums

decls enum { id enums } ;

enums , id enums

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Metamorphisms

• Our solution: Metamorphisms• Attach host nonterminals to a user-def’d nonterminal

metamorph <n> m();metamorph <n> m();

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Metamorphisms

• Our solution: Metamorphisms• Attach host nonterminals to a user-def’d nonterminal

metamorph <n> m();

macro <stm> … <m: A> … ::= { … <A> … }

metamorph <n> m();

macro <stm> … <m: A> … ::= { … <A> … }

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Metamorphisms

• Our solution: Metamorphisms• Attach host nonterminals to a user-def’d nonterminal• Specify morphing (into host syntax) inductively

metamorph <n> m();

macro <stm> … <m: A> … ::= { … <A> … }

metamorph <n> m();

macro <stm> … <m: A> … ::= { … <A> … }

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Metamorphisms

• Our solution: Metamorphisms• Attach host nonterminals to a user-def’d nonterminal• Specify morphing (into host syntax) inductively

metamorph <n> m();

macro <stm> … <m: A> … ::= { … <A> … }

morph <m> … ::= { … }

metamorph <n> m();

macro <stm> … <m: A> … ::= { … <A> … }

morph <m> … ::= { … }

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Metamorphisms

• Our solution: Metamorphisms• Attach host nonterminals to a user-def’d nonterminal• Specify morphing (into host syntax) inductively• Non-local transformations (multiple results)

metamorph <n> m();

macro <stm> … <m: A> … ::= { … <A> … }

morph <m> … ::= { … }

metamorph <n> m();

macro <stm> … <m: A> … ::= { … <A> … }

morph <m> … ::= { … }

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Metamorphisms

• Our solution: Metamorphisms• Attach host nonterminals to a user-def’d nonterminal• Specify morphing (into host syntax) inductively• Non-local transformations (multiple results)

metamorph <n,n’> m();

macro <stm> … <m: A, B> … ::= { … <A> … <B> … }

morph <m> … ::= { … } { … }

metamorph <n,n’> m();

macro <stm> … <m: A, B> … ::= { … <A> … <B> … }

morph <m> … ::= { … } { … }

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Metamorph Example: enumdecls enum { id enums } ;

enums , id enums

decls enum { id enums } ;

enums , id enums

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Metamorph Example: enumdecls enum { id enums } ;

enums , id enums

decls enum { id enums } ;

enums , id enums

enum { x, y, z };enum { x, y, z }; const int x = 0;const int y = 1;const int z = 2;

const int x = 0;const int y = 1;const int z = 2;

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Metamorph Example: enumdecls enum { id enums } ;

enums , id enums

decls enum { id enums } ;

enums , id enums

enum { x, y, z };enum { x, y, z }; const int x = 0;const int y = 1;const int z = 2;

const int x = 0;const int y = 1;const int z = 2;

• Without compile-time programminglanguage (with AST values)

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Metamorph Example: enumdecls enum { id enums } ;

enums , id enums

decls enum { id enums } ;

enums , id enums

enum { x, y, z };enum { x, y, z };

int e = 0;const int x = e++;const int y = e++;const int z = e++;

int e = 0;const int x = e++;const int y = e++;const int z = e++;

• Without compile-time programminglanguage (with AST values)

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Metamorph Example: enum

metamorph <decls> enums();metamorph <decls> enums();

decls enum { id enums } ;

enums , id enums

decls enum { id enums } ;

enums , id enums

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Metamorph Example: enum

metamorph <decls> enums();

macro <decls> enum { <id X> <enums: Ds> } ; ::= { int e = 0;

const int <X> = e++;

<Ds>

}

metamorph <decls> enums();

macro <decls> enum { <id X> <enums: Ds> } ; ::= { int e = 0;

const int <X> = e++;

<Ds>

}

decls enum { id enums } ;

enums , id enums

decls enum { id enums } ;

enums , id enums

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Metamorph Example: enum

metamorph <decls> enums();

macro <decls> enum { <id X> <enums: Ds> } ; ::= { int e = 0;

const int <X> = e++;

<Ds>

}

morph <enums> , <id X> <enums: Ds> ::= { const int <X> = e++;

<Ds>

}

metamorph <decls> enums();

macro <decls> enum { <id X> <enums: Ds> } ; ::= { int e = 0;

const int <X> = e++;

<Ds>

}

morph <enums> , <id X> <enums: Ds> ::= { const int <X> = e++;

<Ds>

}

decls enum { id enums } ;

enums , id enums

decls enum { id enums } ;

enums , id enums

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Metamorph Example: enum

metamorph <decls> enums();

macro <decls> enum { <id X> <enums: Ds> } ; ::= { int e = 0;

const int <X> = e++;

<Ds>

}

morph <enums> , <id X> <enums: Ds> ::= { const int <X> = e++;

<Ds>

}

morph <enums> ::= { }

metamorph <decls> enums();

macro <decls> enum { <id X> <enums: Ds> } ; ::= { int e = 0;

const int <X> = e++;

<Ds>

}

morph <enums> , <id X> <enums: Ds> ::= { const int <X> = e++;

<Ds>

}

morph <enums> ::= { }

decls enum { id enums } ;

enums , id enums

decls enum { id enums } ;

enums , id enums

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

stm reserve ( res ) stm

res id res

stm reserve ( res ) stm

res id res

Metamorph Example: reserve

reserve ( a b c ) ...;reserve ( a b c ) ...;

acquire(a); acquire(b); acquire(c); ...; release(c); release(b);release(a);

acquire(a); acquire(b); acquire(c); ...; release(c); release(b);release(a);

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Multiple ResultsExample: reserve

metamorph <stms,stms> res();metamorph <stms,stms> res();

stm reserve ( res ) stm

res id res

stm reserve ( res ) stm

res id res

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Multiple ResultsExample: reserve

metamorph <stms,stms> res();

macro <stm> reserve ( <res: S1,S2> ) <stm S> ::= { { <S1> <S> <S2> }

}

metamorph <stms,stms> res();

macro <stm> reserve ( <res: S1,S2> ) <stm S> ::= { { <S1> <S> <S2> }

}

stm reserve ( res ) stm

res id res

stm reserve ( res ) stm

res id res

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Multiple ResultsExample: reserve

metamorph <stms,stms> res();

macro <stm> reserve ( <res: S1,S2> ) <stm S> ::= { { <S1> <S> <S2> }

}

morph <res> <id X> <res: S1,S2> ::= { acquire(<X>); <S1>

} {

<S2> release(<X>);

}

metamorph <stms,stms> res();

macro <stm> reserve ( <res: S1,S2> ) <stm S> ::= { { <S1> <S> <S2> }

}

morph <res> <id X> <res: S1,S2> ::= { acquire(<X>); <S1>

} {

<S2> release(<X>);

}

stm reserve ( res ) stm

res id res

stm reserve ( res ) stm

res id res

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Multiple ResultsExample: reserve

metamorph <stms,stms> res();

macro <stm> reserve ( <res: S1,S2> ) <stm S> ::= { { <S1> <S> <S2> }

}

morph <res> <id X> <res: S1,S2> ::= { acquire(<X>); <S1>

} {

<S2> release(<X>);

}

morph <res> ::= { } { }

metamorph <stms,stms> res();

macro <stm> reserve ( <res: S1,S2> ) <stm S> ::= { { <S1> <S> <S2> }

}

morph <res> <id X> <res: S1,S2> ::= { acquire(<X>); <S1>

} {

<S2> release(<X>);

}

morph <res> ::= { } { }

stm reserve ( res ) stm

res id res

stm reserve ( res ) stm

res id res

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Metamorph Advantages

• Flexibility

• Safety

• Simplicity

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Metamorph Advantages

• Flexibility:• Tree structures• Non-local transformations (multiple results)

• Safety

• Simplicity

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Metamorph Advantages

• Flexibility:• Tree structures• Non-local transformations (multiple results)

• Safety:• No parse errors as a conseq. of macro expansion• Guaranteed termination

• Simplicity

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Metamorph Advantages

• Flexibility:• Tree structures• Non-local transformations (multiple results)

• Safety:• No parse errors as a conseq. of macro expansion• Guaranteed termination

• Simplicity: • Based entirely on declarative concepts:

grammars and substitution

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

vDSL:very Domain Specific Languagestudies

course Math101

title “Mathematics 101”

2 point fall term

exclusions

Math101 <> MathA

Math102 <> MathB

prerequisites

Math101, Math102 < Math201, Math202, Math203

Math101, CS101 < CS202

studies

course Math101

title “Mathematics 101”

2 point fall term

exclusions

Math101 <> MathA

Math102 <> MathB

prerequisites

Math101, Math102 < Math201, Math202, Math203

Math101, CS101 < CS202

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Specificity Parsing

macro <exp> select <id I> from <exp E> where <exp E2>

macro <exp> select all from <exp E> where <exp E2>

macro <exp> select <id I> from <exp E> where <exp E2>

macro <exp> select all from <exp E> where <exp E2>

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Specificity Parsing

• Challenge rounds:– Select most specific productions (wrt. FIRST sets)

macro <exp> select <id I> from <exp E> where <exp E2>

macro <exp> select all from <exp E> where <exp E2>

macro <exp> select <id I> from <exp E> where <exp E2>

macro <exp> select all from <exp E> where <exp E2>

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Specificity Parsing

• Challenge rounds:– Select most specific productions (wrt. FIRST sets)

• Resolves many ambiguities• Independent of definition-order• Overloading• Avoids keywordification• Commit no branch explosion, no backtracking

macro <exp> select <id I> from <exp E> where <exp E2>

macro <exp> select all from <exp E> where <exp E2>

macro <exp> select <id I> from <exp E> where <exp E2>

macro <exp> select all from <exp E> where <exp E2>

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Related Work: Macro Survey• 8x Macro languages:

• { CPP, M4, TEX, Dylan, C++ Templates, Scheme, JTS, MS2 }

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Related Work: Macro Survey• 8x Macro languages:

• { CPP, M4, TEX, Dylan, C++ Templates, Scheme, JTS, MS2 }

• 31x Macro properties:• { Level of operation, Programmability, Definition scope,

Termination, Argument syntax, Error trailing, … }

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Related Work: Macro Survey• 8x Macro languages:

• { CPP, M4, TEX, Dylan, C++ Templates, Scheme, JTS, MS2 }

• 31x Macro properties:• { Level of operation, Programmability, Definition scope,

Termination, Argument syntax, Error trailing, … }

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Related Work

• “Extensible Syntax with Lexical Scoping” - by Cardelli, Matthes, and Abadi :

• Not a macro language, but a parser generator:– Target language (not host language)– Extend recompile parser

• Localized transformation only• Disjoint productions• Keywordification• Explicit alpha conversion

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Future Work: metafront

• Extensible syntax processor, based on:• Specificity parsing and• Metamorphic syntax macros:

metafront metafrontbase grammar: Lmacros: L+ Lprogram in L+

program in L

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Future Work: metafront

• Extensible syntax processor, based on:• Specificity parsing and• Metamorphic syntax macros:

• Safe transformation: L+ L

metafront metafrontbase grammar: Lmacros: L+ Lprogram in L+

program in L

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Future Work: metafront

• Extensible syntax processor, based on:• Specificity parsing and• Metamorphic syntax macros:

• Safe transformation: L+ L• Safe transformation: L’ L, (vDSL)

metafront metafrontbase grammar: Lmacros: L+ Lprogram in L+

program in L

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

ConclusionMetamorphic Syntax Macros is a…

• flexible• safe• simple

…way of Growing Languages

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

ConclusionMetamorphic Syntax Macros is a…

• flexible• safe• simple

…way of Growing Languages

Fully implemented in <bigwig> (language for developing interactive Web services)

http://www.brics.dk/bigwig/http://www.brics.dk/bigwig/

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

The End

next: bonus slides

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Pretty Printing & Error Reporting• Pretty Printing:

• Terminal printers:ASCII, LA EX, HTML(+/- expansion)

• Error Reporting:• stdout, HTML

*** symbol errors:*** test.wig:7: Identifier ‘inf’ not declared in macro argument ‘S’ in macro invocation ‘reader’ (test.wig:7) defined in [std.wigmac:44]

*** symbol errors:*** test.wig:7: Identifier ‘inf’ not declared in macro argument ‘S’ in macro invocation ‘reader’ (test.wig:7) defined in [std.wigmac:44]

T

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

-Conversion

macro <stm> repeat <stm S> until ( <exp E> ) ; ::= { {

bool first = true;

while (first || !<E>) {

<S>

first = false;

}

}

}

macro <stm> repeat <stm S> until ( <exp E> ) ; ::= { {

bool first = true;

while (first || !<E>) {

<S>

first = false;

}

}

}

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

-Conversion

metamorph <decls> enums();

macro <decls> enum { <id X> <enums: Ds> } ; ::= { int e = 0;

const int <X> = e++;

<Ds>

}

morph <enums> , <id X> <enums: Ds> ::= { const int <X> = e++;

<Ds>

}

morph <enums> ::= { }

metamorph <decls> enums();

macro <decls> enum { <id X> <enums: Ds> } ; ::= { int e = 0;

const int <X> = e++;

<Ds>

}

morph <enums> , <id X> <enums: Ds> ::= { const int <X> = e++;

<Ds>

}

morph <enums> ::= { }

decls : enum { id enums } ;

enums : , id enums

|

decls : enum { id enums } ;

enums : , id enums

|

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Example: switchmetamorph <stm> swb();

macro <stm> switch ( <exp E> ) { <swb: S> } ::= { { var x = <E>; <S>}}

morph <swb> case <exp E> : <stms Ss> break; <swb: S>::= { if (x==<E>) { <Ss> } else <S>}

morph <swb> case <exp E> : <stms Ss> break; ::= { if (x==<E>) { <Ss> }}

metamorph <stm> swb();

macro <stm> switch ( <exp E> ) { <swb: S> } ::= { { var x = <E>; <S>}}

morph <swb> case <exp E> : <stms Ss> break; <swb: S>::= { if (x==<E>) { <Ss> } else <S>}

morph <swb> case <exp E> : <stms Ss> break; ::= { if (x==<E>) { <Ss> }}

stm : switch ( exp ) { swb }

swb : case exp : stms break; swb

| case exp : stms break;

stm : switch ( exp ) { swb }

swb : case exp : stms break; swb

| case exp : stms break;

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Metamorph Wellformedness

• Check at definition time:• “no left recursion” (guarantees termination):

• “derivability” (metamorphisms must derive something finite) :

xlist xlist X

xlist xlist X

xlist X xlist

xlist X xlist

xlist X xlist

xlist X xlist

xlist X xlistxlist X xlist

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Representationmacro <ids> MXY ( <ids Is> ) ::= { X, <Is>, Y }

A, MXY(B, C), D A, X, B, C, Y, D

macro <ids> MXY ( <ids Is> ) ::= { X, <Is>, Y }

A, MXY(B, C), D A, X, B, C, Y, D

• “Weaving” yields transparency!

weave

PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002

Syntax Macros

• MSYN: (AST)n AST , n 0

~

square( )

macro <exp> square ( <exp E> ) ::= { <E> * <E>

}

macro <exp> square ( <exp E> ) ::= { <E> * <E>

}**

exp

exp

Eexp

E

**

exp

y + 1y

+ 1 y + 1y

+ 1

exp

Eexp

Ey

+ 1y + 1

exp