首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单的信号作用破坏精神X3的结果

简单的信号作用破坏精神X3的结果
EN

Stack Overflow用户
提问于 2019-05-03 07:54:16
回答 1查看 78关注 0票数 0

我有这个精神X3解析器

代码语言:javascript
复制
    auto xyz_def = 
        x3::omit[x3::int_] >> x3::eol >> 
        (x3::lexeme[+(x3::char_ - x3::eol)]) >> x3::eol >>
        (*(chemical::parser::atom >> x3::eol)
    ;

分析,没有问题,就像这样

代码语言:javascript
复制
2
Comment
H 1.2 3.2 4.5
C 1.1 9.1 8.5

现在,我想使用(而不是完全忽略)第一个整数作为提示来帮助构建向量(来自Kleen*)。要做到这一点,我要:

代码语言:javascript
复制
    auto xyz_def = 
        x3::omit[x3::int_[([](auto& ctx){x3::_val(ctx).reserve(x3::_attr(ctx));})]] >> x3::eol >> 
        (x3::lexeme[+(x3::char_ - x3::eol)]) >> x3::eol >>
        (*(chemical::parser::atom >> x3::eol)
    ;

然而,当我这样做的时候,尽管解析函数成功了,我还是有一个空的结果。这是特别神秘的,因为信号作用,原则上,没有明显的副作用。

我找到了一个解决办法,就是显式地介绍所有的语义操作。

代码语言:javascript
复制
    auto xyz_def = 
        x3::omit[x3::int_[([](auto& ctx){x3::_val(ctx).reserve(x3::_attr(ctx));})]] >> x3::eol >> 
        (x3::lexeme[+(x3::char_ - x3::eol)])[([](auto& ctx){x3::_val(ctx).comment = x3::_attr(ctx);})] >> x3::eol >>
        (*(chemical::parser::atom >> x3::eol)[([](auto& ctx){x3::_val(ctx).atoms.insert(end(x3::_val(ctx).atoms), x3::_attr(ctx));})])
    ;

这显然是过头了。为什么当我在第一个元素中添加一个语义动作时,我必须为所有元素添加语义动作?

我最近问了一个相似问题,但我使用了错误版本的精神(气),我现在也使用属性,而不是捕获lambda,以便我可以定义自我包含的规则。

完整的代码是这里,可以粘贴到https://wandbox.org/

EN

回答 1

Stack Overflow用户

发布于 2019-05-03 09:49:18

偶然地,在阅读rule /usr/include/boost/spirit/home/x3/nonterminal/detail/rule.hpp的代码时,我注意到它有第三个模板参数"force属性“。

代码语言:javascript
复制
    template <typename ID, typename Attribute = unused_type, bool force_attribute = false>
    struct rule;

好的,结果是,使用true实现了预期的结果。

代码语言:javascript
复制
    x3::rule<class xyz_, chemical::xyz, true> const xyz = "xyz";

(在x3::rule<class xyz_, chemical::xyz> const xyz = "xyz";之前)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55965469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档