术语"attribute"在解析器的上下文中是什么意思?

What does the term "attribute" mean in the context of parsers?

本文关键字:上下文 是什么 意思 attribute 术语      更新时间:2023-10-16

我目前正在阅读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>但你不应该关心这个实现细节;属性传播规则对你隐藏了这个细节。