Top Banner
Generic Visitors in C++ Nicolas Tisserand <[email protected]> LRDE seminar, May 28, 2003
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

Aug 23, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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