【问题标题】:boost::spirit::x3 attribute compatibility rules, intuition or code?boost::spirit::x3 属性兼容性规则,直觉还是代码?
【发布时间】:2016-05-13 04:01:43
【问题描述】:

是否有文档描述了各种 spirit::x3 规则定义操作如何影响属性兼容性?

我很惊讶:

x3::lexeme[ x3::alpha > *(x3::alnum | x3::char_('_')) ]

无法移动到融合适应的结构中:

struct Name {
    std::string value;
};

我暂时去掉了第一个强制的字母字符,但我仍然想表达一个规则,定义名称字符串必须以字母开头。这是我需要尝试添加eps 直到它起作用的情况之一,还是有说明上述方法不起作用的原因?

抱歉,如果这已经写在某个地方,我找不到它。

【问题讨论】:

  • 根据我在文档中可以找到的内容 ([1] [2] [3] [4]) 应该减少到单个字符向量,所以它应该可以工作。也许是一个错误?
  • 您能否使用完整的工作代码示例更新您的问题,以便重现此问题?
  • @DanMašek 我完全同意这一点。我做到了是因为我是一个 rountinier,但我讨厌经历这些动作,因为这只是在浪费时间,而且我经常“神奇地”不重现最初的问题......
  • 我不能直接打字。摩尔咖啡:)

标签: c++ boost boost-spirit boost-spirit-x3


【解决方案1】:

如果您不在开发分支上,则您没有针对该单元素序列适应错误的修复程序,所以是的,可能就是这样。

由于属性转换/传播的通用性,有很大的回旋余地,但当然它只是记录在案并最终在代码中。换句话说:没有魔法。

在 Qi 时代,我只需用qi::as<>qi::attr_cast<> 拼出所需的转换,就可以“解决”这个问题。 X3 还没有(目前),但您可以使用规则很容易地模仿它:

Live On Coliru

#include <iostream>
#include <boost/fusion/adapted/struct.hpp>
#include <boost/spirit/home/x3.hpp>

namespace x3 = boost::spirit::x3;

struct Name {
    std::string value;
};

BOOST_FUSION_ADAPT_STRUCT(Name, value)

int main() {

    std::string const input = "Halleo123_1";
    Name out;

    bool ok = x3::parse(input.begin(), input.end(),
            x3::rule<struct _, std::string>{} =
            x3::alpha >> *(x3::alnum | x3::char_('_')),
            out);

    if (ok)
        std::cout << "Parsed: " << out.value << "\n";
    else
        std::cout << "Parse failed\n";
}

打印:

Parsed: Halleo123_1

自动化

因为 X3 与 c++14 核心语言特性配合得非常好,所以减少打字并不难:

Understanding the List Operator (%) in Boost.Spirit

【讨论】:

  • 再次感谢 - as&lt;&gt; 模板成功了 - 为结构定义了我的规则,但定义是 as&lt;std::string&gt; 并且它弄明白了。
  • 顺便说一句,那个单元素序列修复是否进入了 1.61?
  • @experquisite 据我所知(我检查了 a8e391bd99dddb 并且它在 master 中,但我怀疑它已被标记 - 似乎没有对应于 1.61 的标记)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多