如何获得boost :: spirit停止在关键字解析?

问题描述:

我想分析像“开始abc结束”提取“abc”的输入。如何获得boost :: spirit停止在关键字解析?

这里是我的测试代码:

#include <boost/spirit/include/qi.hpp> 
#include <ostream> 

namespace qi = boost::spirit::qi; 

int main(int argc, char* argv[]) 
{ 
    typedef std::string::const_iterator iterator; 

    qi::rule<iterator, std::string(), qi::space_type> rule = 
     "start" >> 
     qi::lexeme[+qi::char_] >> 
     "end"; 

    std::string input("start abc end"); 
    auto iter = input.begin(); 
    std::string result; 
    qi::phrase_parse(iter, input.end(), rule, qi::space, result); 

    std::cout << "Result: " << result << std::endl; 
} 

输出是 “结果:ABC结束”。

+0

请注意,如果你要检查'qi :: phrase_parse'的结果,你会发现解析失败。 –

+0

我注意到并假设因为“结束”被提前使用,解析器无法完成匹配。 –

+0

我无法编译你的代码,你正在使用哪种版本的boost? – HeyYO

问题是,您希望解析器停止在空格或关键字“结束”。但是你的解析器基本上接受“开始”关键字之后的任何字符。

+char_ 

上面的解析器表示:长度大于1的任何字符序列(包括空格)。

不知何故,你必须告诉你的解析器停止在空格或“结束”关键字。例如下面的解析器将接受字符,直到“结束”关键字

+(char_ - lit("end")) 

我建议你看一下精神文档中的解析器列表。 http://www.boost.org/doc/libs/1_55_0/libs/spirit/doc/html/spirit/qi/quick_reference/qi_parsers.html

+0

谢谢你的回答,但它没有帮助。改变规则以 \t气::规则规则= \t \t “开始” >> \t \t气::词位[+气:: char_] - qi :: lit(“end”)>> \t \t“end”; 产生了相同的结果。 –

+0

我相信它应该是这样的“开始”>> qi :: lexeme [+ qi :: char_ - qi :: lit(“end”)] >>“end”' – HeyYO

+0

这是一个我没有尝试过的排列但是,它并没有帮助。还有什么? –