如何使用parse/phrase_parse函数

How to use the parse/phrase_parse function

具体来说,使用语法g,我该如何解析字符串s?我应该给出什么论据?我试了很多电话,但总是出错。

此外,由于我还不确定我稍后会使用哪一个,所以使用 phrase_parse 会有什么不同吗?

namespace qi = boost::spirit::qi;
int main() {
    My_grammar<std::string::const_iterator> g;
    std::string s = "a"; // string to parse
    if (qi::parse( /*...*/ )) {
        std::cout << "String parsed !";
    } else {
        std::cout << "String doesn't parse !";
    }
    return EXIT_SUCCESS;
}

基本上,您应该查看教程,但部分问题是,您或多或少需要创建一个变量来保存开始迭代器。因为,它是通过对 qi::parse 的引用传递的,而它确切停止的地方可以认为是 qi::parse 函数的输出。如果您尝试通过 s.begin() 传递它,它将不起作用,因为您正试图将引用绑定到临时对象。

namespace qi = boost::spirit::qi;
int main() {
    My_grammar<std::string::const_iterator> g;
    std::string s = "a"; // string to parse
    std::string::const_iterator it = s.begin(); // The type declaration here
    std::string::const_iterator end = s.end(); // and here needs to match template parameter
                                               // which you used to instantiate g

    if (qi::parse( it, end, g )) {
        std::cout << "String parsed !";
    } else {
        std::cout << "String doesn't parse !";
    }
    return EXIT_SUCCESS;
}

仅当您想明确指定跳过语法时才使用 phrase_parse

是的,会有区别。

phrase_parse 使用船长,可能不会消耗所有输入,但仍然 return 正确。

在所有其他方面,两者完全相同。你真的应该点击文档:

 std::string::const_iterator f(s.begin(), l(s.end());

 if (qi::parse(f, l, g/*, optional, bound, attribute, references*/))