我正在为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);
根据比较器的值,我能做些什么才能评估只有一个表达式?
答案 0 :(得分:4)
使用boost::phoenix::if_else
这是C ++三元运算符的actor配方:
>> (comparator >> ',' >> expression >> ',' >> expression) [qi::_val = boost::phoenix::if_else(qi::_1, qi::_2, qi::_3)]
(所有其他代码行都是如此)。
这意味着只会评估qi::_2
和qi::_3
中的一个。
答案 1 :(得分:2)
当然可以!什么都没说,任何东西都被评估。
因此,您解析完整输入片段的AST(抽象语法树),并在评估时跳过不适用的部分。
因此,在很多情况下,关键是分开关注点。如果将解析与其他阶段分开(如评估,或者在编译器,简化,转换和代码生成的情况下),编译器/解释器设计就会变得更简单。