促进精神船长问题

促进精神船长问题

我对精神跳跃者有困难。

我需要解析这样的文件:

ROW intint [int, int]int [int, int]...

只有在第一个int之后添加一个‘_’,我才能没有问题地解析它(这要感谢堆栈溢出;)。

事实上,我认为船长在第一个int之后吃行的末尾,所以第一个和第二个(在第二行)看起来只有一个int。我不知道如何保持生活质量,但要多吃点地方。我找到了使用自定义解析器的示例,如这里这里.

我试过气:空白,自定义解析器与一个单一的规则点燃(‘)无论我使用什么船长,空间和EOL总是吃。

我的语法是:

一行:

struct rowType{
    unsigned int number;
    std::list<unsigned int> list;};

存储在结构中的全部问题:

struct problemType{
    unsigned int ROW;
    std::vector<rowType> rows;};

行解析器:

template<typename Iterator>struct row_parser : qi::grammar<Iterator, rowType(), qi::space_type>{
    row_parser() : row_parser::base_type(start)
    {

        list  = '[' >> -(qi::int_ % ',') >> ']';
        start = qi::int_ >> list;
    }

    qi::rule<Iterator, rowType(), qi::space_type> start;
    qi::rule<Iterator, std::list<unsigned int>(), qi::space_type> list;};

问题解析器:

template<typename Iterator>struct problem_parser : qi::grammar<Iterator,problemType(),qi::space_type>{

    problem_parser() : problem_parser::base_type(start)
    {
        using boost::phoenix::bind;
        using qi::lit;

        start = qi::int_ >> lit('_') >> +(row);

        //BOOST_SPIRIT_DEBUG_NODE(start);
    }

    qi::rule<Iterator, problemType(),qi::space_type> start;
    row_parser<Iterator> row;};

我就是这样用的:

main() {static const problem_parser<spirit::multi_pass<base_iterator_type> > p;...spirit::qi::phrase_parse(first, last ,
            p,
            qi::space,
            pb);}

当然,qi:space是我的问题,解决我的问题的一种方法是不使用SCOPER,但是短语_PARASE需要一个,然后我的解析器需要一个。

我已经被困了好几个小时了.。我想这显然是我误解了。

谢谢你的帮助。


qq_遁去的一_1
浏览 271回答 1
1回答

梦里花落0921

