Boost logo

Boost :

From: Larry Evans (cppljevans_at_[hidden])
Date: 2004-06-06 14:05:09


On 06/06/2004 11:12 AM, Eric Niebler wrote:
[snip]
> In addition, I have solved the cyclic/dangling reference problem. A
> regex can refer to other regexes or itself and it tracks changes to its
> referenced regexes. It lets you copy regex objects freely, even putting
> them in containers, and they keep their references alive. It works with
> nothing more sophisticated than shared_ptr and weak_ptr -- no garbage
> collection is necessary. No cycles are created ever, so no cycles need
> to be collected.
>
> There are only two questions:
> (1) is the rule-as-pointer metaphor acceptable? and
> (2) can we find a palatable syntax?
>
> The syntax issue is this: if we take assign to be shallow (creating
> aliases) we need a different syntax for deep assign. I am using *= to
> mean deep-assign. Perhaps there is a better solution.
>
The grammar_pipeline/{base,eff}/productions avoids the cycle problem
by just using indexes into a vector of "grammar expressions". IOW,
a non-terminal expression is create with nt_exp(unsigned nt_id), where
nt_id is an index into a vector of sole_ptr smart pointers
to the grammar expression defining the rhs of the non-terminal.
You might think this would lead to a "semi-dangling pointer" (a nt_exp
whose index points to a deleted vector of sole_ptr's); however,
deletion of the sole_ptr's delete's the rhs. Hence, the only
way to create such a semi-dangling pointer would be to create
a nt_exp somewhere other than on the rhs of a non-terminal. There's
that danger; however, I don't know that it's that significant.
If one want's to do that, he/she must clone the rhs.

Anyway, I may discover this won't work in the future, but right now
it looks OK to me.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk