C++ Boost中的关键字列表操作符
我试图解析一个属性顺序无关紧要的对象 例如,解析雇员 雇员{姓氏=“doe”,名字=“约翰”,年龄=30} 应与相同 雇员{age=30,firstname=“john”,姓氏=“doe”} 因此,理想情况下,我的规则应该是(不介意缺少正式定义) 但首先,如何将分隔逗号合并到解析规则中?对于C++结构,代码>结构{雇员:STD::String FixNeNt:;…int;},属性的顺序是什么?Boost如何知道哪一个关键字对应于哪个属性,即使在结构已经转换成融合向量之后?p>C++ Boost中的关键字列表操作符,c++,boost,boost-spirit-qi,C++,Boost,Boost Spirit Qi,我试图解析一个属性顺序无关紧要的对象 例如,解析雇员 雇员{姓氏=“doe”,名字=“约翰”,年龄=30} 应与相同 雇员{age=30,firstname=“john”,姓氏=“doe”} 因此,理想情况下,我的规则应该是(不介意缺少正式定义) 但首先,如何将分隔逗号合并到解析规则中?对于C++结构,代码>结构{雇员:STD::String FixNeNt:;…int;},属性的顺序是什么?Boost如何知道哪一个关键字对应于哪个属性,即使在结构已经转换成融合向量之后?p> 即使在阅读了关于关
即使在阅读了关于关键字列表操作符的文档之后,这对我来说也没有什么意义 仅对融合序列进行排序。因此,属性的合成顺序必须与字段适应融合序列的顺序相匹配 我不知道合并分隔符的优雅方法(我认为应该有人为此扩展关键字列表解析器指令……请放心:) 您可以在相关项目周围混合使用跳过,例如
(qi::space |',')
和qi::lexeme[]
(请参阅)
或者,您可以使用前瞻断言的重复表达式,如
unordered_rule %= lit("employee") >> "{"
>> (kwd("surname") >> (&lit('}') | ',')) [ "=" > quoted_string ]
/ kwd("age") >> (&lit('}') | ',')) [ "=" > int_ ]
/ kwd("firstname") >> (&lit('}') | ',')) [ "=" > quoted_string ]
/ kwd("age") >> (&lit('}') | ',')) [ "=" > int ]
>> "}";
(目前还没有测试)。那么,像我的示例一样,是否仍然可以将无序文本解析为融合序列?或者我必须用别的方法吗。我想我没有提到任何限制。我刚刚回答了你的问题,并展示了一种解析分隔符的方法。
unordered_rule %= lit("employee") >> "{"
>> (kwd("surname") >> (&lit('}') | ',')) [ "=" > quoted_string ]
/ kwd("age") >> (&lit('}') | ',')) [ "=" > int_ ]
/ kwd("firstname") >> (&lit('}') | ',')) [ "=" > quoted_string ]
/ kwd("age") >> (&lit('}') | ',')) [ "=" > int ]
>> "}";