#pragma warning (disable:4100) #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using std::ostream; using std::ifstream; using std::cin; using std::string; using std::vector; using std::cout; using std::endl; namespace qi = boost::spirit::qi; namespace ascii = boost::spirit::ascii; namespace repo = boost::spirit::repository; using repo::confix; using boost::phoenix::function; using boost::phoenix::ref; using boost::phoenix::val; using namespace qi::labels; using qi::grammar; using qi::rule; using qi::eps; using qi::lexeme; using ascii::char_; using qi::int_; using qi::float_; using qi::double_; using qi::long_; using qi::locals; using ascii::alpha; using ascii::alnum; using ascii::graph; using ascii::print; using ascii::space; using ascii::cntrl; using boost::shared_ptr; using boost::apply_visitor; using boost::phoenix::bind; using boost::phoenix::new_; using boost::spirit::qi::unused_type; typedef const char* Iterator; struct Print { template struct result { typedef float type; }; float operator()(const float a) const { printf_s("float:%f\n", a); return a; } }; typedef unsigned char uint8_t; enum Option { IF_MODE, ELSE_MODE, }; struct MyGrammar : grammar { MyGrammar() : base_type(Root) { Root = ( qi::float_ ) [_val = Print(_1)] ; } rule Root; function Print; }; void main() { MyGrammar grammar; cout << "Enter floating:" << endl; string str; while (getline(cin, str)) { if (str.empty() || str[0] == 'q' || str[0] == 'Q') { break; } Iterator iter = (Iterator)str.c_str(); Iterator end = iter + str.length(); float result; bool r = phrase_parse(iter, end, grammar, ascii::space, result); if (r && iter == end) { cout << "Float: " << result << endl; } else { string rest(iter, end); cout << "-------------------------\n"; cout << "Parsing failed\n"; cout << "stopped at: \": " << rest << "\"\n"; cout << "-------------------------\n"; } cout << "Enter query:" << endl; } cout << "Bye... :-) \n\n"; }