Boost logo

Boost :

From: Dan Gohman (dgohman_at_[hidden])
Date: 2002-10-20 19:24:00

On Sun, Oct 20, 2002 at 08:35:43AM +0800, Joel de Guzman wrote:
> Any specific reason for the interest in parser contexts? Actually,
> its purpose is to make the framework extensible.

I wanted something a little more convenient than closures. Here's
a rough sketch of what I was doing:

 template<typename T>
 struct my_context
   struct base_t
     T value;
   typedef T attr_t;

   explicit my_context(base_t const& base) : m_base(base) {}

   template <typename ParserT, typename ScannerT>
   void pre_parse(ParserT const&, ScannerT const&) {}

   template <typename ResultT, typename ParserT, typename ScannerT>
   ResultT& post_parse(ResultT& hit, ParserT const&, ScannerT const&)
     hit.value() = m_base.value;
     return hit;

   base_t const& m_base;

 // node types for AST
 struct node_a { /* ... */ };
 struct node_b { /* ... */ };

Given the above, I then used this:

 rule< ScannerT, my_context<node_a*> > a;
 rule< ScannerT, my_context<node_b*> > b;

instead of this:

 struct node_a_closure : closure<node_a_closure, node_a*>
   member1 value;
 struct node_b_closure : closure<node_b_closure, node_b*>
   member1 value;
 rule< ScannerT, node_a_closure > a;
 rule< ScannerT, node_b_closure > b;


Dan Gohman

Boost list run by bdawes at, gregod at, cpdaniel at, john at