Boost logo

Boost Users :

Subject: Re: [Boost-users] Parsing math expression
From: Eloi Du Bois (eloi.du.bois_at_[hidden])
Date: 2010-11-30 09:25:00


Wow ! Excellent :)

I thought it would be more verbose than that.

Thank you very much,
Eloi Du Bois.

2010/11/30 Hartmut Kaiser <hartmut.kaiser_at_[hidden]>

> > > > Is there a simple math expression parser in boost ?
> > > > I only need to parse those kind of expression: "1+2/3".
> > > I believe Spirit is exactly what you're looking for. It has almost a
> dozen
> > > different calculator examples to choose from as a starting point for
> your
> > > needs.
> > >
> > > > I have been thinking on boost::spirit, but it is quite hard for what
> I
> > > > need.
> > > Why?
> >
> > I very enjoy playing with spirit, but I was looking for a 5-line code
> that
> > only boost have the secret...
>
> Well, not exactly five lines, but here is a simple calculator grammar
> written in Spirit:
>
> namespace qi = boost::spirit::qi;
>
> template <typename Iterator>
> struct calculator : qi::grammar<Iterator, qi::space_type>
> {
> calculator() : calculator::base_type(expression)
> {
> expression = term >> *( ('+' >> term) | ('-' >> term) ) ;
> term = factor >> *( ('*' >> factor) | ('/' >> factor) ) ;
> factor = qi::uint_ | '(' >> expression >> ')' |
> ('-' >> factor) | ('+' >> factor) ;
> }
> qi::rule<Iterator, qi::space_type> expression, term, factor;
> };
>
> And here is how to use it:
>
> std::string input("1+2/3");
> calculator<std::string::const_iterator> calc;
> if (phrase_parse(input.begin(), input.end(), calc, qi::space))
> std::cout << "successfully parsed: " << input << std::endl;
>
> Regards Hartmut
> ---------------
> http://boost-spirit.com
>
>
>
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/boost-users
>



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net