Joel Falcou wrote:
How can I write a grammar that accept a given set of terminal and
functions with up to N arguments
(for example accepting function with 1 to 5 arguments but not 6 or more) ?
I believe i can count the elements of vararg using mpl::size ons ome
proto::arg_ or proto::value maybe
but how to prevent those who violates this condition be removed from the
accepted functions et ?
thanks in advance
You can use proto::if_ with some mpl meta-functions and proto::arity_of.
See below:
#include
#include
#include
#include
namespace mpl = boost::mpl;
namespace proto = boost::proto;
using proto::_;
struct ArityLessThan3
: proto::or_<
proto::terminal<_>
, proto::and_<
proto::function< proto::vararg<ArityLessThan3> >
, proto::if_< mpl::less< proto::arity_of<_>, mpl::long_<4> >() >
>
>
{};
template<class Expr> void assert_matches(Expr const &)
{
BOOST_MPL_ASSERT((proto::matches));
}
template<class Expr> void assert_not_matches(Expr const &)
{
BOOST_MPL_ASSERT_NOT((proto::matches));
}
int main()
{
proto::literal<int> i(0);
assert_matches(i);
assert_matches(i());
assert_matches(i(i));
assert_matches(i(i,i));
assert_not_matches(i(i,i,i));
}
--
Eric Niebler
BoostPro Computing
http://www.boostpro.com