语义动作提升

Semantic Action Boost

本文关键字:语义      更新时间:2023-10-16

这是来自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的实例时,将调用其他函数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解析器,而不是依赖于速记符号。对于qi::lit,简写符号是语法糖,因此:

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

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