C++ X3:这个解析器*(char-eol)是否使用任何和所有行?

C++ X3:这个解析器*(char-eol)是否使用任何和所有行?,c++,parsing,boost-spirit,boost-spirit-x3,C++,Parsing,Boost Spirit,Boost Spirit X3,我的应用程序基于这个例子,得到了完全相同的结果。出于某种原因,输入字符串的内容都被解析到fusion结构“comments”中,而没有任何内容被解析到fusion结构“numbers”中。所以我不知道我哪里出了问题 namespace client { namespace ast { struct number { int num1; int num2; }; struct comm

我的应用程序基于这个例子,得到了完全相同的结果。出于某种原因,输入字符串的内容都被解析到fusion结构“comments”中,而没有任何内容被解析到fusion结构“numbers”中。所以我不知道我哪里出了问题

namespace client { 
    namespace ast {

        struct number {
            int num1;
            int num2;  
        };

        struct comment {
            std::string text;
            bool dummy;
        };

        struct input {
            std::vector<comment> comments;  
            std::vector<number> numbers;
        };
    } 
}

BOOST_FUSION_ADAPT_STRUCT(client::ast::comment, text, dummy)
BOOST_FUSION_ADAPT_STRUCT(client::ast::number, num1, num2)
BOOST_FUSION_ADAPT_STRUCT(client::ast::input, comments, numbers)

namespace client {      
    namespace parser {

        namespace x3 = boost::spirit::x3;
        using namespace x3;

        x3::attr_gen dummy;

        typedef std::string::const_iterator It;

        using namespace x3;

        auto const comment = *(char_ - eol) >> dummy(false);
        auto const number = int_ >> int_;

        auto lines = [](auto p) { return *(p >> eol); };

        auto const input = 
            lines(comment) >> 
            lines(number);
   }
}

int main()
{
    namespace x3 = boost::spirit::x3;

    std::string const iss("any char string here\n1 2\n");

    auto iter = iss.begin(), eof = iss.end();

    client::ast::input types;

    bool ok = parse(iter, eof, client::parser::input, types);

    if (iter != eof) {
        std::cout << "Remaining unparsed: '" << std::string(iter, eof) << "'\n";
    }
    std::cout << "Parsed: " << (100.0 * std::distance(iss.begin(), iter) / iss.size()) << "%\n";
    std::cout << "ok = " << ok << std::endl;

    // This range loop prints all contents if input.
    for (auto& item : types.comments)    { std::cout << "comment: " << boost::fusion::as_deque(item) << "\n"; }

    // This loop prints nothing.
    for (auto& item : types.numbers)    { std::cout << "number: " << boost::fusion::as_deque(item) << "\n"; }
}  
命名空间客户端{
名称空间ast{
结构编号{
int num1;
int num2;
};
结构注释{
std::字符串文本;
布尔假人;
};
结构输入{
向量评论;
std::向量数;
};
} 
}
BOOST\u FUSION\u ADAPT\u STRUCT(客户端::ast::注释、文本、虚拟)
BOOST\u FUSION\u ADAPT\u STRUCT(客户机::ast::number,num1,num2)
BOOST\u FUSION\u ADAPT\u STRUCT(客户端::ast::输入、注释、数字)
命名空间客户端{
名称空间分析器{
名称空间x3=boost::spirit::x3;
使用名称空间x3;
x3::属性生成虚拟;
typedef std::string::const_迭代器It;
使用名称空间x3;
自动常量注释=*(字符-下线)>>dummy(假);
自动常数编号=int\u>>int;
自动行=[](自动p){return*(p>>eol);};
自动常量输入=
行(评论)>>
行数;
}
}
int main()
{
名称空间x3=boost::spirit::x3;
std::string const iss(“此处的任何字符字符串\n1 2\n”);
自动iter=iss.begin(),eof=iss.end();
客户端::ast::输入类型;
bool ok=parse(iter、eof、client::parser::input、type);
如果(iter!=eof){

std::cout你从我的回答中得到了语法概念:

这是因为行格式并不含糊。事实上,您需要特别注意的是“变体”方法,我在这个项目符号中指出:

  • 部门需要在团队之前进行排序,或者您需要匹配“团队”而不是部门
同样的歧义也存在于你的语法中。
*(char-eol)
匹配
“12”
很好,所以很明显它是作为注释添加的。你必须消除语法歧义,或者以某种方式强制切换到“立即解析数字行”模式


如果您完全不关心数字行之前的内容,只需使用
x3::seek[lines(number)]

行(解析器)
do?行(解析器)line确保每个解析器(即行(注释)、行(编号)都有一个后面是一个eol。它的作用不止于此……请注意lambda被称为
,而不是
。好的,我想我可以看到行(注释),因此,*(char_-eol)正在消耗每一行。我试图从(p>>eol)中删除*认为它将是一而不是任何数字,但这不起作用。你能澄清一下关于“强制切换到“立即解析数字行”模式”的部分吗?消除语法歧义,例如…[注意添加的跳过程序使用
短语\u parse
,你显然忘记了]。否则,您可以断言它:,正如您所看到的,它的效率较低。
x3::seek
?对于自boost 1.69起的spirit x3,它没有这样的东西。@Ender它与qi存储库中的
boost::spirit::repository::qi::seek
相同。我认为x3文档确实丢失了,尽管我目前没有机会检查