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 asqi::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;