C++ boost spirit编译错误

C++ boost spirit编译错误,c++,boost,boost-spirit,C++,Boost,Boost Spirit,我第一次尝试使用boost::spirit,但遇到了一些编译错误,我不知道如何解决 这似乎暗示我正在使用的是Skipper,但我在任何地方都使用相同的Skipper,我尝试了许多不同的Skipper配置,但没有一个有效:( 我的示例文件如下所示: #include <boost/spirit/include/qi.hpp> namespace qi = boost::spirit::qi; namespace ascii = boost::spirit::ascii; temp

我第一次尝试使用boost::spirit,但遇到了一些编译错误,我不知道如何解决

这似乎暗示我正在使用的是Skipper,但我在任何地方都使用相同的Skipper,我尝试了许多不同的Skipper配置,但没有一个有效:(

我的示例文件如下所示:

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

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

template <typename Iterator>
struct Grammar: qi::grammar<Iterator, std::vector<std::string>, ascii::space_type>
{
    Grammar(): Grammar::base_type(ident_list)
    {
        ident = qi::lexeme[*qi::alnum];
        ident_list = *ident;
    }

    qi::rule<Iterator, std::vector<std::string>, ascii::space_type> ident_list;                                                                                                                                       
    qi::rule<Iterator, std::string, ascii::space_type> ident;
};

int main()
{
    Grammar<std::string::const_iterator> grammar;
    std::vector<std::string> result;

    std::string string_to_parse = "My list of ident";

    std::string::const_iterator start = string_to_parse.begin();
    std::string::const_iterator end = string_to_parse.end();

    phrase_parse(
        start,
        end,
        grammar,
        ascii::space,
        result
    );

    return 0;
}

它编译得很好。

规则上的签名有点拼写错误:

qi::rule<Iterator, std::vector<std::string>, ascii::space_type> ident_list;                                                                                                                                       
qi::rule<Iterator, std::string, ascii::space_type> ident;
印刷品

Parsed 4 tokens
奖金

在这样一个简单语法的情况下,只考虑内联:

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

namespace qi = boost::spirit::qi;

template <typename Iterator> struct Grammar : qi::grammar<Iterator, std::vector<std::string>()> {
    Grammar() : Grammar::base_type(start) {
        using namespace qi;
        ident      = +alnum;
        ident_list = *ident;
        start      = skip(ascii::space) [ident_list];
    }
  private:
    qi::rule<Iterator, std::vector<std::string>()> start;
    qi::rule<Iterator, std::vector<std::string>(), qi::ascii::space_type> ident_list;
    qi::rule<Iterator, std::string()> ident;
};

int main() {
    Grammar<std::string::const_iterator> grammar;
    std::vector<std::string> result;

    std::string const input = "My list of ident";

    auto start = input.begin(), end = input.end();
    if (parse(start, end, grammar, result))
        std::cout << "Parsed " << result.size() << " tokens\n";
    else
        std::cout << "Parsing failed\n";

    if (start != end)
        std::cout << "Remaining unparsed input: '" << std::string(start,end) << "'\n";
}
#include <boost/spirit/include/qi.hpp>
namespace qi = boost::spirit::qi;

int main() {
    for (std::string const input : { "My list of ident", " My list of ident " }) {
        auto f = input.begin(), l = input.end();

        std::list<std::string> result;
        if (qi::phrase_parse(f, l, *qi::lexeme[+qi::graph], qi::space, result))
            std::cout << "Parsed " << result.size() << " tokens\n";
        else
            std::cout << "Parsing failed\n";

        if (f != l)
            std::cout << "Remaining unparsed input: '" << std::string(f,l) << "'\n";
    }
}
#包括
名称空间qi=boost::spirit::qi;
int main(){
对于(std::string const输入:{“我的标识列表”,“我的标识列表”}){
自动f=input.begin(),l=input.end();
std::列表结果;
if(qi::phrase_parse(f,l,*qi::lexeme[+qi::graph],qi::space,result))

std::cout增加了一个额外的功能,我不确定,但Spirit machinery似乎使用类型是否是qi::域的一部分作为区分跳过程序和属性的基础,而
std::string
实际上是该域的一部分(字符串本身可以用作
lit(string)
)非常感谢,我有点惊讶,我们需要在模板参数中添加
std::string()
,而不是
std::string
,但只要它能工作,这就是完美的:)我同意对于这样一个简单的语法,它可以内联,但基本上这只是在构建我的整个语法之前的增量测试,我无法正确地完成这一步。你不应该太惊讶,因为这一直都有记录:@jv_uu是的。我知道这个“宽大”是在2个版本之前作为一种噱头添加的,但我认为这是一种错误的特性。我不喜欢那种说“好吧,我们试着猜测开发人员真正的意思并继续”的心态
#include <boost/spirit/include/qi.hpp>

namespace qi = boost::spirit::qi;

template <typename Iterator> struct Grammar : qi::grammar<Iterator, std::vector<std::string>()> {
    Grammar() : Grammar::base_type(start) {
        using namespace qi;
        ident      = +alnum;
        ident_list = *ident;
        start      = skip(ascii::space) [ident_list];
    }
  private:
    qi::rule<Iterator, std::vector<std::string>()> start;
    qi::rule<Iterator, std::vector<std::string>(), qi::ascii::space_type> ident_list;
    qi::rule<Iterator, std::string()> ident;
};

int main() {
    Grammar<std::string::const_iterator> grammar;
    std::vector<std::string> result;

    std::string const input = "My list of ident";

    auto start = input.begin(), end = input.end();
    if (parse(start, end, grammar, result))
        std::cout << "Parsed " << result.size() << " tokens\n";
    else
        std::cout << "Parsing failed\n";

    if (start != end)
        std::cout << "Remaining unparsed input: '" << std::string(start,end) << "'\n";
}
Parsed 4 tokens
#include <boost/spirit/include/qi.hpp>
namespace qi = boost::spirit::qi;

int main() {
    for (std::string const input : { "My list of ident", " My list of ident " }) {
        auto f = input.begin(), l = input.end();

        std::list<std::string> result;
        if (qi::phrase_parse(f, l, *qi::lexeme[+qi::graph], qi::space, result))
            std::cout << "Parsed " << result.size() << " tokens\n";
        else
            std::cout << "Parsing failed\n";

        if (f != l)
            std::cout << "Remaining unparsed input: '" << std::string(f,l) << "'\n";
    }
}