Simple Line,具有不同类型的转义元素



我想用boost解析以下行::spirit

0  "a"  "b"  "c"

我创建了这样的规则:

qi::rule<std::string::const_iterator, std::string()> escaped_ = qi::char_('"') >> *(qi::char_ - qi::char_('"')) >> qi::char_('"');
int id;
std::string v1,v2,v3;
qi::phrase_parse(bein, end, (qi::int_ >> escaped_ >> escaped_ >> escaped_ >> qi::eol), id, v1, v2, v3);

但是解析失败了,我不知道为什么。希望有人能帮忙。

phrase_parse获取(it,it,parser,capper[,attribute…])。您忘记传递一个capper:

bool ok = qi::phrase_parse(begin, end, (qi::int_ >> escaped_ >> escaped_ >> escaped_ >> qi::eol), qi::blank, id, v1, v2, v3);

我建议使用qi::blank,因为您的语法将eol视为有意义的(跳过它永远不会匹配)。

注意qi::rule巧妙地省略了队长,因此它隐含地是lexeme[]:

qi::rule<It, std::string(), qi::blank_type> escaped_ = qi::lexeme['"' >> *(qi::char_ - '"') >> '"'];

另请参阅:Boost spirit船长发布

最后要注意的是,您不想将"作为结果值的一部分进行解析(如果可能的话,将qi::char_('"')更改为qi::lit('"')或等效为'"')。

Demo

在Coliru上直播

#include <boost/spirit/include/qi.hpp>
namespace qi = boost::spirit::qi;
int main() {
    typedef std::string::const_iterator It;
    qi::rule<It, std::string()> escaped_ = '"' >> *(qi::char_ - '"') >> '"';
    std::string const input("0  "a"  "b"  "c"n");
    It begin(input.begin()), end(input.end());
    int id;
    std::string v1,v2,v3;
    bool ok = qi::phrase_parse(begin, end, (qi::int_ >> escaped_ >> escaped_ >> escaped_ >> qi::eol), qi::blank, id, v1, v2, v3);
    if (ok) {
        std::cout << "Parse succeeded:" 
                  << " "  << id
                  << " '" << v1 << "'"
                  << " '" << v2 << "'"
                  << " '" << v3 << "'n";
    } else {
        std::cout << "Parse failedn";
    }
    if (begin != end)
        std::cout << "Remaining unparsed '" << std::string(begin, end) << "'n";
}

打印

Parse succeeded: 0 'a' 'b' 'c'

最新更新