• No results found

Origin Tracking in Attribute Grammars

N/A
N/A
Protected

Academic year: 2021

Share "Origin Tracking in Attribute Grammars"

Copied!
39
0
0

Loading.... (view fulltext now)

Full text

(1)

Origin Tracking in Attribute Grammars

Kevin Williams and Eric Van Wyk

University of Minnesota

Stellenbosch, WG2.11, January 20-22, 2015

(2)

First, some advertising

I Multiple new faculty positions at Minnesota

I Part of MnDrive- a state-funded effort in robotics,

sensors, and advanced manufacturing.

I Several areas including computer science, very broadly

focused

I Program generation with even a hint of applicability to

these areas would be a great fit.

I Talk to me for details.

I http://cse.umn.edu/research/mndrive/

I (Minneapolis is a great city, as you all know from our

previous meeting there....)

(3)

A refresher and introduction.

(4)

Extensible languages frameworks

Allow programmers select the features to be added to a “host” programming language.

I new syntax (notations)

I new semantic analyses

(error-checking, optimization opportunities)

I new optimizations

Why would anyone want to do that?

(5)

Programming language features

General purpose features in,e.g., C or Java

I assignment statements, loops, if-then-else statements

I functions (perhaps higher-order) and procedures

I I/O facilities

I modules

I data: integer, strings, arrays, structs

Domain-specific features

I matrix operations (MATLAB)

I regular expression matching (Perl, Python)

I statistics functions (R)

I computational geometry operations (LN)

I parallel computing (SISAL, NESL, SAC, PQL etc.)

Many similarities, needless differences.

Working with multiple (domain-specific) languages is a headache.

(6)

For example

#include <stdio.h> Matrix gradient ;

int main( int argc, char **argv) {

match argv[1] with | /$(@s=[0-9])+.*/ -> gradient(x,y) = s * (x + y) { parallelize y; reorder y, x; } | -> ... }

I A program in extended ANSI C

I Compilation: scaled grad.xc =⇒ scaled grad.c

(7)

Reliably composable language extensions

I Extension developerswork independently.

I Extension users use multiple extensions.

I not experts in language design

I combinations of extensions must “just work”

(8)

Challenges for composable language extensions

1. syntax — context free grammars, assoc. regexs

I context-aware scanning [GPCE’07] I modular determinism analysis [PLDI’09] I Copper

2. semantics — attribute grammars

I attribute grammars with forwarding, collections and

higher-order attributes

I set union of specification components

I sets of productions, non-terminals, attributes

I sets of attribute defining equations, on a production

I sets of equations contributing values to a single attribute

I modular well-definedness analysis [SLE’12a] I modular termination analysis [SLE’12b, SCP’14] I Silver

(9)

Origin Tracking in Attribute Grammars

(10)

J. Symbolic Computation (1993) 15, 523-545

Origin Tracking

A. VAN DEURSEN, P. KLINT, AND F. TIe [email protected], paulk~cwi.nl, tip~cwi.nl CWI, P.O. Box 4079, 1009 AB Amsterdam, The Netherlands

We are interested in generating interactive programming environments from formal language specifications and use term rewriting to execute these specifications. Func- tions defined in a specification operate on the abstract syntax tree of programs and the initial term for the rewriting process will consist of an application of some function (e.g., a type checker, evaluator or translator) to the syntax tree of a program. Dur- ing the term rewriting process, pieces of the program such as identifiers, expressions, or statements, recur in intermediate terms. We want to formalize these recurrences and use them, for example, for associating positional information with messages in error reports, visualizing program execution, and constructing language-specific de- buggers. Origins are relations between subterms of intermediate terms and subterms of the initial term. Origin tracking is a method for incrementally computing origins during rewriting. We give a formal definition of origins, and present a method for implementing origin tracking.

1 I n t r o d u c t i o n

