51
Generic Visitors in C++ Nicolas Tisserand <[email protected]> LRDE seminar, May 28, 2003

Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

  • Upload
    others

  • View
    10

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Generic Visitors in C++

Nicolas Tisserand <[email protected]>

LRDE seminar, May 28, 2003

Page 2: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Table of Contents

Table of Contents

Introduction .......................................................................................... 4

Visitor designs ..................................................................................... 5

First attempt ........................................................................................ 6

Multi methods ...................................................................................... 7

The visitor design pattern ....................................................................... 10

Visitor combinators ............................................................................... 13

What we want ...................................................................................... 19

Implementation techniques ................................................................ 20

Generic combinators ............................................................................. 21

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 1

Page 3: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Table of Contents

Acting as a Vanilla visitor ........................................................................ 24

Static composition................................................................................. 28

Self recursive combinator ....................................................................... 31

Traversal ............................................................................................. 34

Visitors ................................................................................................. 36

Presentation ........................................................................................ 37

Tiger use case ..................................................................................... 39

Conclusion ........................................................................................... 45

Applicability ......................................................................................... 46

Future ................................................................................................ 47

References ........................................................................................... 48

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 2

Page 4: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Table of Contents

Questions ............................................................................................. 50

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 3

Page 5: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Introduction

Introduction

• We have an abstract Syntax Trees (AST)

• We want to

. Walk the tree

. Perform actions on nodes (evaluation, printing ...)

→ We need an appropriate design

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 4

Page 6: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Visitor designs

Visitor designs

• First attempt

• Multi methods

• Visitor design pattern

• Visitor combinators

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 5

Page 7: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Visitor designs First attempt

First attempt

Naive design for a simple arithmetic expressions abstract syntax tree:

Adding a polymorphic operation requires modifying all the classes :(

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 6

Page 8: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Visitor designs Multi methods

Multi methods

• Generalized virtual methods (virtual on an arbitrary number ofchosen parameters)

• Work like external methods added to classes

Imaginary example:

void print ( virtual IntExp*) { / * . . . * / }void print ( virtual OpExp*) { / * . . . * / }

Exp* e = new IntExp(51));print (e); / / d i s p a t c h e s t o t h e f i r s t p r i n t m e t h o d ,

/ / a c c o r d i n g t o t h e d y n a m i c t y p e o f e

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 7

Page 9: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Visitor designs Multi methods

Multi methods

• They are available in some languages (CLOS, Nice, Perl6) ...

