The Aspect-Oriented Design of the ++ Parser Framework Puma C/C - - PowerPoint PPT Presentation

the aspect oriented design of the parser framework puma c
SMART_READER_LITE
LIVE PREVIEW

The Aspect-Oriented Design of the ++ Parser Framework Puma C/C - - PowerPoint PPT Presentation

The Aspect-Oriented Design of the ++ Parser Framework Puma C/C Matthias Urban Daniel Lohmann Olaf Spinczyk pure systems GmbH Friedrich-Alexander University Technical University Magdeburg Erlangen-Nuremberg Dortmund 9th International


slide-1
SLIDE 1

The Aspect-Oriented Design of the Puma C/C

++ Parser Framework

Matthias Urban

pure systems GmbH Magdeburg

Daniel Lohmann

Friedrich-Alexander University Erlangen-Nuremberg

Olaf Spinczyk

Technical University Dortmund

9th International Conference on Aspect-Oriented Software Development Industry Track – March 16, 2010

slide-2
SLIDE 2

What is Puma

Puma

A generic framework for applications that have to parse, analyze, and optionally transform various flavors of C and C

++ source code.

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Introduction 2

slide-3
SLIDE 3

What is Puma

Puma

A generic framework for applications that have to parse, analyze, and optionally transform various flavors of C and C

++ source code.

freely available under the GPL

https://svn.aspectc.org/repos/Puma/trunk 83,000 lines of code

developed and maintained by pure::systems GmbH, Magdeburg

internally used for the development of client-specific solutions commercial licenses and support available

used by – and implemented in – AspectC

++

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Introduction 2

slide-4
SLIDE 4

Puma Application Examples

The AspectC++ weaver ac++

aspect Cool { . . . }; int main() { . . . }

AspectC

++ Source

ac++ Weaver

Puma

. . . int main() { _Cool_invoke_a0(); . . . }

(Woven) C

++ Source

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Introduction 3

slide-5
SLIDE 5

Puma Application Examples

The AspectC++ weaver ac++

aspect Cool { . . . }; int main() { . . . }

AspectC

++ Source

ac++ Weaver

Puma

. . . int main() { _Cool_invoke_a0(); . . . }

(Woven) C

++ Source

A mutation testing tool for SystemC

SC_MODULE(adder) { sc_in<int> a, b; sc_out<int> sum; void do_add() { sum.write(a.read() + b.read()); } . . . };

SystemC Source

scm Mutator

Puma

SC_MODULE(adder) { sc_in<int> a, b; sc_out<int> sum; void do_add() { sum.write(a.read() + b.read()) + ERR; } . . . };

(Mutated) SystemC Source dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Introduction 3

slide-6
SLIDE 6

Concerns of a C/C

++ Parser

Primary job of a parser (greatly simplified)

read tokens from input stream (keywords, identifier, operator symbols) invoke matching grammar rules

Additional concerns (there are many!)

syntax tree construction tentative parsing error handling connection to the semantic analysis lookahead optimizations

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Introduction 4

slide-7
SLIDE 7

Concerns of a C/C

++ Parser

Primary job of a parser (greatly simplified)

read tokens from input stream (keywords, identifier, operator symbols) invoke matching grammar rules

Additional concerns (there are many!)

syntax tree construction tentative parsing error handling connection to the semantic analysis lookahead optimizations

State of the Art

(for example, gcc/g++)

All these concerns are tangled and scattered in the implementation!

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Introduction 4

slide-8
SLIDE 8

The Challenge

512 pages

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Introduction 5

slide-9
SLIDE 9

The Challenge

512 pages

816 pages of spec!

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Introduction 5

slide-10
SLIDE 10

The Challenge

512 pages

816 pages of spec!

700 pages

(without .NET!)

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Introduction 5

slide-11
SLIDE 11

The Challenge

512 pages

816 pages of spec!

700 pages

(without .NET!)

647 pages

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Introduction 5

slide-12
SLIDE 12

A Family of C/C

++ Parsers and Manipulators

Puma Input Languages C++ AspectC++ C Dialects MS Visual C++ GNU gcc/g++ Analyses CPP Parsing & Sem. Analysis Full Sem. Analysis AST Matching Transformation dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Introduction 6

slide-13
SLIDE 13

A Family of C/C

++ Parsers and Manipulators