通常,以下指令有助于抑制/切换跳过者的中间语法:qi::lexeme [ p ]例如,如果您想要确保解析一个标识符而不需要内部跳过,则这会抑制跳过器)qi::raw [ p ]它像往常一样解析,包括跳过,但返回匹配的源序列的原始迭代器范围(包括跳过的位置)。qi::no_skip [ p ]抑制跳过而不预跳qi::skip(s) [ p ],它将船长替换为另一个船长。s(请注意,您需要使用适当声明的qi::rule<>实例中的实例。skip[]条款)哪里p是任何解析器表达式。特定溶液正如你已经知道的,你的问题可能是qi::space吃全白色空间。我不可能知道你的语法有什么问题(因为你既没有显示完整的语法,也没有显示相关的输入)。所以,这就是我要写的。注使用qi::eol到明示需要在特定位置中断行使用qi::blank作为船长(不包括eol)为了简洁起见,我结合了语法代码:#define&nbsp;BOOST_SPIRIT_DEBUG#include&nbsp;<boost/fusion/adapted.hpp>#include&nbsp;<boost/spirit/include/qi.hpp>#include&nbsp;<boost/spirit/include/phoenix. hpp>namespace&nbsp;qi&nbsp;=&nbsp;boost::spirit::qi;namespace&nbsp;phx&nbsp;=&nbsp;boost::phoenix;struct&nbsp;rowType&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;number; &nbsp;&nbsp;&nbsp;&nbsp;std::list<unsigned&nbsp;int>&nbsp;list;};struct&nbsp;problemType&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;ROW; &nbsp;&nbsp;&nbsp;&nbsp;std::vector<rowType>&nbsp;rows;};BOOST_FUSION_ADAPT_STRUCT(rowType,&nbsp;(unsigned&nbsp;int,&nbsp;number)(std::list<unsigned&nbsp;int>,&nbsp;list)) &nbsp;&nbsp;&nbsp;&nbsp;BOOST_FUSION_ADAPT_STRUCT(problemType,&nbsp;(unsigned&nbsp;int,&nbsp;ROW)(std::vector<rowType>,&nbsp;rows))template<typename&nbsp;Iterator>struct&nbsp;problem_parser &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;qi::grammar<Iterator,problemType(),qi::blank_type>{ &nbsp;&nbsp;&nbsp;&nbsp;problem_parser()&nbsp;:&nbsp;problem_parser::base_type(problem) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;using&nbsp;namespace&nbsp;qi; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;'['&nbsp;>>&nbsp;-(int_&nbsp;%&nbsp;',')&nbsp;>>&nbsp;']'; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;int_&nbsp;>>&nbsp;list&nbsp;>>&nbsp;eol; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;problem&nbsp;=&nbsp;"ROW"&nbsp;>>&nbsp;int_&nbsp;>>&nbsp;eol&nbsp;>>&nbsp;+row; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BOOST_SPIRIT_DEBUG_NODES((problem)(row)(list)); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;qi::rule<Iterator,&nbsp;problemType()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;qi::blank_type>&nbsp;problem; &nbsp;&nbsp;&nbsp;&nbsp;qi::rule<Iterator,&nbsp;rowType()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;qi::blank_type>&nbsp;row; &nbsp;&nbsp;&nbsp;&nbsp;qi::rule<Iterator,&nbsp;std::list<unsigned&nbsp;int>(),&nbsp;qi::blank_type>&nbsp;list;};int&nbsp;main(){ &nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;std::string&nbsp;input&nbsp;=&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"ROW&nbsp;1\n" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"2&nbsp;[3,&nbsp;4]\n" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"5&nbsp;[6,&nbsp;7]\n"; &nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;f&nbsp;=&nbsp;begin(input),&nbsp;l&nbsp;=&nbsp;end(input); &nbsp;&nbsp;&nbsp;&nbsp;problem_parser<std::string::const_iterator>&nbsp;p; &nbsp;&nbsp;&nbsp;&nbsp;problemType&nbsp;data; &nbsp;&nbsp;&nbsp;&nbsp;bool&nbsp;ok&nbsp;=&nbsp;qi::phrase_parse(f,&nbsp;l,&nbsp;p,&nbsp;qi::blank,&nbsp;data); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ok)&nbsp;std::cout&nbsp;<<&nbsp;"success\n"; &nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;<<&nbsp;"failed\n"; &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(f!=l) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;<<&nbsp;"Remaining&nbsp;unparsed:&nbsp;'"&nbsp;<<&nbsp;std::string(f,l)&nbsp;<<&nbsp;"'\n";}如果您真的不想要求换行:template<typename&nbsp;Iterator>struct&nbsp;problem_parser&nbsp;:&nbsp;qi::grammar<Iterator,problemType(),qi::space_type>{ &nbsp;&nbsp;&nbsp;&nbsp;problem_parser()&nbsp;:&nbsp;problem_parser::base_type(problem) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;using&nbsp;namespace&nbsp;qi; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;'['&nbsp;>>&nbsp;-(int_&nbsp;%&nbsp;',')&nbsp;>>&nbsp;']'; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;int_&nbsp;>>&nbsp;list; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;problem&nbsp;=&nbsp;"ROW"&nbsp;>>&nbsp;int_&nbsp;>>&nbsp;+row; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BOOST_SPIRIT_DEBUG_NODES((problem)(row)(list)); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;qi::rule<Iterator,&nbsp;problemType()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;qi::space_type>&nbsp;problem; &nbsp;&nbsp;&nbsp;&nbsp;qi::rule<Iterator,&nbsp;rowType()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;qi::space_type>&nbsp;row; &nbsp;&nbsp;&nbsp;&nbsp;qi::rule<Iterator,&nbsp;std::list<unsigned&nbsp;int>(),&nbsp;qi::space_type>&nbsp;list;};int&nbsp;main(){ &nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;std::string&nbsp;input&nbsp;=&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"ROW&nbsp;1&nbsp;"&nbsp;//&nbsp;NOTE&nbsp;whitespace,&nbsp;obviously&nbsp;required! &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"2&nbsp;[3,&nbsp;4]" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"5&nbsp;[6,&nbsp;7]"; &nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;f&nbsp;=&nbsp;begin(input),&nbsp;l&nbsp;=&nbsp;end(input); &nbsp;&nbsp;&nbsp;&nbsp;problem_parser<std::string::const_iterator>&nbsp;p; &nbsp;&nbsp;&nbsp;&nbsp;problemType&nbsp;data; &nbsp;&nbsp;&nbsp;&nbsp;bool&nbsp;ok&nbsp;=&nbsp;qi::phrase_parse(f,&nbsp;l,&nbsp;p,&nbsp;qi::space,&nbsp;data); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ok)&nbsp;std::cout&nbsp;<<&nbsp;"success\n"; &nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;<<&nbsp;"failed\n"; &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(f!=l) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;<<&nbsp;"Remaining&nbsp;unparsed:&nbsp;'"&nbsp;<<&nbsp;std::string(f,l)&nbsp;<<&nbsp;"'\n";}更新作为对评论的回应:这里有一个片段,展示了如何从文件中读取输入。这是经过测试的,对我来说很好:std::ifstream&nbsp;ifs("input.txt"/*,&nbsp;std::ios::binary*/);ifs.unsetf(std::ios::skipws);boost::spirit::istream_iterator&nbsp;f(ifs),&nbsp;l; problem_parser<boost::spirit::istream_iterator>&nbsp;p;
打开App,查看更多内容
随时随地看视频慕课网APP