术语 "attribute" 在解析器的上下文中是什么意思?
What does the term "attribute" mean in the context of parsers?
我目前正在阅读 Boost Spirit,我对经常使用但事先没有定义的术语 "attribute" 感到困惑。从这个和一些搜索来看,在我看来它是解析中的一个常用术语,但我找不到该术语的定义或描述。
我认为它类似于解析步骤的结果,但我想要一个清晰准确的定义。
属性是解析器的产物。
合成
每个解析器都有一个暴露的属性。
当您在表达式中组合解析器时,生成的属性将组合成所谓的合成属性。例如。 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`
绑定属性引用
属性的不同含义有点令人困惑;
parser API 接受可变数量的参数,这些参数将从解析中接收结果值。
这些被称为 "bound attributes"。上下文实际上将直接引用它们。与上面相同的 compatibility/propagation 规则适用,因此可以直接执行此操作:
using namespace qi;
std::map<std::string, int> data;
bool ok = phrase_parse(f, l, 'keyvalues: ' >> (lexeme[+alpha] >> '=' >> int_) % ';', space, data);
正在扩展
可以为用户定义的类型自定义转换和兼容性规则。这有点超出此处的范围,但可以在此处找到文档:docs 和 [SO] 提供了大量示例来演示它们的用途。
链接
- Attribute Propagation and Attribute Compatibility
- The Magical Power Of Attributes: Primitives
- The Magical Power Of Attributes: Directives And Non-Terminals
- The Magical Power Of Attributes: Operators
文档列出了每个 operator/directive.
合成的类型
另见 Detecting the parameter types in a Spirit semantic action
¹ 技术上它可能是 boost::fusion::vector2<int, double>
但你不应该关心这个实现细节;属性传播规则向您隐藏了此详细信息
我目前正在阅读 Boost Spirit,我对经常使用但事先没有定义的术语 "attribute" 感到困惑。从这个和一些搜索来看,在我看来它是解析中的一个常用术语,但我找不到该术语的定义或描述。
我认为它类似于解析步骤的结果,但我想要一个清晰准确的定义。
属性是解析器的产物。
合成
每个解析器都有一个暴露的属性。
当您在表达式中组合解析器时,生成的属性将组合成所谓的合成属性。例如。 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`
绑定属性引用
属性的不同含义有点令人困惑;
parser API 接受可变数量的参数,这些参数将从解析中接收结果值。
这些被称为 "bound attributes"。上下文实际上将直接引用它们。与上面相同的 compatibility/propagation 规则适用,因此可以直接执行此操作:
using namespace qi;
std::map<std::string, int> data;
bool ok = phrase_parse(f, l, 'keyvalues: ' >> (lexeme[+alpha] >> '=' >> int_) % ';', space, data);
正在扩展
可以为用户定义的类型自定义转换和兼容性规则。这有点超出此处的范围,但可以在此处找到文档:docs 和 [SO] 提供了大量示例来演示它们的用途。
链接
- Attribute Propagation and Attribute Compatibility
- The Magical Power Of Attributes: Primitives
- The Magical Power Of Attributes: Directives And Non-Terminals
- The Magical Power Of Attributes: Operators
文档列出了每个 operator/directive.
合成的类型另见 Detecting the parameter types in a Spirit semantic action
¹ 技术上它可能是 boost::fusion::vector2<int, double>
但你不应该关心这个实现细节;属性传播规则向您隐藏了此详细信息