语义动作提升
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()
一样可调用才能正常工作。
相关文章:
- 何时在引用或唯一指针上使用移动语义
- 如何从具有移动语义的类对象中生成共享指针
- Boost Spirit,获取迭代器内部语义动作
- 可以使用移动语义更改或改进此C++代码吗?
- c++在使用指针时移动语义
- 在C++17中,引用const字符串的语义应该是什么
- Xcode 语义问题引用或以前定义的代码
- 使用移动和复制语义时函数匹配如何工作?
- 将向量从 N1 缩小到 N2 项,而不触发默认构造函数并仅使用 move 语义
- 移动语义和深层/浅层复制之间有什么关系?
- 了解构造函数在移动、复制、赋值语义中的行为
- std::unique_lock移动语义
- 移动语义和运算符 + 重载
- C++ 移动语义是否在任何情况下都能节省资源?
- 移动语义在这里如何工作?
- 使用移动语义:右值引用作为方法参数
- 是否可以/希望创建不可复制的共享指针模拟(以启用weak_ptr跟踪/借用类型语义)?
- 在C++中使用移动语义的正确方法是什么?
- C++ 价值语义、不可变性和继承性
- 移动语义 c++ 单链表