
Hi Hartmut, Thanks for the help. I got it to work with an extra ::context_t in: typedef rule<strlit_closure::context_t> rule_type; Is that the correct way to do it? Also, I have another problem: The rule: rule_string mystringrule; mystringrule = * ( confix_p('"', (*c_escape_ch_p)[mystringrule.val += construct_<string>(arg1, arg2)], "') ); Will match: "hello""world" as: helloworld But the rule: rule_string mystringrule; mystringrule = * ( confix_p('"', (*c_escape_ch_p)[mystringrule.val += construct_<string>(arg1, arg2)], "') | (anychar_p - '"') /* this line added */ ); matched returning an empty string. -John On 1/24/06, Hartmut Kaiser <hartmut.kaiser@gmail.com> wrote:
John Ky wrote:
Is it possible to define a rule:
rule<> mystringrule = confix_p('"', *c_escape_ch_p, '"')
differently such that I can use
std::string value;
bool result = parse("\"hello world\"", mystringrule[assign_a(value)]).full;
and get the text = "hello world" assigned to value?
Currently, I get text = "\"hello world\"" instead. ie with double quotes at either end.
I'ld suggest to use closures for that (not tested):
struct strlit_closure : public boost::spirit::closure<strlit_closure, std::string> { member1 val; };
typedef rule<strlit_closure> rule_type;
rule_type mystringrule = confix_p('"', *c_escape_ch_p[assign_a(mystringrule.val)], '"');
bool result = parse("\"hello world\"", mystringrule[assign_a(value)]).full;
This is based on the fact, that the first closure member of a rule is used as the rule's value.
HTH Regards Hartmut