【问题标题】:Boost spirit semantic actions on qi::rule提升 qi::rule 上的精神语义动作
【发布时间】:2017-05-13 21:19:37
【问题描述】:

我一直在阅读有关语义操作的信息,并且我有一个如下所示的规则:

  property_rule %=
    identifier_rule % ','
    >> lit(L":")
    >> type_specification_rule
    >> -(lit(L":=") >> +(alnum - ';'))
    >> lit(L";");

property_rule 定义为

qi::rule<Iterator, property(), space_type> property_rule;

现在,我也想支持运营商 所以我想要的是将规则更改为类似

...
>> -(( lit(L":=") || lit(L"≡")[SEMANTIC_ACTION_HERE]) >> +(alnum - ';'))
...

在语义动作中,我想更改正在解析的property,具体是将其字段is_constant设置为true。该属性已适应融合。我该怎么做?

【问题讨论】:

    标签: boost-spirit boost-spirit-qi


    【解决方案1】:

    我会 - 一如既往 - 避免语义操作(Boost Spirit: "Semantic actions are evil"?)

    我只是在替代方案的两个分支上综合is_constant 的值:

    >> -(( lit(L":=") || lit(L"≡")[SEMANTIC_ACTION_HERE]) >> +(alnum - ';'))
    

    会变成:

    >> -(
            (L":=" >> attr(false) | L"≡" >> ::attr(true)) >> +(alnum - ';')
        )
    

    注意事项:

    1. lit 是隐含的
    2. 你可能不想要||解析器操作符
    3. 这假设 is_constant 字段已在融合序列中进行了调整

    【讨论】:

    • 嗯,您假设当融合序列被调整时,bool is_constant 的出现顺序是它位于变量名称之前之前。它没有。它紧随其后。因此,attr(false) 会尝试将bool 分配给wstring。有什么办法解决这个问题?
    • 是的。修复规则中的顺序。以更有用的顺序进行调整。使用命名的融合视图 :) (另外,我什至无法猜测语法中“变量”的存在与否,无论是在类似运算符的符号之前还是之后。我只是注意到,因为你觉得很舒服只是提到“融合适应”,我很高兴提到我依赖它)。
    • 我已经更改了融合顺序,但现在+(alnum - ';') 部分没有解析为它必需的wstring,知道为什么会这样吗?
    • 不,因为您没有显示 SSCCE(在肢体上,尝试qi::as_wstring
    • (如果您想查看 Phoenix - 而不是自动传播 - 方法,请参阅例如 PS. section here
    猜你喜欢
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    相关资源
    最近更新 更多