#define BOOST_SPIRIT_USE_PHOENIX_V3
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
#include <boost/phoenix/function/adapt_function.hpp>
void add_operand(double& lhs, double rhs) { lhs += rhs; }
void sub_operand(double& lhs, double rhs) { lhs -= rhs; }
BOOST_PHOENIX_ADAPT_FUNCTION(void, add_, add_operand, 2)
BOOST_PHOENIX_ADAPT_FUNCTION(void, sub_, sub_operand, 2)
int main()
{
const std::string INPUT_DATA = "12e-1 + 3.4 - .67";
typedef std::string::const_iterator iterator_type;
iterator_type begin = std::begin(INPUT_DATA);
iterator_type end = std::end(INPUT_DATA);
namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::qi::ascii;
namespace phx = boost::phoenix;
bool ok;
double result;
{
using namespace qi;
auto parser =
double_ [_val = _1]
>> *( (lit('+') >> double_[add_(_val, _1)])
| (lit('-') >> double_[sub_(_val, _1)])
);
ok = phrase_parse(begin, end, parser, ascii::space, result);
}
if (ok && begin == end)
std::cout << "parsed, result = " << result << std::endl;
else
std::cout << "not parsed" << std::endl;
}
I2RlZmluZSBCT09TVF9TUElSSVRfVVNFX1BIT0VOSVhfVjMKI2luY2x1ZGUgPGJvb3N0L3NwaXJpdC9pbmNsdWRlL3FpLmhwcD4KI2luY2x1ZGUgPGJvb3N0L3NwaXJpdC9pbmNsdWRlL3Bob2VuaXguaHBwPgojaW5jbHVkZSA8Ym9vc3QvcGhvZW5peC9mdW5jdGlvbi9hZGFwdF9mdW5jdGlvbi5ocHA+Cgp2b2lkIGFkZF9vcGVyYW5kKGRvdWJsZSYgbGhzLCBkb3VibGUgcmhzKSB7IGxocyArPSByaHM7IH0Kdm9pZCBzdWJfb3BlcmFuZChkb3VibGUmIGxocywgZG91YmxlIHJocykgeyBsaHMgLT0gcmhzOyB9CgpCT09TVF9QSE9FTklYX0FEQVBUX0ZVTkNUSU9OKHZvaWQsIGFkZF8sIGFkZF9vcGVyYW5kLCAyKQpCT09TVF9QSE9FTklYX0FEQVBUX0ZVTkNUSU9OKHZvaWQsIHN1Yl8sIHN1Yl9vcGVyYW5kLCAyKQoKaW50IG1haW4oKQp7CiAgICBjb25zdCBzdGQ6OnN0cmluZyBJTlBVVF9EQVRBID0gIjEyZS0xICsgMy40IC0gLjY3IjsKICAgIHR5cGVkZWYgc3RkOjpzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGl0ZXJhdG9yX3R5cGU7CiAgICBpdGVyYXRvcl90eXBlIGJlZ2luID0gc3RkOjpiZWdpbihJTlBVVF9EQVRBKTsKICAgIGl0ZXJhdG9yX3R5cGUgZW5kICAgPSBzdGQ6OmVuZChJTlBVVF9EQVRBKTsKCiAgICBuYW1lc3BhY2UgcWkgICAgPSBib29zdDo6c3Bpcml0OjpxaTsKICAgIG5hbWVzcGFjZSBhc2NpaSA9IGJvb3N0OjpzcGlyaXQ6OnFpOjphc2NpaTsKICAgIG5hbWVzcGFjZSBwaHggICA9IGJvb3N0OjpwaG9lbml4OwoKICAgIGJvb2wgb2s7CiAgICBkb3VibGUgcmVzdWx0OwogICAgewogICAgICAgIHVzaW5nIG5hbWVzcGFjZSBxaTsKCiAgICAgICAgYXV0byBwYXJzZXIgPSAKICAgICAgICAgICAgICAgZG91YmxlXyAgICAgICAgICAgICAgICAgIFtfdmFsICA9IF8xXQogICAgICAgICAgICA+PiAqKCAgIChsaXQoJysnKSA+PiBkb3VibGVfW2FkZF8oX3ZhbCwgXzEpXSkKICAgICAgICAgICAgICAgICAgfCAobGl0KCctJykgPj4gZG91YmxlX1tzdWJfKF92YWwsIF8xKV0pCiAgICAgICAgICAgICAgICApOwoKICAgICAgICBvayA9IHBocmFzZV9wYXJzZShiZWdpbiwgZW5kLCBwYXJzZXIsIGFzY2lpOjpzcGFjZSwgcmVzdWx0KTsKICAgIH0KCiAgICBpZiAob2sgICYmIGJlZ2luID09IGVuZCkKICAgICAgICBzdGQ6OmNvdXQgPDwgInBhcnNlZCwgcmVzdWx0ID0gIiA8PCByZXN1bHQgPDwgc3RkOjplbmRsOwogICAgZWxzZQogICAgICAgIHN0ZDo6Y291dCA8PCAibm90IHBhcnNlZCIgPDwgc3RkOjplbmRsOwp9Cg==