gpt4 book ai didi

c++ - 简单的语义 Action 破坏了 Spirit X3 中的结果

转载 作者:行者123 更新时间:2023-11-28 04:18:46 25 4
gpt4 key购买 nike

我有这个 Spirit X3 解析器

    auto xyz_def = 
x3::omit[x3::int_] >> x3::eol >>
(x3::lexeme[+(x3::char_ - x3::eol)]) >> x3::eol >>
(*(chemical::parser::atom >> x3::eol)
;

哪个解析,像这样没有问题

2
Comment
H 1.2 3.2 4.5
C 1.1 9.1 8.5

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

    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)
;

然而,当我这样做时,虽然解析函数成功了,但我得到的结果是空的。这是特别神秘的,因为语义 Action 原则上没有显着的副作用。

我找到了这个解决方法,它显式地引入了所有语义 Action 。

    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));})])
;

这显然是矫枉过正。为什么当我在第一个元素中只添加一个语义 Action 时,我必须为所有元素添加语义 Action ?

我最近问了一个similar question ,但我使用了错误版本的 Spirit (Qi),而且我现在也使用属性而不是捕获 lambda,这样我就可以定义独立的规则。

完整代码是here , 可以贴在https://wandbox.org/

最佳答案

无意中,在阅读rule的代码时/usr/include/boost/spirit/home/x3/nonterminal/detail/rule.hpp我注意到它有第三个模板参数,称为“force attributes”。

    template <typename ID, typename Attribute = unused_type, bool force_attribute = false>
struct rule;

嗯,结果是把true取得了预期的效果。

    x3::rule<class xyz_, chemical::xyz, true> const xyz = "xyz";

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

关于c++ - 简单的语义 Action 破坏了 Spirit X3 中的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55965469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com