- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试修改以下示例:http://www.boost.org/doc/libs/1_57_0/libs/spirit/example/qi/employee.cpp
我想在 employee 结构中添加一个 2D vector ,例如:
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}}。 (我真的需要一个二维数组,因为子 vector 的长度可以变化)。
我修改了 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}}
有人有解决方法吗?
提前致谢
最佳答案
qi::eol
被 skip 解析器匹配,所以你必须在 lexeme
指令中进行列表解析。例如:
start %=
lit("employee")
>> '{'
>> int_ >> ','
>> quoted_string >> ','
>> quoted_string >> ','
>> double_
>> *lexeme[int_ % ' '] // <-- here
>> '}'
;
lexeme[int_ % ' ']
不使用跳过解析器,因此它将匹配由一个空格分隔的整数。如果您希望整数由多个空格分隔(出于缩进目的等),并且根据您希望处理制表符和其他非换行空格的方式,您可以使用更复杂的分隔符。可能最接近您的原始代码是
>> *lexeme[int_ % +(ascii::space - '\n')]
不过,究竟什么是最好的方法是您必须自己回答的问题。
关于C++ Boost 精神,将二维数组(以及更多)解析为结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28252821/
我正在使用此代码将“k1 = v1; k2 = v2; k3 = v3; kn = vn”字符串解析为映射。 qi::phrase_parse( begin,end,
我不理解以下示例中 x3 的行为(取自更大的语法)。 当然,语法有点奇怪,但大致实现了 (lal)?()? .当第二组不存在时,默认为 .我不明白为什么要输入 "lal"我得到 defaultcha
所以我的问题很简单,在我的词法分析器类(扩展 lex::lexer )中,我有以下内容; this->self.add ... ("&&", AND_AND) ("||", O
我正在尝试修改以下示例:http://www.boost.org/doc/libs/1_57_0/libs/spirit/example/qi/employee.cpp 我想在 employee 结构
我正在为当前分支为多个版本的应用程序寻找版本编号方案/模式/系统 shell game样式发布日期。这使得版本控制成为一场噩梦。我想只使用典型的 Major.Minor.Revision 但是这会很快
是的,我开始做这个测试了! 但是我不知道该用什么=/ Rspec + 应该吗? Rspec + 牛排? 迷你测试? cucumber ? capybara ? 可以吗? ( cucumber 与 Sh
我是一名优秀的程序员,十分优秀!