Hello,
     This is my first time using boost and spirit. I am trying to find construct a tree from a string input. While parsing I am trying to assign each created node a number. For this purpose I am using a inherited attribute, an integer reference. But when I check on the values assigned. It is not the value of the integer reference rather some other value (some consistent value). I am sure this must be something that I am overlooking. But I am not sure what exactly.

Thanks for your help,
Anand Kumar.

Code:


struct node;

struct term {
  bool visited;
  int cnt;
  int val;

  term(bool b = false, int cn = -1, int v = numeric_limits<int>::min())
  {
    visited = b;
    cnt = cn;
    val = v;
  }
};

BOOST_FUSION_ADAPT_STRUCT(
              ::term,
              (bool, visited)
              (int, cnt)
              (int, val)
              )

typedef boost::variant<term, boost::recursive_wrapper<node>> node_impl;

struct node {
  bool visited;
  int cnt;
  vector<node_impl> children;
};

BOOST_FUSION_ADAPT_STRUCT(
              ::node,
              (bool, visited)
              (int, cnt)
              (std::vector<::node_impl>, children)
              )

template<typename Iterator>
struct node_parser : qi::grammar<Iterator, node(), ascii::space_type> {

  qi::rule<Iterator, node(), ascii::space_type> start_r;
  qi::rule<Iterator, node(int&), ascii::space_type> node_r;
  qi::rule<Iterator, node_impl(int&), ascii::space_type> node_impl_r;

  node_parser() : node_parser::base_type(start_r)
  {
    using qi::int_;
    using qi::lexeme;
    using namespace qi::labels;
    using phoenix::ref;
    int cnt = 990;

    start_r %= node_r(phoenix::ref(cnt));
    node_r = ('{' >> +node_impl_r(_r1) >> '}') [at_c<0>(_val) = false, at_c<1>(_val) = _r1++, at_c<2>(_val) = _1];
    node_impl_r = ((lexeme['(' >> int_ >> ')'])[_val = phoenix::construct<term>(phoenix::val(false), _r1++, _1)]) | (node_r(_r1)[_val = _1]);
  }
};