|
Boost : |
From: John Ky (newhoggy_at_[hidden])
Date: 2006-01-23 22:13:24
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_at_[hidden]> 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
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk