C ++ Boost精神,将2D数组(以及更多)解析为结构

时间:2015-01-31 14:39:49

标签: c++ arrays boost-spirit-qi

我正在尝试修改以下示例:http://www.boost.org/doc/libs/1_57_0/libs/spirit/example/qi/employee.cpp

我想在员工结构中添加一个2D向量,例如:

struct employee
{
    int age;
    std::string surname;
    std::string forename;
    double salary;
    std::vector<std::vector<int> > work_hours;
};

解析类似

的内容
employee{42, "Foo", "Bar", 0
1 2 3
4 5 6 7 8
}

这样work_hours = {{1,2,3},{4,5,6,7,8}}。 (我真的需要一个2D数组,因为子向量的长度可能不同)。

我修改了BOOST_ADAPT_STRUCT,并将解析规则更改为:

start %=
            lit("employee")
            >> '{'
            >>  int_ >> ','
            >>  quoted_string >> ','
            >>  quoted_string >> ','
            >>  double_
            >>  +(qi::int_) % qi::eol
            >>  '}'
            ;

不幸的是,这个规则使精神返回work_hours = {{1,2,3,4,5,6,7,8}},而不是:{{1,2,3},{4,5,6 ,7,8-}}

有人有解决方法吗?

提前致谢

1 个答案:

答案 0 :(得分:2)

跳过解析器匹配

qi::eol,因此您必须在lexeme指令中进行列表解析。例如:

        start %=
            lit("employee")
            >> '{'
            >>  int_ >> ','
            >>  quoted_string >> ','
            >>  quoted_string >> ','
            >>  double_
            >>  *lexeme[int_ % ' '] // <-- here
            >>  '}'
            ;

lexeme[int_ % ' ']不使用跳过解析器,因此它将匹配由一个空格分隔的整数。如果要允许整数由多个空格分隔(出于缩进目的等),并且根据您希望处理制表符和其他非换行空格的方式,可以使用更复杂的分隔符。可能最接近原始代码的是

            >>  *lexeme[int_ % +(ascii::space - '\n')]

最好的方法是你必须自己回答的问题。