语义动作提升

Semantic Action Boost

这是取自 Boost Spirit(一个非常淡化的版本)

template <typename Iterator>
    struct calculator : qi::grammar<Iterator, int(), ascii::space_type>
    {
        calculator() : calculator::base_type(expression)
        {
            qi::_val_type _val;
            qi::_1_type _1;
            qi::uint_type uint_;

            expression = term >> *('+' >> term)| ('-' >> term);
            term = uint_[&term_printer]


        qi::rule<Iterator, int(), ascii::space_type> term, expression;
    };
}

现在,通常情况下,当你想使用语义动作时,你会这样写

expression = term >> *('+' >> term[&my_printer] | ('-' >> term[&my_other_printer]);

...

现在,假设在解析时发现 qi::rule 术语的实例时,会调用其他函数 term_printer()。然后,my_printer() 将在 term_printer() 之后输出它应该输出的任何内容。我的问题是,有人知道在发现“+”字符(在此特定示例中)后,在 term_printer() 之前调用 my_printer() 的方法吗?

一些背景如果你不熟悉: http://boost-spirit.com/distrib/spirit_1_8_3/libs/spirit/doc/semantic_actions.html

您必须将一个操作附加到负责 + 的解析器。由于 char 不是 Spirit 解析器(使 '+'[my_parser] 无效),这需要您显式创建 Spirit 解析器而不是依赖 shorthand 符号。 shorthand 符号是 qi::lit 的语法糖,所以:

//                     vvvvvvvvvvvv-- interesting part
expression = term >> *(qi::lit('+')[my_printer] >> term) | ('-' >> term);

lit 解析器没有属性,因此 my_printer 必须可调用为 my_printer() 才能工作。