什么术语"属性"在解析器的上下文中意味着什么?

时间:2016-03-11 11:24:45

标签: c++ parsing terminology boost-spirit

我正在阅读Boost Spirit,我对术语"属性"感到困惑。使用了很多,但未事先定义。从这一点和一些搜索看来,它在解析中是一个常用术语,但我无法找到该术语的定义或描述。

我认为它类似于解析步骤的结果,但我想要一个明确而准确的定义。

1 个答案:

答案 0 :(得分:1)

属性是解析器的产物。

合成

每个解析器都有一个公开的属性。

在表达式中组合解析器时,结果属性将合并到所谓的合成属性中。例如。 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接受可变数量的参数,这些参数将从解析中接收结果值。

这些被称为“绑定属性”。上下文实际上将直接引用它们。相同的兼容性/传播规则适用于上述内容,因此可以直接执行此操作:

using namespace qi;
std::map<std::string, int> data;
bool ok = phrase_parse(f, l, 'keyvalues: ' >> (lexeme[+alpha] >> '=' >> int_) % ';', space, data);

扩展

可以为用户定义的类型自定义转换和兼容性规则。这有点超出了范围,但是可以在这里找到文档:docs和[SO]提供大量示例来演示它们的使用。

链接

文档列出了与每个操作符/指令合成的类型。

另见Detecting the parameter types in a Spirit semantic action

¹从技术上讲它可能是boost::fusion::vector2<int, double>但你不应该关心这个实现细节;属性传播规则隐藏了这个细节