Puma Input Languages C++ AspectC++ C Dialects MS Visual C++ GNU gcc/g++ Analyses CPP Parsing & Sem. Analysis Full Sem. Analysis AST Matching Transformation dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Introduction 6

slide-14
SLIDE 14

A Family of C/C

++ Parsers and Manipulators

Puma Input Languages C++ AspectC++ C Dialects MS Visual C++ GNU gcc/g++ Analyses CPP Parsing & Sem. Analysis Full Sem. Analysis AST Matching Transformation dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Introduction 6

slide-15
SLIDE 15

A Family of C/C

++ Parsers and Manipulators

Puma Input Languages C++ AspectC++ C Dialects MS Visual C++ GNU gcc/g++ Analyses CPP Parsing & Sem. Analysis Full Sem. Analysis AST Matching Transformation dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Introduction 6

slide-16
SLIDE 16

A Family of C/C

++ Parsers and Manipulators

Puma Input Languages C++ AspectC++ C Dialects MS Visual C++ GNU gcc/g++ Analyses CPP Parsing & Sem. Analysis Full Sem. Analysis AST Matching Transformation dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Introduction 6

slide-17
SLIDE 17

A Family of C/C

++ Parsers and Manipulators

Puma Input Languages C++ AspectC++ C Dialects MS Visual C++ GNU gcc/g++ Analyses CPP Parsing & Sem. Analysis Full Sem. Analysis AST Matching Transformation dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Introduction 6

slide-18
SLIDE 18

A Family of C/C

++ Parsers and Manipulators

Puma Input Languages C++ AspectC++ C Dialects MS Visual C++ GNU gcc/g++ Analyses CPP Parsing & Sem. Analysis Full Sem. Analysis AST Matching Transformation dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Introduction 6

slide-19
SLIDE 19

A Family of C/C

++ Parsers and Manipulators

Puma Input Languages C++ AspectC++ C Dialects MS Visual C++ GNU gcc/g++ Analyses CPP Parsing & Sem. Analysis Full Sem. Analysis AST Matching Transformation dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Introduction 6

slide-20
SLIDE 20

A Family of C/C

++ Parsers and Manipulators

Puma Input Languages C++ AspectC++ C Dialects MS Visual C++ GNU gcc/g++ Analyses CPP Parsing & Sem. Analysis Full Sem. Analysis AST Matching Transformation dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Introduction 6

slide-21
SLIDE 21

A Family of C/C

++ Parsers and Manipulators

Puma Input Languages C++ AspectC++ C Dialects MS Visual C++ GNU gcc/g++ Analyses CPP Parsing & Sem. Analysis Full Sem. Analysis AST Matching Transformation dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Introduction 6

slide-22
SLIDE 22

A Family of C/C

++ Parsers and Manipulators

Puma Input Languages C++ AspectC++ C Dialects MS Visual C++ GNU gcc/g++ Analyses CPP Parsing & Sem. Analysis Full Sem. Analysis AST Matching Transformation dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Introduction 6

slide-23
SLIDE 23

A Family of C/C

++ Parsers and Manipulators

Puma Input Languages C++ AspectC++ C Dialects MS Visual C++ GNU gcc/g++ Analyses CPP Parsing & Sem. Analysis Full Sem. Analysis AST Matching Transformation

Goal: Configurability and Extensibility

Separation of concerns crucial for success! ➥ Aspect-oriented design and implementation

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Introduction 6

slide-24
SLIDE 24

Focus of this Talk: Puma Parsers

Puma Input Languages C++ AspectC++ C Dialects MS Visual C++ GNU gcc/g++ Analyses CPP Parsing & Sem. Analysis Full Sem. Analysis AST Matching Transformation

Goal: Configurability and Extensibility

Separation of concerns crucial for success! ➥ Aspect-oriented design and implementation

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Introduction 6

slide-25
SLIDE 25

Agenda

1 Introduction 2 Design Methodology 3 Separation of Concerns in Puma 4 Achievements 5 Wrap up

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Design Methodology 7

slide-26
SLIDE 26

Obliviousness and Quantification demystified

C callee() P caller()

callee knows

Provider–Consumer Relationship without AOP

Event provider has to know event consumer Control flows specified in the direction of knowledge

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Design Methodology 8

slide-27
SLIDE 27