We are interested in generating interactive development tools from formal language defi- nitions. Thus far, this has resulted in the design of an algebraic specification formalism, called ASF+SDF [BHK89, HHKR89] supporting modularization, user-definable syntax, associative lists, and conditional equations, and in the implementation of the ASF+SDF Meta-environment [Hen91, Kli93].

Given a specification for a programming (or other) language, the Meta-environment generates an interactive environment for the language in question. More precisely, the Meta-environment is a tool generator which takes a specification in ASF+SDF and de- rives a lexical analyzer, a parser, a syntax-directed editor and a rewrite engine from it. The Meta-environment provides fully interactive support for writing, checking, and test- ing specifications--all tools are generated in an incremental fashion and, when the input specification is changed, they are updated incrementally rather than being regenerated Partial support has been received from the European Communities under ESPRIT project 2177: Gen- eration of Interactive Programming Environments - GIPE II, under ESPRIT project 5399: Compiler Gen- eration for Parallel Machines - COMPAaE, and from the Netherlands Organization for Scientific Research - Nwo, project Incremental Program Generators.

0747-7171/93/5-6523 + 23 $08.00/0 © 1993 Academic Press Limited

(11)

Origins in Halide-inspired language extension

grad(x,y) = x + y { parallelize y; reorder y, x; } becomes

#pragma omp parallel for ... for y from 0 to yMax {

for x from 0 to xMax { grad[x][y] = x + y; } } I #pragma omp connects to parallelizevia origins I reordered for-loops connect toreorder

via origins and redex edges.

(12)

A simple example

Sorts: E, Int Operators: add :E E →E sub:E E →E mul :E E →E div :E E →E negate :E →E const :Int →E Rewrite rules: I negate(X)→sub(const(0),X) I mul(const(1),X)→X Apply to 2 + (−3∗(1∗(4 + 5))) 12 / 37
(13)
(14)
(15)
(16)

Adding (extended) origins to AGs

Challenges

I For transformations, AGs are more verbose.

I Explicit equations for implicit copies rules.

I Simple origins are straightforward,

I New trees have origins pointing to the root node of the

production

I Extended origins, not so simple.

I Need to identify the equations that are “interesting”

(17)

nonterminal Root, Expr;

synthesized attribute expd::Expr occurs on Expr;

synthesized attribute simp::Expr occurs on Expr;

abstract production negate e::Expr ::= ne::Expr

{ e.expd = sub(const(0), ne.expd); e.simp = negate(ne.simp); } abstract production mul e::Expr ::= l::Expr r::Expr { e.expd = mul(l.expd, r.expd);

e.simp = case l of

| const(1) -> r.simp | _ -> mul(l.simp, r.simp) end; }

abstract production root r::Root ::= e::Expr

{ local doExpd :: Expr = e.expd; local doSimp :: Expr =

doExpd.simp; } abstract production add e::Expr ::= l::Expr r::Expr { e.expd = add(l.expd, r.expd);

e.simp = add(l.simp, r.simp); } abstract production sub

e::Expr ::= l::Expr r::Expr { e.expd = sub(l.expd, r.expd);

e.simp = sub(l.simp, r.simp); } abstract production const

e::Expr ::= i::Integer { e.expd = const(i);

e.simp = const(i); }

(18)

Origins

abstract production root r::Root ::= e::Expr

{ local doExpd :: Expr = e.expd;

local doSimp :: Expr = doExpd.simp; }

Local higher-order attributes for transformed trees.

(19)

Origins

abstract production add e::Expr ::= l::Expr r::Expr { e.expd = add(l.expd, r.expd);

e.simp = add(l.simp, r.simp); }

boiler plate equations

(20)

Origins

abstract production mul e::Expr ::= l::Expr r::Expr

{ e.simp = case l of | const(1) -> r.simp

| _ -> mul(l.simp, r.simp) ;} mul(const(1),X)→X

(21)

So, how is this accomplished?

I Big-step operational semantics of expression evaluation

I Different types for undecorated trees (terms) and

decorated trees

