#ifndef _TESTGRAMMAR_H
#define _TESTGRAMMAR_H


#include <boost/spirit/core.hpp>
#include <boost/spirit/actor/assign_actor.hpp>
#include <boost/spirit/actor/increment_actor.hpp>
#include <boost/bind.hpp>

#include <boost/spirit/phoenix/primitives.hpp>
#include <boost/spirit/phoenix/operators.hpp>
using namespace boost;
using namespace boost::spirit;
using namespace phoenix;



template<class Actions>
class TestGrammar : public grammar<TestGrammar<Actions> > {
  public:
    TestGrammar(Actions & actions);

    template<typename ScannerT>
    class definition {
      private:
        rule<ScannerT> cmdline;


      public:
        definition(const TestGrammar<Actions> & self);

        rule<ScannerT> const & start();

    };
    

  private:
    Actions & actions;

};
template<class Actions>
TestGrammar<Actions>::TestGrammar(Actions & actions):actions(actions) {
}

template<class Actions>
template<typename ScannerT>
TestGrammar<Actions>::definition<ScannerT>::definition(const TestGrammar<Actions> & self) {
  Actions & actions = self.actions;
  cmdline
    =
    int_p[bind(&Actions::addNumber, ref(actions), _1)] >>
    *(ch_p(',') >> int_p) >> end_p;
}

template<class Actions>
template<typename ScannerT>
rule<ScannerT> const & TestGrammar<Actions>::definition<ScannerT>::start() {
  return cmdline;
}

#endif

