RE: boost::spirit and boost in general for c++ people.
- From: "Ken Perry" <whistler@xxxxxxxxxxxxx>
- To: <programmingblind@xxxxxxxxxxxxx>
- Date: Thu, 7 Apr 2011 13:09:57 -0400
I have always hated spirit for its um not nice way of doing things. I
actually like bison grammer over it.
Ken
-----Original Message-----
From: programmingblind-bounce@xxxxxxxxxxxxx
[mailto:programmingblind-bounce@xxxxxxxxxxxxx] On Behalf Of Sina Bahram
Sent: Thursday, April 07, 2011 11:22 AM
To: programmingblind@xxxxxxxxxxxxx
Subject: RE: boost::spirit and boost in general for c++ people.
Good god, this is ugly.
Seriously, you guys find that code easy to read?
Take care,
Sina
-----Original Message-----
From: programmingblind-bounce@xxxxxxxxxxxxx
[mailto:programmingblind-bounce@xxxxxxxxxxxxx] On Behalf Of Ken Perry
Sent: Thursday, April 07, 2011 10:07 AM
To: programmingblind@xxxxxxxxxxxxx
Subject: RE: boost::spirit and boost in general for c++ people.
Snicker welcome to the future... Hmm how many times have I told you to use
it and you told me no???
Ken
-----Original Message-----
From: programmingblind-bounce@xxxxxxxxxxxxx
[mailto:programmingblind-bounce@xxxxxxxxxxxxx] On Behalf Of Littlefield,
Tyler
Sent: Thursday, April 07, 2011 9:09 AM
To: programmingblind@xxxxxxxxxxxxx
Subject: boost::spirit and boost in general for c++ people.
hello all:
Recently I got into using boost a bit and started finding uses for it
all over the place. I would like to encourage those who haven't yet and
use c++ to check it out; it is quite powerful and can eas some of your
work and provide really cool features along the way. For example:
boost::function lets you take callbacks in multiple forms; boost::bind
will let you bind a functor to it's arguments and pass that as your
callback, which means you can bind to a static member function, a member
function (and pass the object with boost::ref), a global function and
you can also use boost::lambda.
There are many more utilities out there; I highly recommend checking out
boost::asio, boost::fusion, boost::function and boost::bind.
In the spirit of convincing you all, I wrote a small calculator program
that does single operations (1+3, 3*5), etc and returns the result.
My next step is to split up my parsing into different rulesets and then
work on generating an AST so that I can handle larger more complex
calculations.
/*
A simple calculator, supports multiplication, division, addition and
subtraction.
*/
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <iostream>
#include <string>
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/fusion/container/vector.hpp>
#include <boost/fusion/container/vector/convert.hpp>
#include <boost/fusion/include/io.hpp>
namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;
namespace phoenix = boost::phoenix;
struct calculation
{
int a, b;
char op;
};
BOOST_FUSION_ADAPT_STRUCT(calculation, (int, a) (char, op) (int, b) )
template <typename iterator>
class CParser:public qi::grammar<iterator, calculation(),
qi::ascii::space_type>
{
qi::rule <iterator, calculation(), qi::ascii::space_type> crule;
public:
CParser():CParser::base_type(crule)
{
using qi::ascii::char_;
using qi::int_;
crule %= (int_ >>
(char_('+')|char_('-')|char_('*')|char_('/')) >>
int_);
}
};
int main()
{
CParser<std::string::iterator> p;
std::string str;
calculation result;
std::cout << "Enter your calculation>";
getline(std::cin, str);
bool r = phrase_parse(str.begin(), str.end(), p, qi::ascii::space,
result);
if (r)
{
std::cout << "a: " << result.a << " b: " << result.b << " op: "
<< result.op << std::endl;
switch(result.op)
{
case '+':
std::cout << "Result: " << (result.a + result.b) << std::endl;
break;
case '-':
std::cout << "result: " << (result.a - result.b) << std::endl;
break;
case '*':
std::cout << "Result: " << (result.a * result.b) << std::endl;
break;
case '/':
if (result.a == 0)
{
std::cout << "Division by zero error." << std::endl;
break;
}
std::cout << "result: " << (result.a / result.b) << std::endl;
break;
default:
std::cout << "Invalid operation." << std::endl;
}
}
else
{
std::cout << "Invalid input." << std::endl;
}
return 0;
}
--
Thanks,
Ty
__________
View the list's information and change your settings at
http://www.freelists.org/list/programmingblind
__________
View the list's information and change your settings at
http://www.freelists.org/list/programmingblind
__________
View the list's information and change your settings at
http://www.freelists.org/list/programmingblind
__________
View the list's information and change your settings at
http://www.freelists.org/list/programmingblind
Other related posts:
- » boost::spirit and boost in general for c++ people. - Littlefield, Tyler
- » RE: boost::spirit and boost in general for c++ people. - Ken Perry
- » RE: boost::spirit and boost in general for c++ people. - Ken Perry
- » RE: boost::spirit and boost in general for c++ people. - Homme, James
- » Re: boost::spirit and boost in general for c++ people. - Littlefield, Tyler
- » RE: boost::spirit and boost in general for c++ people. - Homme, James
- » Re: boost::spirit and boost in general for c++ people. - Jared Wright
- » Re: boost::spirit and boost in general for c++ people. - Littlefield, Tyler
- » RE: boost::spirit and boost in general for c++ people. - Ken Perry
- » Re: boost::spirit and boost in general for c++ people. - Littlefield, Tyler
- » RE: boost::spirit and boost in general for c++ people. - Sina Bahram
- » RE: boost::spirit and boost in general for c++ people. - Sina Bahram
- » Re: boost::spirit and boost in general for c++ people. - Littlefield, Tyler
- » RE: boost::spirit and boost in general for c++ people. - Homme, James
- » RE: boost::spirit and boost in general for c++ people. - Ken Perry
- » RE: boost::spirit and boost in general for c++ people. - Ken Perry
- » RE: boost::spirit and boost in general for c++ people. - Sina Bahram
- » RE: boost::spirit and boost in general for c++ people. - Ken Perry
- » Re: boost::spirit and boost in general for c++ people. - Littlefield, Tyler
- » Re: boost::spirit and boost in general for c++ people. - Kerneels Roos
- » RE: boost::spirit and boost in general for c++ people. - Homme, James
- » Re: boost::spirit and boost in general for c++ people. - Littlefield, Tyler