(22)

e ::= if e then e elsee | case e of q1(y11, ...,yn1q 1)⇒e1 ... qn(y1n, ...,ynnqn)⇒en | f(e, ...,e) | var | var.attr | p(e, ...,e) | new var | v var ::= x0 | xi,i >0 | `i | y v ::= true | false | n | str | p(v, ...,v)|o) | [n, ...,n] | λy1:T1, ..., yn:Tn.e T ::= PT | N | N::=X...X | T...T →T | Ref N 22 / 37

(23)

Without origins: ∀i1 n(σ `ei ⇒vi) σ `q(e1, ...,en)⇒q(v1, ...,vn) (E-Tree) σ`var →h

σ`new var →*h (E-New)

With origins: ∀i1 n(σ,t `ei →vi) σ,t `q(e1, ...,en)→q(v1, ...,vn|t) (E-O-Tree) σ,t `var →h

σ,t `newvar →duplicate(h) (E-O-New)

(24)

Redex and Contractum

abstract production negate e::Expr ::= ne::Expr

{ e.expd = sub(const(0), ne.expd); e.simp = negate(ne.simp); } negate(ne)→sub(const(0),ne)

(25)

Redex and Contractum

abstract production mul e::Expr ::= l::Expr r::Expr

{ e.simp = case l of | const(1) -> r.simp

| _ -> mul(l.simp, r.simp) ;} mul(const(1),X)→X

(26)

Extended Origins

Questions answered by extended origins:

I Is a tree newly constructed, is it a contractum?

I What is the redex, if one exists?

I What is the contractum root, if one exists?

I Why was the transformation made?

(27)

e ::= if e then e elsee | case e of q1(y11, ...,yn1q 1)⇒e1 ... qn(y1n, ...,ynnqn)⇒en | f(e, ...,e) | var | var.attr | p(e, ...,e) | new var | v var ::= x0 | xi,i >0 | `i | y v ::= true | false | n | str | p(v, ...,v|o),n,r,c,l) | [n, ...,n] | λy1:T1, ..., yn:Tn.e T ::= PT | N | N::=X...X | T...T →T | Ref N 27 / 37

(28)

Origins interface:

p(v

, ...,

v

|

o

,

n

,

r

,

c

,

l

)

I o - origin

I n - isNew, Boolean

I r - redex or ⊥

I c - contractum or ⊥

I l - set of descriptive labels, specific to each attribute

equation

(29)

Invariants

getOrigin(t) = ⊥ =⇒ ¬getIsNew(t) ∧getRedex(t) =⊥ ∧

getContractum(t) =⊥ ∧getLabels(t) ={}

If the origin is undefined (which only occurs on initial trees) then the above are default values for each of the properties.

getIsNew(t) =⇒getOrigin(t)6=⊥ ∧getRedex(t)6=⊥∧

getContractum(t)6=⊥

If the tree was constructed by a transformation, then its origin, redex, and contractum are defined.

(30)

Invariants

getOrigin(t)6=⊥ =⇒ ∀ti(getOrigin(ti)6=⊥)

If the origin is defined, then the origin of every child of t is

defined.

getRedex(t)6=⊥ ⇐⇒ getContractum(t)6=⊥

The redex is defined if and only if the contractum is defined. This is should be clear from each of their definitions.

(31)

Origins Implementation:

p

(v

, ...,

v

|

o

,

n

,

r

,

l

)

I r, the redex, is only defined on nodes where n (isNew

flag) is true.

I Thus, we compute the contractum from these values.

I σ,t,a,er `e →v

I a- attribute being computed I er - tree is root of final value

(32)

σ,t,a,true `var →h

σ,t,a,true `new var →duplicate(h,t,Lproda (t))

(E-EO-NewR)

σ,t,a,false `var →h

σ,t,a,false `newvar →duplicate(h,⊥,Lproda (t))

(E-EO-NewNR)

(33)

q =prod(*t) ∀i1

n(ei =newxi ∨ei =xi.attr)

∀i1

n(σ,t,a,false `ei ⇒vi)

