2011-07-01 53 views
2

继解决的问题Boost Spirit: Error C2664, Cannot convert 'const boost::phoenix::actor<Eval>' to 'char',我还有一个问题:升压精神2.4.2:不能提取字符串

为什么使用下面的js_key和js_string的代码,我无法捕捉打印字符串格式为“STR”或'str'。那些总是空白!

例如:

输入:{"a":"aa", b:'c'} 实际输出:

{ 
str: 
str: 
str: b 
str: 
Successfully parsed the input as JSON! 

预期输出:

{ 
str: a 
str: aa 
str: b 
str: c 
Successfully parsed the input as JSON! 

敬请指教。谢谢!

#include <map> 
#include <string> 
#include <vector> 
#include <iostream> 

#include <boost/config/warning_disable.hpp> 
#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_stl.hpp> 
#include <boost/spirit/include/phoenix_object.hpp> 
#include <boost/spirit/include/phoenix_container.hpp> 
#include <boost/spirit/include/phoenix_function.hpp> 
#include <boost/spirit/include/phoenix_fusion.hpp> 
#include <boost/spirit/include/phoenix_bind.hpp> 
#include <boost/fusion/include/adapt_assoc_struct.hpp> 
#include <boost/fusion/include/io.hpp> 
#include <boost/bind.hpp> 
#include <boost/function.hpp> 

namespace qi = boost::spirit::qi; 
namespace ascii = boost::spirit::ascii; 
namespace phoenix = boost::phoenix; 

void print_char(char c) 
{ 
    std::cout << c << std::endl; 
} 

void print_str(std::string str) 
{ 
    std::cout << "str: " << str << std::endl; 
} 

template <typename Iterator> 
struct json_grammar : qi::grammar<Iterator, ascii::space_type> 
{ 
    json_grammar() : json_grammar::base_type(start) 
    { 
     using ascii::alpha; 
     using ascii::alnum; 
     using qi::long_long; 
     using qi::long_double; 
     using qi::lit; 
     using qi::char_; 
     using qi::lexeme; 

     // 
     start = 
      char_('{')    [phoenix::bind(&print_char, qi::_1)] 
      >> -(js_member % ',') 
      >> char_('}') 
     ; 
     // 
     js_member = 
      js_key     [phoenix::bind(&print_str, qi::_1)] 
      >> ':' >> js_value 
     ; 
     // 
     js_key = (alpha >> *alnum) | js_string 
     ; 
     // 
     js_string = js_single_quoted_str | js_double_quoted_str 
     ; 
     // 
     js_array = lit('[') >> -(js_value % ',') >> lit(']') 
     ; 
     // 
     js_bool = lit("true") | lit("false") 
     ; 
     // 
     js_null = lit("null") 
     ; 
     // 
     js_value = js_string  [phoenix::bind(&print_str, qi::_1)] 
      | js_num | js_array | start | js_bool | js_null; 
     // 
     js_single_quoted_str = (lexeme["'" >> *(char_ - "'") >> "'"]); 
     // 
     js_double_quoted_str = (lexeme['"' >> *(char_ - '"') >> '"']); 
     // 
     js_num = long_long | long_double; 
    } 

    qi::rule<Iterator, std::string(), ascii::space_type> js_key; 
    qi::rule<Iterator, std::string(), ascii::space_type> js_string; 

    qi::rule<Iterator, ascii::space_type> start; 
    qi::rule<Iterator, ascii::space_type> js_member; 
    qi::rule<Iterator, ascii::space_type> js_value; 
    qi::rule<Iterator, ascii::space_type> js_single_quoted_str; 
    qi::rule<Iterator, ascii::space_type> js_double_quoted_str; 
    qi::rule<Iterator, ascii::space_type> js_array; 
    qi::rule<Iterator, ascii::space_type> js_num; 
    qi::rule<Iterator, ascii::space_type> js_bool; 
    qi::rule<Iterator, ascii::space_type> js_null; 
}; 

int main() 
{ 
    std::string inputStr; 
    json_grammar<std::string::const_iterator> jsonParser; 
    bool parseOK = false; 

    while(std::getline(std::cin, inputStr)) { 
     if(inputStr.empty() || inputStr[0] == 'q' || inputStr[0] == 'Q') 
      break; 

     std::string::const_iterator iter = inputStr.begin(); 
     std::string::const_iterator iterEnd = inputStr.end(); 

     parseOK = qi::phrase_parse(iter, iterEnd, jsonParser, ascii::space); 

     if(parseOK && iter == iterEnd) { 
      std::cout << "Successfully parsed the input as JSON!" << std::endl; 
     } else { 
      std::cout << "Cannot parse the input as JSON!" << std::endl; 
     } 
    } 

    return 0; 
} 
+0

“他们总是返回空白”是一个小暧昧 - 你能不能请澄清?有一件事可能会很好:如果你给出一个示例字符串,以及所需的输出和实际输出,那将会很有帮助。 – phooji

+0

只是好奇,为什么这个问题值得2倒票? – Viet

回答

2

答案很简单:2层结构js_single_quoted_strjs_double_quoted_str必须重新定义为以下,使解析器岩石:

qi::rule<Iterator, std::string(), ascii::space_type> js_single_quoted_str; 
qi::rule<Iterator, std::string(), ascii::space_type> js_double_quoted_str;