c++ - 语义 Action 提升

标签 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;
    };
}

现在,通常情况下,当你想使用语义 Action 时,你会写这样的东西

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() 才能工作。

关于c++ - 语义 Action 提升,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30384240/

相关文章:

c++ - gdb 将稳定的时钟值转换为实际时间

C++ 为类初始化成员数组的所有值

c++ - 指向 char 的指针与字符串

Android NDK 使用多核 cpu

c++ - 如何从 Boost Spirit 中的函数中抛出 expectation_failure?

c++ - Cin.get() 不等待按键,即使在它之前有 cin.ignore()

c++ - 使用 boost Spirit x3 解析为集合

c++ - 如何在符号前面的映射值中显示与字符一样多的空格

c++ - 使用 sprit boost 解析器库规则调用函数或仿函数以将值保存在 vector c++ 中

c++ - 为什么我无法访问语义操作中的值?