I'am trying to attach a simple semantic action to my grammar using boost spirit.
This is my code:
#define BOOST_SPIRIT_NO_REGEX_LIB
#include "regex.h"
#include "spirit.hpp"
#include "spirit/actor/assign_actor.hpp"
#include <boost/spirit/include/karma.hpp>
#include <boost/spirit/include/support_utree.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/fusion/include/std_pair.hpp>
#include <boost/config/warning_disable.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/bind.hpp>
#include <iostream>
#include <string>
using namespace std;
using namespace boost::spirit;
using boost::phoenix::bind;
// A plain function
void dummy( )
{
int i=20;
std::cout << i << std::endl;
}
struct my_enum : public grammar<my_enum>
{
template <typename ScannerT>
struct definition
{
definition(my_enum const& self)
{
enum_specifier = enum_p >> '{' >> enum_list >> '}' [boost::phoenix::bind(dummy)];
enum_p = str_p("enum");
enum_list = +id_p >> *(',' >> +id_p);
id_p = range_p('a','z');
}
rule<ScannerT> enum_specifier, enum_p, enum_list, id_p;
rule<ScannerT> const& start() const { return enum_specifier; }
};
};
string input = "enum { ah, bk, ss }";
int main ()
{
my_enum e;
int status = parse(input.c_str(), e, space_p).hit;
cout << status << endl;
return 0;
}
I get an infinite error that I am not able to understand. COuld someone can give me some advice/Example about how to map semantic functions?