more spirit madness - parser-types (rules vs int_parser<>) and meta-programming techniques

I'm not so sure I get the full extent of the question, but here are a few hints

  • The line commented with // THIS is what I need to do. compiles fine with me (problem solved? I'm guessing you actually meant assigning a parser, not a rule?)

  • Initialization of function-local static has been defined to be thread safe in the latest standard (C++11). Check your compiler support for C++0x threading. (If the initializer throws, a pass of the initialization statement will try to initialize again, by the way).

  • rules alias()

    As described in http://boost-spirit.com/home/articles/doc-addendum/faq/#aliases

    You can create 'logical copies' of rules without having to actually value-copy the proto expression. As the FAQ says, this is mainly to allow lazy-binding

  • The Nabialek Trick might be precisely what you need, basically it lazily selects a parser for subsequent parsing

    one = id;
    two = id >> ',' >> id;
    
    keyword.add
        ("one", &one)
        ("two", &two)
        ;
    
    start = *(keyword[_a = _1] >> lazy(*_a));
    

    In your context, I could see keyword defined as

    qi::symbols<char, qi::rule<Iterator>*> keyword;
    

    doing all the work with attributes from semantic actions. Alternatively,

    qi::symbols<char, qi::rule<Iterator, std::variant<std::string,int>() >*> keyword;
    
  • Bring the rules under the same type (like shown in the previous line, basically)

    This is the part where I'm getting confused: You say you want to unify your type system. There might not be a need for strongtyped parsers (distinct attribute signatures).

    typedef boost::variant<std::string,int> unified_type;
    typedef qi::rule<std::string::iterator, unified_type() > unified_rule;
    
    unified_rule rstring = +(qi::char_ - '.');
    unified_rule rint    = qi::int_;
    
    unified_rule combine = rstring | rint;