术语"attribute"在解析器的上下文中是什么意思?
What does the term "attribute" mean in the context of parsers?
我目前正在阅读Boost Spirit,我对经常使用但事先没有定义的术语"属性"感到困惑。从这个和一些搜索来看,在我看来,它是解析中的常用术语,但我找不到该术语的定义或描述。
我认为这类似于解析步骤的结果,但我想要一个清晰准确的定义。
属性是解析器的乘积。
合成
每个解析器都有一个公开的属性。
在表达式中组合解析器时,生成的属性将合并到所谓的合成属性中。 例如 int_ >> double_
合成为 (int, double)¹ 的元组。
增殖
当公开的属性传播到周围的规则上下文时,可以进行许多自动兼容性规则和转换,例如
qi::rule<It, std::string()> r1 = +qi::char_; // std::vector<char> -> std::string
qi::rule<It, boost::optional<int>()> r2 = qi::int_;
qi::rule<It, map<int, double>() > r3 = (qi::int_ >> qi::double) % ';'; // requires `boost/fusion/adapted/std_pair.hpp`
绑定属性引用
这是一个有点令人困惑的属性的不同含义;
解析器 API 接受可变数量的参数,这些参数将从解析中接收结果值。
这些属性称为"绑定属性"。上下文实际上将直接引用它们。与上述相同的兼容性/传播规则适用,因此可以直接执行此操作:
using namespace qi;
std::map<std::string, int> data;
bool ok = phrase_parse(f, l, 'keyvalues: ' >> (lexeme[+alpha] >> '=' >> int_) % ';', space, data);
扩展
可以为用户定义的类型自定义转换和兼容性规则。这有点超出这里的范围,但文档可以在这里找到:文档和 [SO] 托管了大量示例来演示它们的使用。
链接
- 属性
- 传播和属性兼容性
- 属性的神奇力量:原始人
- 属性的神奇力量:指令和非终端
- 属性的神奇力量:运算符
文档列出了使用每个运算符/指令合成的类型。
另请参阅检测 Spirit 语义操作中的参数类型
¹ 从技术上讲,它可能boost::fusion::vector2<int, double>
但你不应该关心这个实现细节;属性传播规则对你隐藏了这个细节。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 在谈论重叠 I/O 时,上下文信息是什么意思
- 设置 GL 上下文时'framebuffer'的目的是什么?
- 参考的上下文是什么意思?
- 后期绑定的优点是什么?举一个C++中函数指针上下文的例子
- 建立和拆除单元测试上下文的概念的恰当名称是什么