【问题标题】:C++ Boost spirit, parse a 2D array (and more) into a structC++ Boost 精神,将二维数组(及更多)解析为结构
【发布时间】:2015-01-31 14:39:48
【问题描述】:

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

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

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}}。 (我真的需要一个二维数组,因为子向量的长度可以不同)。

我修改了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}}

有人有解决方法吗?

提前致谢

【问题讨论】:

  • 解析器应该如何知道哪些数字进入了哪个子数组或二维数组?输入数据中没有明显的结构可以用来确定这一点。编辑:哦,格式化混乱。等等。

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


【解决方案1】:

qi::eol 与跳过解析器匹配,因此您必须在 lexeme 指令中进行列表解析。例如:

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

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

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

不过,最好的方法是你必须自己回答。

【讨论】:

  • 我认为ascii::blank 是您希望在最后一种方法中使用的。
  • @cv_and_he 这看起来是一个明智的选择,同意。我只是在思考“跳过解析器减去换行符”(ascii::space 是链接到的示例 OP 中的跳过解析器)。
猜你喜欢
  • 2019-06-04
  • 1970-01-01
  • 1970-01-01
  • 2013-03-16
  • 1970-01-01
  • 1970-01-01
  • 2012-02-28
  • 2013-04-01
  • 1970-01-01
相关资源
最近更新 更多