• ... but not in C++ :(C++ dispatches only the first (hidden) argument (this ) of a method

• They can be emulated using various tricks (Alexandrescu, 2001)

→ We must find something else

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 8

Page 10: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Visitor designs Multi methods

Towards an object model

• Encapsulate each processing in one class

• Hierarchy of processings

• Separate AST and Processings

• We need to dispatch over two hierarchies

→ Someone may already have encountered this problem ...

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 9

Page 11: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Visitor designs The visitor design pattern

The visitor design pattern

• Design patterns = Higher order abstractions

• Gamma et al. (Gamma et al., 1994)

• Also called Vanilla visitor

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 10

Page 12: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Visitor designs The visitor design pattern

Design

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 11

Page 13: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Visitor designs The visitor design pattern

Discussion

• Benefits

. Double dispatch

. Decoupling of two inter-dependent hierarchies

. Factor out default traversal code by inheritance.

• Drawbacks

. Mixing of traversal and behavioral code

. No genericity∗ accept methods are bound to a specific abstract visitor class∗ visit methods are specific to the target hierarchy

→ We do not want to write traversal code each time we write a visitor

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 12

Page 14: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Visitor designs Visitor combinators

Visitor combinators

• Joost Visser, CWI (Visser, 2001) (→ StrategoXT)

• Break a monolithic visitor into small atomic visitors

• Use combinators to compose these visitors between themand get the final visitor

• A visitor combinator acts like a function from visitor to visitor

• Dummy example :Compile = Sequence(Sequence(Escape, TypeCheck), Translate)

(Sequence : visitor * visitor -> visitor)

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 13

Page 15: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Visitor designs Visitor combinators

Sequence

struct Sequence : public ExpVisitor{

Sequence(ExpVisitor& first, ExpVisitor& second): first_(first), second_(second) {}

virtual void visit(OpExp& o){ o.accept(first_); o.accept(second_); }

virtual void visit(IntExp& i){ i.accept(first_); i.accept(second_); }

ExpVisitor& first_;ExpVisitor& second_;

};

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 14

Page 16: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Visitor designs Visitor combinators

Traversal combinators

• We now need to traverse nodes

• all(v) applies v to all the children of the accepting node

• traversal = all(traversal)

• topdown(v) = sequence(v, all(topdown(v)))applies v to all the subtrees of the accepting node, in a top-down fashion

• bottomup(v) = sequence(all(bottomup(v), v)) applies v toall the subtrees of the accepting node, in a bottom-up fashion

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 15

Page 17: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Visitor designs Visitor combinators

Topdown example

prefix_print = topdown(print)= sequence(print, all(prefix_print))

... once accepted by our example Exp AST

... outputs:+ * 5 10 1

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16

Page 18: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Visitor designs Visitor combinators

Conditional combinators

• fail throws a VisitFailure exception

• sequence works like “and ”

• choice(v1, v2) let a node accept v1 firstlyand, in case of failure, v2 secondly

• choice works like “or ”

• Many other combinators exist: one , try ...

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 17

Page 19: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Visitor designs Visitor combinators

Discussion

• Benefits

. Traversal and behavioral code cleanly separated

. Re-usability improved

• Drawbacks

. Too dynamic

. Hierarchy specific

→ We do not want to rewrite a visitor combinator frameworkfor each target AST.

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 18

Page 20: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Visitor designs What we want

What we want

• Generic visitor combinators C++ library

• Instrument external visitable AST hierarchies

• No intrusion in target code

• Performance

• Ease of use

→ Use visitors combinators on any vanilla visitable hierarchy(like the LRDE Tiger compiler AST)

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 19

Page 21: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Implementation techniques

Implementation techniques

• Use genericity

• Adapt a foreign AST hierarchy

• Avoid dynamic binding

• Allow generic traversal

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 20

Page 22: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Implementation techniques Generic combinators

Generic combinators

• Some combinators (like identity or sequence)behave equally on any AST

• Wouldn’t it be possible to write them only once ?

→ Let’s try to benefit from C++ static genericity

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 21

Page 23: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Implementation techniques Generic combinators

Writing generic combinators

A generic Identity could be rewritten as follows:

template < class AbstractVisitor >struct Identity : public AbstractVisitor{

template < typename T >void visit (T& t) {}

};

However:

• This new combinator is still an abstract class

• template virtual methods are illegal

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 22

Page 24: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Implementation techniques Generic combinators

Writing generic combinators

• Generic combinators cannot be accepted directlyby a target AST node

• Static and dynamic dispatch are not compatible

• We must implement an adapter between the two dispatches

→ We need a generic way to build concrete classesimplementing any target visitor interface.

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 23

Page 25: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Implementation techniques Acting as a Vanilla visitor

Acting as a Vanilla visitor

• Visitors of the target hierarchy can be described by:

. the abstract visitor type

. the list of visited types

• Meta C++ features

. parameterized inheritance

. static lists

→ Let’s use some meta-programming

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 24

Page 26: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Implementation techniques Acting as a Vanilla visitor

Hierarchy Unrolling

We want a Visitor class parameterized by:

• static list of types List< Type1, List< Type2,

... List< TypeN > ... > >

• the abstract visitor type AbstractVisitor

... which generates, once instantiated:struct Visitor : public AbstractVisitor {

virtual void visit (Type1&) { / * . . . * / }virtual void visit (Type2&) { / * . . . * / }/ / . . .

virtual void visit (TypeN&) { / * . . . * / }};

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 25

Page 27: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Implementation techniques Acting as a Vanilla visitor

A solution

template < typename L, typename V >struct Visitor;

/ / B a s e s p e c i a l i z a t i o n .

template < typename T, typename Tail, typename V >struct Visitor < List < T, Tail >, V >: public Visitor < Tail, V > {

virtual void visit (T& t) { / * . . . * / }};

/ / L a s t e l e m e n t s p e c i a l i z a t i o n .

template < typename T, typename V, typename H >struct Visitor < List < T, Empty >, V > : public V {

virtual void visit (T& t) { / * . . . * / }};

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 26

Page 28: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Implementation techniques Acting as a Vanilla visitor

• The instantiated visitor inherits from N classes

• The virtual table is built once for the instantiated visitor

• No additional indirection

• Replace the “... ” in the visit methods of the previous codeby a delegation to an aggregated static visitor to makea static/dynamic adapter.

→ We can build arbitrary vanilla visitors without performance penalty

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 27

Page 29: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Implementation techniques Static composition

Static composition

• The type of parameters of many combinators (like sequence or choice)could be known at compile time

• We want to use this fact to avoid dynamic binding on visit methods calls

→ Let’s try to write a static choice combinator

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 28

Page 30: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Implementation techniques Static composition

Static composition

template < typename First, typename Second >struct Choice {

Choice (First& first, Second& second): first_(first), second_(second) {}

template < typename T >inline bool visit_ (T& t){ return first_.visit_ (t) || second_.visit_ (t); }

First& first_;Second& second_;

};

Those combinators are then combined using expression templates

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 29

Page 31: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Implementation techniques Static composition

Self recursive combinators ?

Static composition is nice, but ...

• self recursive types are impossible in C++

• we would like to write self recursive combinators

Think about : traversal = all ( traversal )

→ We need a way to “break” static composition

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 30

Page 32: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Implementation techniques Self recursive combinator

Self recursive combinator

• Concept coming from the Spirit parser framework (Spirit, 2001)

• Proxy for a static combinator

struct Combinator{

template < typename V >Combinator& operator = (V& v) {

v_ = new ConcreteCombinator < V > (v);return * this ;

}AbstractCombinator* v_; / / v i s i t m e t h o d s d e l e g a t e d t o v _

};

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 31

Page 33: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Implementation techniques Self recursive combinator

Self recursive combinators

• We can now use self-recursion:

Combinator top_down_v = v && all(top_down_v);

. rhs type is Sequence < V, All < Combinator > >

. a reference on topdown v can safely be taken before the end of itsinitialization

• An extra dynamic binding is used

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 32

Page 34: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Implementation techniques Self recursive combinator

Handy assignation

When trying to assign combinators, we can now write:

Combinator v = all(v1 && v2);

... instead of explicitly specifying the expression template return type:

All < Sequence < V1, V2 > > v = all(v1 && v2);

Similar results could be possible with the non-standardtypeof extension:

typeof(all(v1 && v2)) v = all(v1 && v2);

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 33

Page 35: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Implementation techniques Traversal

Traversal

• We want generic traversal combinators like all or one

• They need to know about node structures

→ We must find a way to describe the AST nodes

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 34

Page 36: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Implementation techniques Traversal

Adaptation

• Nodes can fall in three categories:

. n-ary nodes (number of children known at compile time)

. list nodes (dynamic number of children, iterator access)

. leaf nodes (no children)

• We describe them through traits specialization

• We use adapter classes, templated by static method pointersto ease traits specialization

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 35

Page 37: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Visitors

Visitors

• Presentation

• Tiger use case

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 36

Page 38: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Visitors Presentation

Presentation

• Target code (the AST to work on)

• Framework code (the Visitors library)

• Adapting code

• Client specific code

. Custom generic combinators

. Custom (AST specific) combinators

. Visitor instantiations and use

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 37

Page 39: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Visitors Presentation

Visitors Classes

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 38

Page 40: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Visitors Tiger use case

Tiger use case

Description of (a subset of) the Tiger AST:

struct TigerHierarchy / / T a r g e t h i e r a r c h y

{/ / A b s t r a c t v i s i t o r t y p e

typedef ast :: Visitor visitor_type;

/ / T y p e s o f t h e h i e r a r c h y

typedef List < IntExp, List < OpExp > > types;};

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 39

Page 41: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Visitors Tiger use case

Tiger use case

Specialization of the VisitedTypes traits:

/ / O p E x p

struct VisitedTypes < OpExp >: public NaryNode < OpExp,

List < Accessor < OpExp, Exp&,&OpExp :: left_get >,

List < Accessor < OpExp, Exp&,&OpExp :: right_get

> > > >{};

/ / I n t E x p

DECLARE_LEAF_NODE(ast :: IntExp);

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 40

Page 42: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Visitors Tiger use case

print type visitor

A combinator which prints the type of any node it visits:

struct PrintType{

template < typename T >bool visit_ (T& t){

const std :: type_info & ti = typeid (t);const char * type = ti.name ();os_ << type;return true ;

}};

static PrintType print_type;

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 41

Page 43: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Visitors Tiger use case

print type visitor

A combinator which prints the types of all the subtrees of thevisited node:

fifty_one.accept(visitor(top_down(print_type && print("\n"))));

... and its (demangled) output, when accepted by our sample Exp:ast::OpExpast::OpExpast::IntExpast::IntExpast::IntExp

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 42

Page 44: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Visitors Tiger use case

is const visitor

A combinator which succeeds if the node is a constant expressionand fails otherwise:

Match<OpExp> op_match;Match<IntExp> int_match;

Combinator<> is_const =int_match|| (op_match && all(is_const));

Visitor<> is_const_visitor =(is_const

&& *new Print("const"))|| * new Print("not const");

exp.accept(is_const_visitor);

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 43

Page 45: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Visitors Tiger use case

Problems

• There is a visit method for decs t (std::list < Decs * >) inthe Visitor interface, but no accept method in decs t

• Hybrid nodes like FunctionDec act simultaneously like a list node (thelist of parameters) and like a n-ary node (two children: the result andthe body)

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 44

Page 46: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Conclusion

Conclusion

• Applicability

• Future

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 45

Page 47: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Conclusion Applicability

Applicability

• Currently restricted to “well-formed” target AST hierarchies

• Writing adapting code for complex AST is harassing and error-prone

• Classical active libraries annoyances:

. Slow compilation

. Obfuscated code

. Cryptic error messages

. Compiler support

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 46

Page 48: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Conclusion Future

Future

Some possible improvements ...

• const ness

• static concept checks

• node substitutions

• placeholders a la FC++: (FC++, 2002)

Combinator top_down = sequence ( _1 , all (top_down (_1))))

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 47

Page 49: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

References

References

Alexandrescu, A. (2001). Modern c++ design, design patterns applied.

FC++ (2002). Homepage of fc++: functional programming in c++.

Gamma, Helm, Johnson, and Vlissides (1994). Design patterns, elementsof reusable object-oriented software.

Spirit (2001). Homepage of the spirit parser framework.

standard, C. (1998). Iso iec 14882 - programming languages – c++.

Tisserand, N. (2003). Generic visitors in c++ (technical report).

Visser, J. (2001). Visitor combination and traversal control.

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 48

Page 50: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

References

Vlissides, J. (1998). Pattern hatching: Design patterns applied.

Vlissides, J. (1999). Pattern hatching - visitor in frameworks.

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 49

Page 51: Generic Visitors in C++ - EPITA · 28/05/2003  · + * 5 10 1 Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 16. Visitor designs Visitor combinators Conditional

Questions

Questions

Generic Visitors in C++, Nicolas Tisserand - LRDE seminar, May 28, 2003 50