在qi :: rule上提升精神语义动作

时间:2017-05-13 21:19:38

标签: boost-spirit boost-spirit-qi

我一直在阅读语义行为,我的规则看起来像这样:

  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。该物业融合了融合。我该怎么做?

1 个答案:

答案 0 :(得分:3)

我会 - 一如既往 - 避免语义行为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字段在融合序列中被调整