σ,t,a,true `q(e1, ...,en)⇒q(v1, ...,vn|t,false,⊥,Lproda (t))

(E-EO-NotCntr)

¬(q =prod(*t) ∧ ∀i1

n(ei =newxi ∨ei =xi.attr))

∀in1(σ;t,a,false `ei →vi)

σ;t,a,true `q(e1, ...,en)→q(v1, ...,vn|t,true,t,L prod(t)

a )

(E-EO-CntrRoot)

∀i1

n(σ;t,a,false `ei →vi)

σ;t,a,false `q(e1, ...,en)→q(v1, ...,vn|t,true,⊥,Lproda (t))

(E-EO-CntrChild)

In the context ofσ;t,a,er `...→..., the value er flows

through if-then-else expressions and function calls.

(34)

Halide-inspired language extension

grad(x,y) = x + y { parallelize y; reorder y, x; } becomes

#pragma omp parallel for ... for y from 0 to yMax {

for x from 0 to xMax { grad[x][y] = x + y; } } I #pragma omp connects to parallelizevia origins through auxiliary “LoopIndex-ToParallelize” node I reordered for-loops connect toreorder

via origins and redex edges.

(35)
(36)

Future Work

I Full integration into Silver.

I Tools to make use of all of this data.

I This may be the genuinely hard part.

(37)

Questions?

Thanks for your attention.

http://melt.cs.umn.edu [email protected]

(38)

Eric Van Wyk and August Schwerdfeger.

Context-aware scanning for parsing extensible languages.

In Intl. Conf. on Generative Programming and Component

Engineering, (GPCE), pages 63–72. ACM, 2007.

August Schwerdfeger and Eric Van Wyk.

Verifiable composition of deterministic grammars.

In Proc. of Conf. on Programming Language Design and

Implementation (PLDI), pages 199–210. ACM, June 2009.

(39)

Ted Kaminski and Eric Van Wyk.

Modular well-definedness analysis for attribute grammars.

In Proc. of Intl. Conf. on Software Language Engineering

(SLE), volume 7745 of LNCS, pages 352–371.

Springer-Verlag, September 2012.

Lijesh Krishnan and Eric Van Wyk.

Termination analysis for higher-order attribute grammars.

In Proceedings of the 5th International Conference on

Software Language Engineering (SLE 2012), volume 7745

of LNCS, pages 44–63. Springer-Verlag, September 2012.

Lijesh Krishnan and Eric Van Wyk.

Monolithic and modular termination analysis for higher-order attribute grammars.

Science of Computer Programming, 96(4):511–526,

December, 2014.

http://cse.umn.edu/research/mndrive/ http://melt.cs.umn.edu

References

Related documents

Western blot analysis was used to compare the expression of different ALDH isozymes in normal human ovarian surface epithelial (HOSE) cell lines with cancer cell lines of

(1): Total mortality rates of adults of Sitophilus zeamais exposed to two lichen species extracts and secondary metabolites at different concentrations.. (2): Total

The issuance of the Note and the Company common stock on conversion or redemption of the Note will be exempt from registration pursuant to the provisions of Section 4(a)(2) of

For this, Vero cells were transfected with the different Rep constructs (wt Rep, Rep-K340H, Rep-D371Y) or a plasmid expressing the gene for enhanced green-fluorescent protein

It then discusses the impact of the market crisis beginning in 2007 on short sale regulation, the current debate over the Securities and Exchange Commission’s (“SEC”) revisions

Source: Stork Textile Printing Group, Developments in the Textile Printing Industry , 2002.... Worldwide

The AULI Program Steering Committee has set up several major initiatives independent of day-to-day standards maintenance responsibilities and the working groups activities

For life insurance companies that are considered public companies under the rules of the SEC, annual and quarterly financial information must be prepared under GAAP and filed with