Obliviousness and Quantification demystified

C callee() P caller()

callee knows «aspect»

C exec("caller") P caller()

knows "caller"

Provider–Consumer Relationship with AOP

Event consumer has to know event provider Advice specifies control flows against the direction of knowledge ➥ the mechanism behind “obliviousness”

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Design Methodology 8

slide-28
SLIDE 28

Obliviousness and Quantification demystified

C callee() P caller()

callee knows «aspect» C exec("caller") P caller() "caller" knows

Provider–Consumer Relationship with AOP

Advice specifies control flows against the direction of knowledge Control flow specification is inherently loose ➥ the mechanism behind “quantification”

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Design Methodology 8

slide-29
SLIDE 29

Methodology: Aspect-Aware System Design

[USENIX 09]

Basic Idea: Separation of Concerns in the Implementation

  • ne feature per implementation unit

strict decoupling of policies and mechanisms ➥ use aspects as primary composition technique

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Design Methodology 9

slide-30
SLIDE 30

Methodology: Aspect-Aware System Design

[USENIX 09]

Basic Idea: Separation of Concerns in the Implementation

  • ne feature per implementation unit

strict decoupling of policies and mechanisms ➥ use aspects as primary composition technique

Design Principles → Development Idioms

  • 1. loose coupling
  • 2. visible transitions
  • 3. minimal extensions

by by by advice-based binding explicit join points extension slices

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Design Methodology 9

slide-31
SLIDE 31

Methodology: Aspect-Aware System Design

[USENIX 09]

Basic Idea: Separation of Concerns in the Implementation

  • ne feature per implementation unit

strict decoupling of policies and mechanisms ➥ use aspects as primary composition technique

Design Principles → Development Idioms

  • 1. loose coupling
  • 2. visible transitions
  • 3. minimal extensions

by by by advice-based binding explicit join points extension slices ➥ we partly give up the obliviousness idea!

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Design Methodology 9

slide-32
SLIDE 32

A Minimal Example

(also: AspectC

++ in 2 Minutes)

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Design Methodology 10

slide-33
SLIDE 33

A Minimal Example

(also: AspectC

++ in 2 Minutes)

class PreprocessorParser implements the ISO standard aspect GNUMacros extends it by gcc/g++’s predefined macros

GnuMacros is a minimal extension brought in as an extension slice into class PreprocessorParser integrated by advice-based binding to configure()

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Design Methodology 10

slide-34
SLIDE 34

Methodology: Roles of Aspects and Classes What to model as a class and what as an aspect?

< thing > is modelled as a class if – and only if – it is a distinguishable, instantiable concept of Puma:

a system component, instantiated internally on behalf of Puma a system abstraction, instantiated as objects on behalf of the user both are sparse → provide a minimal implementation only

  • therwise < thing > is an aspect!

we came up with three idiomatic aspect roles

extension aspects policy aspects upcall aspects

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Design Methodology 11

slide-35
SLIDE 35

Agenda

1 Introduction 2 Design Methodology 3 Separation of Concerns in Puma 4 Achievements 5 Wrap up

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Separation of Concerns in Puma 12

slide-36
SLIDE 36

Aspect-Aware System Abstractions

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Separation of Concerns in Puma 13

slide-37
SLIDE 37

Aspect-Aware System Abstractions

struct CSyntax : public Syntax { struct Literal { static bool check (CSyntax &s) { return s.literal(); } static bool parse (CSyntax &s) { return s.token(ID); } }; virtual bool literal() { return Literal::parse(*this); } struct Primary { static bool check (CSyntax &s) { return s.primary(); } static bool parse (CSyntax &s) { return Literal::check(s) || (s.token(’(’) && Expr::check(s) && s.token(’)’)); } }; virtual bool primary() { return Primary::parse(*this); } . . . }; dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Separation of Concerns in Puma 14

slide-38
SLIDE 38

Aspect-Aware System Abstractions

struct CSyntax : public Syntax { struct Literal { static bool check (CSyntax &s) { return s.literal(); } static bool parse (CSyntax &s) { return s.token(ID); } }; virtual bool literal() { return Literal::parse(*this); } struct Primary { static bool check (CSyntax &s) { return s.primary(); } static bool parse (CSyntax &s) { return Literal::check(s) || (s.token(’(’) && Expr::check(s) && s.token(’)’)); } }; virtual bool primary() { return Primary::parse(*this); } . . . }; dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Separation of Concerns in Puma 14

