【问题标题】:What does the term "attribute" mean in the context of parsers?在解析器的上下文中,术语“属性”是什么意思?
【发布时间】:2016-03-11 11:24:44
【问题描述】:

我目前正在阅读 Boost Spirit,但我对经常使用但未事先定义的“属性”一词感到困惑。从这个和一些搜索来看,在我看来它是解析中的一个常用术语,但我找不到该术语的定义或描述。

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

【问题讨论】:

  • 通常这意味着与树节点关联的值。真正的问题是,为什么要这样做?可以关联哪些值?你能用它们做什么?这个 SO 答案提供了一些上下文:stackoverflow.com/a/5768686/120163 我不知道 Boost 如何处理属性。

标签: c++ parsing terminology boost-spirit


【解决方案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&lt;int, double&gt;,但你不应该关心这个实现细节;属性传播规则对你隐藏了这个细节

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    • 2010-10-18
    • 2017-04-15
    • 2017-10-23
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多