【问题标题】:Keyword list operators in BoostBoost 中的关键字列表运算符
【发布时间】:2015-04-27 23:14:50
【问题描述】:

我正在尝试解析属性顺序无关紧要的对象。

例如解析员工

员工 { surname = "doe", firstname = "john", age = 30 }

应该和

一样

员工 { 年龄 = 30,名字 = “约翰”,姓氏 = “能源部”}

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

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

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

即使在阅读了有关关键字列表运算符的文档后,这对我来说也并没有真正加起来。

【问题讨论】:

    标签: c++ boost boost-spirit-qi


    【解决方案1】:

    融合序列仅排序。因此,属性合成的顺序必须与字段适应融合序列的顺序相匹配。

    我不知道合并分隔符的优雅方式(我认为有人应该为此扩展关键字列表解析器指令......随意:))。

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

    或者您可以使用前瞻断言重复表达式,例如

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

    (暂时未测试)。

    【讨论】:

    • 那么仍然可以使用像我的示例那样将无序文本解析为融合序列吗?还是我必须以其他方式做到这一点?
    • 嗯。我认为我没有提到任何限制。我刚刚回答了您的问题,并展示了一种解析分隔符的方法。
    猜你喜欢
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 2015-04-10
    • 1970-01-01
    相关资源
    最近更新 更多