C++ Boost中的关键字列表操作符

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> 即使在阅读了关于关

我试图解析一个属性顺序无关紧要的对象

例如,解析雇员

雇员{姓氏=“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 ]
        >> "}";