C++ Boost 精神,将二维数组(以及更多)解析为结构
C++ Boost spirit, parse a 2D array (and more) into a struct
我正在尝试修改以下示例:http://www.boost.org/doc/libs/1_57_0/libs/spirit/example/qi/employee.cpp
我想在 employee 结构中添加一个二维向量,例如:
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
>> '}'
;
不幸的是,这个规则使精神 returns work_hours = {{1,2,3,4,5,6,7,8}},而不是:{{1,2 ,3},{4,5,6,7,8}}
有人有解决方法吗?
提前致谢
qi::eol
被跳过解析器匹配,所以你必须在 lexeme
指令中进行列表解析。例如:
start %=
lit("employee")
>> '{'
>> int_ >> ','
>> quoted_string >> ','
>> quoted_string >> ','
>> double_
>> *lexeme[int_ % ' '] // <-- here
>> '}'
;
lexeme[int_ % ' ']
不使用跳过解析器,因此它将匹配由一个 space 分隔的整数。如果你想让整数被多个 space 分隔(出于缩进目的),并且取决于你想要处理制表符和其他非换行符的方式 whitespace,你可以使用更复杂的定界符。可能最接近您的原始代码是
>> *lexeme[int_ % +(ascii::space - '\n')]
不过,最好的方法究竟是什么,您必须自己回答。
我正在尝试修改以下示例:http://www.boost.org/doc/libs/1_57_0/libs/spirit/example/qi/employee.cpp
我想在 employee 结构中添加一个二维向量,例如:
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
>> '}'
;
不幸的是,这个规则使精神 returns work_hours = {{1,2,3,4,5,6,7,8}},而不是:{{1,2 ,3},{4,5,6,7,8}}
有人有解决方法吗?
提前致谢
qi::eol
被跳过解析器匹配,所以你必须在 lexeme
指令中进行列表解析。例如:
start %=
lit("employee")
>> '{'
>> int_ >> ','
>> quoted_string >> ','
>> quoted_string >> ','
>> double_
>> *lexeme[int_ % ' '] // <-- here
>> '}'
;
lexeme[int_ % ' ']
不使用跳过解析器,因此它将匹配由一个 space 分隔的整数。如果你想让整数被多个 space 分隔(出于缩进目的),并且取决于你想要处理制表符和其他非换行符的方式 whitespace,你可以使用更复杂的定界符。可能最接近您的原始代码是
>> *lexeme[int_ % +(ascii::space - '\n')]
不过,最好的方法究竟是什么,您必须自己回答。