2011-10-04 129 views
2

我想编写一个boost::spirit解析器,该解析器在使用双引号的双引号中解析简单字符串,例如, "a \"b\" c"使用Boost :: Spirit解析转义字符串:: Spirit

这里是我的尝试:

#include <boost/config/warning_disable.hpp> 
#include <boost/spirit/include/qi.hpp> 

#include <iostream> 
#include <string> 

namespace client 
{ 
    namespace qi = boost::spirit::qi; 
    namespace ascii = boost::spirit::ascii; 

    template <typename Iterator> 
    bool parse(Iterator first, Iterator last) 
    { 
    using qi::char_; 

    qi::rule< Iterator, std::string(), ascii::space_type > text; 
    qi::rule< Iterator, std::string() > content; 
    qi::rule< Iterator, char() > escChar; 

    text = '"' >> content >> '"'; 
    content = +(~char_('"') | escChar); 
    escChar = '\\' >> char_("\""); 

    bool r = qi::phrase_parse(first, last, text, ascii::space); 
    if (first != last) // fail if we did not get a full match 
     return false; 
    return r; 
    } 
} 

int main() { 
    std::string str = "\"a \\\"b\\\" c\""; 
    if (client::parse(str.begin(), str.end())) 
    std::cout << str << " Parses OK: " << std::endl; 
    else 
    std::cout << "Fail\n"; 
    return 0; 
} 

它遵循上Parsing escaped strings with boost spirit的例子,但输出为“失败”。我怎样才能使它工作?

回答

2

过了一段时间,因为我在精神上走了一步,但我认为你的一条规则是错误的。

尝试:

content = +(escChar | ~char_('"')) 

代替:

content = +(~char_('"') | escChar) 

它使用~char('"')符合\,因此从来轮到达如果escChar匹配检查。然后它读取下一个"作为字符串的结尾并停止解析。

+0

如何修改此语法以便捕获\? – Addy

相关问题