如果使用惰性评估,则实现三元类型

时间:2014-06-10 15:35:15

标签: boost-spirit boost-spirit-qi

我正在为if函数实施生产规则:

qi::rule<Iterator, ascii::space_type, double(void)> f_if;
f_if = qi::ascii::string("if")
            >> qi::char_('(')
            >> (comparator >> ',' >> expression >> ',' >> expression) [qi::_val = boost::phoenix::bind(&Grammar<Iterator>::function_if, this, qi::_1, qi::_2, qi::_3)]
            >> qi::char_(')')
            ;

表达式比较器声明为

qi::rule<Iterator, ascii::space_type, double(void)> expression;
qi::rule<Iterator, ascii::space_type, bool(void)> comparator;

并且绑定函数具有原型

 double function_if(bool comparator, double left, double right);

根据比较器的值,我能做些什么才能评估只有一个表达式

2 个答案:

答案 0 :(得分:4)

使用boost::phoenix::if_else这是C ++三元运算符的actor配方:

>> (comparator >> ',' >> expression >> ',' >> expression) [qi::_val = boost::phoenix::if_else(qi::_1, qi::_2, qi::_3)]

(所有其他代码行都是如此)。

这意味着只会评估qi::_2qi::_3中的一个。

答案 1 :(得分:2)

当然可以!什么都没说,任何东西都被评估。

因此,您解析完整输入片段的AST(抽象语法树),并在评估时跳过不适用的部分。

因此,在很多情况下,关键是分开关注点。如果将解析与其他阶段分开(如评估,或者在编译器,简化,转换和代码生成的情况下),编译器/解释器设计就会变得更简单。