加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – Boost中的关键字列表运算符

发布时间:2020-12-16 07:11:50 所属栏目:百科 来源:网络整理
导读:我正在尝试解析一个对象,其中属性的顺序无关紧要. 例如,解析员工 employee { surname = “doe”,firstname = “john”,age = 30 } 应该是一样的 employee { age = 30,surname = “doe”} 理想情况下,我的规则应该是这样的(不要介意缺乏正式的定义) unordered
我正在尝试解析一个对象,其中属性的顺序无关紧要.

例如,解析员工

employee { surname = “doe”,firstname = “john”,age = 30 }

应该是一样的

employee { age = 30,surname = “doe”}

理想情况下,我的规则应该是这样的(不要介意缺乏正式的定义)

unordered_rule %= lit("employee") >> "{" 
             >> kwd("surname")["=" > quoted_string] 
            / kwd("age")["=" > int_] 
            / kwd("firstname")["=" > quoted_string] 
            / kwd("age")["=" > int] >> "}";

但首先,如何将分离逗号合并到解析规则中?对于我的C struct struct employee {std :: string firstname; … …年龄;,即使在结构转换为融合向量之后,属性的顺序是否重要或者如何知道哪个关键字对应哪个属性?

即使在阅读关键字列表运算符的文档后,这对我来说也没有真正的补充.

解决方法

融合序列仅是有序的.因此,合成属性的顺序必须与字段已经适应融合序列的顺序相匹配.

我知道没有优雅的方法来合并分隔符(我认为有人应该扩展关键字列表解析器指令…感觉自由:)).

您可以使用跳过的混合,例如(qi :: space |’,’)和qi :: lexeme []围绕相关项目(见Boost spirit skipper issues).

或者你可以使用一个先行断言的重复表达式

unordered_rule %= lit("employee") >> "{" 
        >> (kwd("surname")  >> (&lit('}') | ',')) [ "=" > quoted_string ]
        / kwd("age")       >> (&lit('}') | ',')) [ "=" > int_ ]
        / kwd("firstname") >> (&lit('}') | ',')) [ "=" > int ]
        >> "}";

(暂不测试).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读