720 likes | 829 Views
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.
E N D
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 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 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 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 • 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) PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002
Invocation Syntax #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; } 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; } 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; } 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) if (a>b) swap(a,b); else b=0; PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002
Invocation Syntax #define swap(X,Y) { int t=X; X=Y; Y=t; } • Problem: fixed invocation syntax! • same for exp / stm / … 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) if (a>b) swap(a,b); else b=0; 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 repeatstmuntil ( 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 stm repeatstmuntil ( exp ) ; 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
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 repeatstmuntil ( exp ) ; macro<stm> repeat <stm S> until ( <exp E> ) ; ::= { { bool first = true; while (first || !<E>) { <S> first = false; } } } • Invocation syntax: • grammar extension 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 repeatstmuntil ( exp ) ; macro<stm> repeat <stm S> until ( <exp E> ) ; ::= { { bool first = true; while (first || !<E>) { <S> first = false; } } } • Invocation syntax: • grammar extension • Transformation: • morphing into • host syntax 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> }; ::= {…} 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> }; ::= {…} 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> }; ::= {…} • Problems: • Only fixed (finite) arity • Highly redundant decls enum { id } ; enum { id , id } ; enum { id , id , id } ; 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 ( enumid* ) PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002
Syntax Flexibility • [Scheme]: • special list constructor: “...” • [MS2]: • lists+/, options?, tuples{…}, and token-separated listsT decls ( enumid* ) PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002
Syntax Flexibility • [Scheme]: • special list constructor: “...” • [MS2]: • lists+/, options?, tuples{…}, and token-separated listsT decls ( enumid* ) 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 { idenums } ; enums , idenums 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 { idenums } ; enums , idenums 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(); 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> …} 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> …} 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> … ::= { …} 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> … ::= { …} 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> … ::= { …} { …} PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002
Metamorph Example: enum decls enum { idenums } ; enums , idenums PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002
Metamorph Example: enum decls enum { idenums } ; enums , idenums constint x = 0; constint y = 1; constint z = 2; enum { x, y, z }; PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002
Metamorph Example: enum decls enum { idenums } ; enums , idenums • Without compile-time programminglanguage (with AST values) constint x = 0; constint y = 1; constint z = 2; enum { x, y, z }; PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002
Metamorph Example: enum decls enum { idenums } ; enums , idenums • Without compile-time programminglanguage (with AST values) int e = 0; constint x = e++; constint y = e++; constint z = e++; enum { x, y, z }; PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002
Metamorph Example: enum metamorph<decls>enums(); decls enum { idenums } ; enums , idenums 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; constint<X> = e++; <Ds> } decls enum { idenums } ; enums , idenums 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; constint<X> = e++; <Ds> } morph<enums> , <id X><enums: Ds> ::= { constint<X> = e++; <Ds> } decls enum { idenums } ; enums , idenums 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; constint<X> = e++; <Ds> } morph<enums> , <id X><enums: Ds> ::= { constint<X> = e++; <Ds> } morph<enums> ::= { } decls enum { idenums } ; enums , idenums PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002
Metamorph Example: reserve stmreserve ( res) stm residres acquire(a); acquire(b); acquire(c); ...; release(c); release(b); release(a); reserve ( a b c ) ...; PEPM 2002 Growing Languages with Metamorphic Syntax Macros January 14, 2002
Multiple ResultsExample: reserve metamorph<stms,stms>res(); stmreserve ( res) stm residres 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> } } stmreserve ( res) stm residres 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>); } stmreserve ( res) stm residres 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> ::= { } { } stmreserve ( res) stm residres 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