[Boost-users] Parsing math expression

623 views
Skip to first unread message

Eloi Du Bois

unread,
Nov 30, 2010, 8:46:30 AM11/30/10
to boost...@lists.boost.org
Hi all,

Is there a simple math expression parser in boost ?
I only need to parse those kind of expression: "1+2/3".

I have been thinking on boost::spirit, but it is quite hard for what I need.
- Eloi.

Hartmut Kaiser

unread,
Nov 30, 2010, 8:53:06 AM11/30/10
to boost...@lists.boost.org
> 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?

Regards Hartmut
---------------
http://boost-spirit.com

_______________________________________________
Boost-users mailing list
Boost...@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-users

Eloi Du Bois

unread,
Nov 30, 2010, 9:05:02 AM11/30/10
to boost...@lists.boost.org
I very enjoy playing with spirit, but I was looking for a 5-line code that only boost have the secret...

Anyway, thank you !

2010/11/30 Hartmut Kaiser <hartmut...@gmail.com>

Torri, Stephen CIV NSWCDD, W15

unread,
Nov 30, 2010, 9:17:36 AM11/30/10
to boost...@lists.boost.org
>From: boost-use...@lists.boost.org on behalf of Eloi Du Bois
>Sent: Tue 11/30/2010 9:05 AM
>To: boost...@lists.boost.org
>Subject: Re: [Boost-users] Parsing math expression

>
>I very enjoy playing with spirit, but I was looking for a 5-line code that only boost have the secret...
>
>Anyway, thank you !

Before I comment on using or not using Spirit what exactly are you trying to do? From what I can see you are trying to parse a single-digit numbers and only support addition and division. Is that correct?

Stephen

Hartmut Kaiser

unread,
Nov 30, 2010, 9:22:08 AM11/30/10
to boost...@lists.boost.org
> > > 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;

Eloi Du Bois

unread,
Nov 30, 2010, 9:25:00 AM11/30/10
to boost...@lists.boost.org
Wow ! Excellent :)

I thought it would be more verbose than that.

Thank you very much,
Eloi Du Bois.

2010/11/30 Hartmut Kaiser <hartmut...@gmail.com>

Eloi Du Bois

unread,
Nov 30, 2010, 9:28:08 AM11/30/10
to boost...@lists.boost.org
Sorry, but I meant that it has to compute the final result.
What would you recommend to do that ?

2010/11/30 Eloi Du Bois <eloi.d...@gmail.com>

Hartmut Kaiser

unread,
Nov 30, 2010, 9:41:22 AM11/30/10
to boost...@lists.boost.org
> Sorry, but I meant that it has to compute the final result.
> What would you recommend to do that ?

Why don't you look for yourself here: $BOOST_ROOT/libs/spirit/example/qi/calc3.cpp (or any of the more complex calculator examples)?

Eloi Du Bois

unread,
Nov 30, 2010, 9:47:01 AM11/30/10
to boost...@lists.boost.org
Ok, thank you for the link.

2010/11/30 Hartmut Kaiser <hartmut...@gmail.com>
Reply all
Reply to author
Forward
0 new messages