Boost Spirit 2.4.2:无法提取字符串
Boost Spirit 2.4.2: Cannot extract a string
根据已解决的问题Boost Spirit:错误C2664,无法转换';const boost::phoenix::actor<Eval>#39;到';char',我还有一个问题:
为什么对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;
}
答案很简单:必须将两个结构js_single_quoted_str
和js_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;
相关文章:
- 清除输入缓冲区后未提取字符串流
- 提取字符串中的随机单词
- 提取C++字符串
- 如何提取字符串中的特定值
- 如何提取字符串中的整数?
- 正则表达式:从模式字符串 1.string2'string3 中提取字符串,其中字符串 1 可以包含 '." 字符
- C - 从逗号分隔的浮点线提取字符串
- 如何使用正则表达式提取字符串的不匹配部分
- 处理从 std::istream 中提取字符串的空字符串大小写
- 可视化从文本C++中提取字符串数据
- 如何在C++中有效地提取字符串模式
- 分析文本文件以提取字符串
- C++:从两个符号之间提取字符串
- 提取字符串的一部分并将部分放入字符数组和另一个字符串变量C++
- 如何在c++中提取字符串的一部分
- 使用getline(),然后从用户输入中提取字符串(使用c++)
- 尝试从文本文件中读取列表,然后搜索文本文件,并在c++中提取字符串
- 试图从c++文本文件的单行中提取字符串的一部分
- 从字符数组中提取字符串
- 从JavaScript代码中提取字符串