I have a grammar that fully works. I'm in the process of now adding
semantic actions to actually *do* something, and I'm hitting a snag.
(BTW, I've used Boost::Spirit::Classic, but this is my first time w/ Qi)
Grammar:
template <typename Iterator>
struct FortranLineGrammar : grammar
{
FortranLineGrammar() :
FortranLineGrammar::base_type(start)
{
lvalue %= !hex_int >> lexeme[alpha >> *(alnum | '_')] >> *dim;
BOOST_SPIRIT_DEBUG_NODE(lvalue);
assignment = lvalue[ppp_print] >> "=" >> command;
BOOST_SPIRIT_DEBUG_NODE(assignment);
...
}
typedef rule string_rule_t;
string_rule_t lvalue;
};
Semantic action:
extern void ppp_print(std::string& b);
and later
void ppp_print(std::string& b)
{
std::cout << b << std::endl;
}
So, what I'm going for, is when an lvalue is encountered, to call
ppp_print with whatever matched that value.
Unfortunately, I'm only getting the first character?!?
Here is the debug output, not the right match, but I'm still tweaking
the grammar. Looking at the actions only...
PRINT *, 'AHHHH! '
<start>
<lvalue>
<try>PRINT *, 'AHHHH! '</try>
<dim>
<try> *, 'AHHHH! '</try>
<fail/>
</dim>
<success> *, 'AHHHH! '</success>
<attributes>[[P]]</attributes>
</lvalue>
So what gives?