【问题标题】:boost::spirit::qi - Working with instance members in grammar structboost::spirit::qi - 使用语法结构中的实例成员
【发布时间】:2015-05-07 12:32:33
【问题描述】:

我正在尝试创建用于解析 RTF 文件的语法。在某些时候,我需要在语法范围内存储一些信息。我知道,我可以使用继承属性,但这会降低可读性。

所以我问自己语法的实例成员变量是否可以解决我的问题,如果可以,我应该如何在我的语法中使用它们?

例如,我需要跟踪活动代码页以进行字符转换。在我的语法结构中包含int codepage 是一种好习惯吗?

我进一步想要的是,调用一些函数来将状态变量放入和弹出堆栈。我想我会将状态信息合并到一个 RtfState 类中,我可以根据需要对其进行扩展。调用语法结构的成员函数的最佳方法是什么?

【问题讨论】:

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


    【解决方案1】:

    你可以。只需对 phx::bind 使用语义操作:

    namespace phx = boost::phoenix;
    switch_cp = qi::int_ [ phx::bind(&MyGrammar::_codepage, this) = _1 ];
    

    但是,请记住,这会破坏可重入性:如果相关规则可以嵌套,请不要使用它。


    或者,调用方法看起来像:例如

    switch_cp = qi::int_ [ phx::bind(&MyGrammar::push_codepage, this, _1) ];
    
    reset_cp = qi::eps [ phx::bind(&MyGrammar::pop_codepage, this) ]
    

    一般阅读:Boost Spirit: "Semantic actions are evil"?

    【讨论】:

    • 感谢您的回答,@sehe。我这样解决了:lit("{") [phx::bind(&RtfState::saveState, ref(state))]lit("}") [phx::bind(&RtfState::restoreState, ref(state))]rtfFontTable [phx::bind(&RtfState::addFonts, ref(state), _1)]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多