实施分部运营商

时间:2014-06-12 10:09:17

标签: boost-spirit boost-spirit-qi boost-phoenix

我正在使用提升精神编写一个简单的计算器。

如果遇到零分母,我希望除法运算符抛出异常。

我正在思考

 term =
     factor                      [qi::_val = qi::_1]
     >> *(('*' >> factor         [qi::_val *= qi::_1])
     |
         ('/' >> factor  
        [qi::_val = boost::phoenix::if_else(
            qi::_1, 
            qi::_val / qi::_1, 
            /*ToDo some exception actor here*/)
        ])...

然而,为了理所当然,异常actor不仅需要懒惰抛出“除以零”,而且还必须具有与qi::_val兼容的隐式返回类型。那就是我被困住的地方。我可以在这里使用凤凰中的某些东西,还是需要绑定到手工编码的函数?

1 个答案:

答案 0 :(得分:3)

Boost Phoenix允许您分组语句。括号用于做到这一点。这与boost::phoenix::throw_一起允许您编写

(boost::phoenix::throw_("division by zero"), qi::_1)

ToDo块中。 qi::_1将不会被评估,但是(i)你知道它将评估为0,因为它将会失败" if_else和(ii)它的类型正确。