[proto] [ was Re: [spirit2] Trivial parser crashes ]

Joel de Guzman wrote:
Eric, It seems to be a problem with Spirit2's usage of proto extends. Here's what's happening: 1) Rule uses proto::extends 2) Rule implements operator %= On expressions: r %= some-expression; The rule's operator%= kicks in. However, on expressions: r %= r2; // r and r2 has the same type Then proto %= kicks in leaving it as a no-op. Nothing happens. Hence, the rhs is never "auto-assigned" to the lhs. I'm not sure how to deal with this. Do you have a hint? I place the original test code here. Tracing the code, the first %= works as expected while the second and third becomes no-ops calling proto operator %=.
-----------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------- Regards, -- Joel de Guzman http://www.boostpro.com http://spirit.sf.net

Joel de Guzman wrote:
You can disable proto's operator%= by specifying a domain with a grammar to proto::extends as described in the docs. You could also try defining a rule::operator%=(rule) member and see if that one gets picked up. -- Eric Niebler BoostPro Computing http://www.boostpro.com

Joel de Guzman wrote:
I checked and you just need to define an operator%= that takes a non-const RHS. Patch attached. Karma might need a similar patch. -- Eric Niebler BoostPro Computing http://www.boostpro.com Index: rule.hpp =================================================================== --- rule.hpp (revision 49819) +++ rule.hpp (working copy) @@ -90,6 +90,23 @@ } template <typename Expr> + friend rule& operator%=(rule& r, Expr& xpr) + { + typedef spirit::traits::is_component<qi::domain, Expr> is_component; + + // report invalid expression error as early as possible + //~ BOOST_MPL_ASSERT_MSG( + //~ is_component::value, + //~ xpr_is_not_convertible_to_a_parser, ()); + + // temp workaround for mpl problem + BOOST_STATIC_ASSERT(is_component::value); + + r.define(xpr, mpl::true_()); + return r; + } + + template <typename Expr> friend rule& operator%=(rule& r, Expr const& xpr) { typedef spirit::traits::is_component<qi::domain, Expr> is_component;
participants (3)
-
Eric Niebler
-
Eric Niebler
-
Joel de Guzman