slide-39
SLIDE 39

Aspect-Aware System Abstractions

struct CSyntax : public Syntax { struct Literal { static bool check (CSyntax &s) { return s.literal(); } static bool parse (CSyntax &s) { return s.token(ID); } }; virtual bool literal() { return Literal::parse(*this); } struct Primary { static bool check (CSyntax &s) { return s.primary(); } static bool parse (CSyntax &s) { return Literal::check(s) || (s.token(’(’) && Expr::check(s) && s.token(’)’)); } }; virtual bool primary() { return Primary::parse(*this); } . . . };

Grammar rule → a virtual function and an inner class

virtual function delegates implementation to inner class inner class

  • unambigious scope for minimal extensions

class members

  • unambigious join points for visible transitions

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Separation of Concerns in Puma 14

slide-40
SLIDE 40

Simple Policy Aspect: Backtracking Support

aspect SyntaxState { // intercept all calls of rules (after dynamic dispatch) advice Syntax::rule_call() : around () { Syntax &s = *tjp->arg<0>(); // get 0th argument (CSyntax obj.) Syntax::State state; // local variable to store state s.get_state(state); // save current parser state tjp->proceed(); // perform the intercepted call if (!*tjp->result()) // check whether result is false s.set_state(state); // restore the state } };

SyntaxState implements a mandatory, but crosscutting policy

currently matches 104/118 grammar rules in the C/C

++ syntax

implementation as aspects keeps backtracking policy configurable

inherently scales with extension aspects that add more rules

VisualC

++, GNU, AspectC ++, OpenMP, MPI, C ++ 1x, . . . dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Separation of Concerns in Puma 15

slide-41
SLIDE 41

Extension/Upcall Aspects: Syntax Tree Construction

CSyntax CSyntax Syntax Syntax

advice "CSyntax::Literal" : slice struct { static CTree *build(CSyntax &s) { return new CT_Literal(s.get_node(0)); } }; advice "CSyntax::Primary" : slice struct { static CTree *build(CSyntax &s) { if (s.nodes() == 3) return new CT_BracedExpr(s.get_node(0), s.get_node(1), s.get_node(2)); else return s.get_node(0); } }; ...

Literal Literal Primary Primary Expr Expr

extensions of the syntax rule classes by build() functions

...

<aspect>

CBuilder

CBuilder extends grammar rules for syntax tree construction

each rule gets a build() method to construct corresponding element

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Separation of Concerns in Puma 16

slide-42
SLIDE 42

Extension/Upcall Aspects: Syntax Tree Construction

CSyntax CSyntax Syntax Syntax

advice "CSyntax::Literal" : slice struct { static CTree *build(CSyntax &s) { return new CT_Literal(s.get_node(0)); } }; advice "CSyntax::Primary" : slice struct { static CTree *build(CSyntax &s) { if (s.nodes() == 3) return new CT_BracedExpr(s.get_node(0), s.get_node(1), s.get_node(2)); else return s.get_node(0); } }; ...

Literal Literal Primary Primary Expr Expr

extensions of the syntax rule classes by build() functions

...

advice for ...::parse() → control flow redirection to introduced build() functions <aspect>

CBuilder

<aspect>

Builder

extensions of Syntax::State with Builder state information advice Syntax::rule_call(): after () { if (*tjp->result()) { Tree *t = JoinPoint::Target::build(*tjp->arg<0>()); if (t) tjp->arg<0>()->push_node(t); else *tjp->result () = false; } } ...

CBuilder extends grammar rules for syntax tree construction

each rule gets a build() method to construct corresponding element

Builder binds this extension by upcalls

each rule invokation by the parser now also triggers build()

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Separation of Concerns in Puma 16

slide-43
SLIDE 43

Extension Aspects: Language Extensions

Dialect aspects extend both, CSyntax and CCSyntax

facilitates implicit reuse of C extensions in the C

++ parser dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Separation of Concerns in Puma 17

slide-44
SLIDE 44

Extension Aspects: Language Extensions

Dialect aspects extend both, CSyntax and CCSyntax

facilitates implicit reuse of C extensions in the C

++ parser

Example for loose coupling

In C-only projects, CCSyntax is just not present C

++ extensions are silently skipped

inherent property of advice-based binding

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Separation of Concerns in Puma 17

slide-45
SLIDE 45

Agenda

1 Introduction 2 Design Methodology 3 Separation of Concerns in Puma 4 Achievements 5 Wrap up

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Achievements 18

slide-46
SLIDE 46

Separation of Concerns Configurability

Puma Input Languages C++ AspectC++ C Dialects MS Visual C++ GNU gcc/g++ Analyses CPP Parsing & Sem. Analysis Full Sem. Analysis AST Matching Transformation

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Achievements 19

slide-47
SLIDE 47

Separation of Concerns Configurability

Puma Input Languages C++ AspectC++ C Dialects MS Visual C++ GNU gcc/g++ Analyses CPP Parsing & Sem. Analysis Full Sem. Analysis AST Matching Transformation

Achieved: Complete “Plug & Play” of Features

Loose coupling of feature implements distinct sets of implementation units integrate themselves by advice-based binding

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Achievements 19

slide-48
SLIDE 48

Separation of Concerns Maintainability

LoC taken by the C parser and C

++ parser implementations

cpp-parser.cc

22,964

c-parser.c

8,676

GNU CCParser.cc

2,802

CParser.cc

1,786

Puma

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Achievements 20

slide-49
SLIDE 49

Separation of Concerns Maintainability

LoC taken by the C parser and C

++ parser implementations

cpp-parser.cc

22,964

c-parser.c

8,676

GNU CCParser.cc

2,802

CParser.cc

1,786

Puma

Achieved: Cost Effectiveness Even though Puma is a complex piece of software, it remains maintainable by a single, part-time engineer.

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Achievements 20

slide-50
SLIDE 50

Separation of Concerns Extensibility

An unanticipated Extension: C

++ 1x static assertions

static assert ( constant-expr, error-message) ;

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Achievements 21

slide-51
SLIDE 51

Separation of Concerns Extensibility

An unanticipated Extension: C

++ 1x static assertions

static assert ( constant-expr, error-message) ;

We could translate the impact description (“proposed wording”)

  • f this new C

++ feature almost literally into aspect code

policy aspect for binding the code and

[LoC]

enabling/disabling it by a new command line options 112 syntax tree class for static assertions 102 syntax rule (extension slice) 77 syntax tree creation (extension slice) 73 function for semantic analysis (extension slice) 100

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Achievements 21

slide-52
SLIDE 52

Separation of Concerns Extensibility

An unanticipated Extension: C

++ 1x static assertions

static assert ( constant-expr, error-message) ;

“A compiler writer could certainly implement this feature, as specified, in two or three days. . . ”

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Achievements 21

slide-53
SLIDE 53

Separation of Concerns Extensibility

An unanticipated Extension: C

++ 1x static assertions

static assert ( constant-expr, error-message) ;

“A compiler writer could certainly implement this feature, as specified, in two or three days. . . ” It took us just one day! including documentation and testing including extra work for the very first C

++ 1x feature

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Achievements 21

slide-54
SLIDE 54

Agenda

1 Introduction 2 Design Methodology 3 Separation of Concerns in Puma 4 Achievements 5 Wrap up

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Wrap up 22

slide-55
SLIDE 55

Summary and Conclusions

A Parser for “real-world” C/C

++ code is a complex thing

Many concerns to deal with C

++ is one of the most challenging languages at all

Various language dialects and extensions

Puma copes well with this variability and complexity

Relatively small code base, separation of concerns Configurability Extensibility

Achieved by AOP and an aspect-aware design

Sparse classes, explicit join points Employed aspects as the fundamental extension and binding mechanism “Plug&Play” configuration and extension

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Wrap up 23

slide-56
SLIDE 56

Future Work

Advertise it more! :-)

Puma is the best and most feature-complete open-source C

++ analysis and transformation framework we are aware of!

(BTW: commercial support is available as well. . . ) But it is still a bit hidden (published as part of AspectC

++)

Incorporate C

++ 1x features

Incrementally, start with the most probable ones A lot of work, but we are now optimistic that this is feasible!

Get Puma at:

https://svn.aspectc.org/repos/Puma/trunk

dl@cs.fau.de The Puma C/C

++ Parser Framework (AOSD ’10)

Wrap up 24