|
Boost : |
From: Joel de Guzman (joel_at_[hidden])
Date: 2003-11-05 18:37:55
Brian McNamara <lorgon_at_[hidden]> wrote:
>> Parser-decorators, for example, can call that function anytime post-parse.
>> For instance, closures set the match's value post-parse:
>>
>> template <typename ResultT, typename ParserT, typename ScannerT>
>> ResultT& post_parse(ResultT& hit, ParserT const&, ScannerT const&)
>> {
>> hit.value(frame[phoenix::tuple_index<0>()]);
>> return hit;
>> }
>
> Ah, I see. Makes sense.
> Will the prior value of "hit" necessarily have been a "successful match"?
Yes, when post-parse is called, we definitely have a successful match.
> Will the prior value of "hit" necessarily have a "valid attribute"?
No, not necessarily. For reference attributes however, I don't have
a case yet where a parser returns an invalid reference with a successful
match. I'm not sure if it's possible to fall into such a case.
>> The important thing to note that the validity of an attribute of a match
>> is not at all related to it's "success". While an unsuccessful match
>> definitely cannot have a valid attribute, a successful match *can* have
>> an invalid attribute. This flexibility allows composing parsers to set
>> attributes to an initially invalid match attribute. To clarify a bit
> One more quick question: for this use-case,
>
>>>> match<int> m; // unitialized
>>>> m.value(3); // initializes m
>
> when does this "happen" in practice? Maybe in a closure where the first
> iteration results in no value but the second iteration does? I'm still
> in the dark, here.
Consider this rule:
r = epsilon_p[ r.val = 123 ];
a) r returns a match<int>, corresponding to it's closure member val.
b) epsilon_p returns a match<nil_t>
c) r invokes epsilon_p: hit = eps.parse(input);
c.1) hit has type match<int>
c.2) eps.parse(input) has return type match<nil_t>
c.3) assigning a mismatch match yields an invalid attribute.
c.4) hit's attribute is invalid
d) eps' semantic action stores 123 into r's closure member val.
e) r is about to return with an invalid attribute
f) the closure 'decorator's post-parse function is called.
g) closure member val (with a value of 123) is places in the match<int>
h) r returns the match<int> with a value of 123
I tried to avoid making it seem long and winding, but this is the best
I can do. I hope this doesn't cause more confusion?
Regards,
-- Joel de Guzman http://www.boost-consulting.com http://spirit.sf.net
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk