720 likes | 838 Vues
This paper explores the concept of metamorphic syntax macros as a means to grow programming languages. It covers the introduction to metamorphisms, discusses the syntax and semantics of lexical macros, and delves into various parsing techniques including specificity parsing. The work highlights related topics and future developments while providing insights into invocation syntax and fixed invocation problems, aiming to enhance the flexibility and safety of language design. Ultimately, this research contributes to the ongoing dialogue on language evolution in computer science.
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