理解精神语法

时间:2013-04-13 17:15:16

标签: c++ boost boost-spirit

在阅读文档时,我读到了

对于用逗号分隔的双字符串,我们可以像这样(我理解)

double_ >> * (',' >> double_)double_ %

但是以下表达式意味着什么。它应该将逗号分隔的字符串拆分为一个向量,它可以工作。如果有人能够澄清它,我将不胜感激。我对-运算符感到困惑我认为它是一个差异运算符,但我无法弄清楚它在这里的作用

*(qi::char_ - ',') % ','

3 个答案:

答案 0 :(得分:5)

*(char_ - ',')表示“匹配零个或多个字符,但','”,它也可以这样写:*~char_(",")。另一方面,*char_表示“匹配零个或多个字符”。

要理解,为什么需要排除,只需尝试使用和不使用它:

#include <string>
#include <boost/spirit/home/qi.hpp>
int main()
{
    using namespace boost::spirit::qi;
    std::vector<std::string> out1, out2;
    std::string s = "str1, str2, str3";
    bool b = parse(s.begin(), s.end(), *~char_(",") % ",", out1); // out1: ["str1", "str2", "str3"]
    b = parse(s.begin(), s.end(), *char_ % ",", out2); // out2: ["str1, str2, str3"]
}

答案 1 :(得分:0)

qi::char_ - ','匹配除,之外的所有字符,以防止内部表达式过于贪婪。

答案 2 :(得分:0)

你真的需要阅读EBNF标准才能理解Boost.Spirit。