Re: boost::spirit and boost in general for c++ people.

  • From: "Littlefield, Tyler" <tyler@xxxxxxxxxxxxx>
  • To: programmingblind@xxxxxxxxxxxxx
  • Date: Thu, 07 Apr 2011 09:29:59 -0600

Haha, I got what you ment. It feels kind of messy at first, but you get used to it. The thing that sucks is there aren't to many ways to do this in c++. Boost::bind is a great example. I'm lifting my events from global functions to being actual member functions, which means I have to do something like: events.AddCallback("Heartbeat", boost::bind(&Player::OnlineTime, this, _1, _2); Not exactly the best of code in terms of readability, but it is one of the easier ways (and cleaner) to do what I want.

On 4/7/2011 9:26 AM, Sina Bahram wrote:
And btw, I don't mean Tyler's code.

Ty, your code is fine, man. I meant the code in genral. As in, the syntax and 
just the style of coding, not your implementation of
it.

Take care,
Sina

-----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 //www.freelists.org/list/programmingblind

Other related posts: