语义动作提升
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()
才能工作。
这是取自 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()
才能工作。