这取自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
答案 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()
才能生效。