语义动作提升

时间:2015-05-21 21:00:13

标签: c++ boost-spirit

这取自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()将输出它应该在AFTER_printer()之后的任何内容。我的问题是,有没有人知道在发现'+'字符时(在这个具体的例子中)调用my_printer()BEFORE term_printer()的方法?

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

1 个答案:

答案 0 :(得分:3)

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

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

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