attr; if( x3::p-6ren">
gpt4 book ai didi

c++ - spirit x3 规则无法在序列解析器中合成 boost::iterator_range 类型的属性

转载 作者:太空狗 更新时间:2023-10-29 21:35:19 27 4
gpt4 key购买 nike

在一个简单的解析器测试中 Live On Coliru ,

std::string str("x123x");
boost::iterator_range<boost::range_iterator<decltype(str)>::type> attr;
if( x3::parse( boost::begin(str), boost::end(str), x3::lit('x') >> x3::raw[+x3::digit] >> x3::lit('x'), attr ) ) {
std::cout<<"Match! attr = "<<attr<<std::endl;
} else {
std::cout<<"Not match!"<<std::endl;
}

解析器

x3::lit('x') >> x3::raw[+x3::digit] >> x3::lit('x')

应该合成类型为 boost::iterator_range<Iterator> 的属性.但它无法编译。如果我们删除两个 x3::lit('x') 中的任何一个,它编译。尽管 Live on Coliru 可以使用 qi 编译相同的代码.

最佳答案

很有趣。实际上它确实编译:

Live On Coliru

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

namespace x3 = boost::spirit::x3;

int main() {
std::string const str("x123x");
boost::iterator_range<std::string::const_iterator> attr;
if(x3::parse(boost::begin(str), boost::end(str), x3::raw[+x3::digit], attr)) {
std::cout<<"Match! attr = "<<attr<<std::endl;
} else {
std::cout<<"Not match!"<<std::endl;
}
}

使它崩溃的是周围的环境:

// simple (ok):
x3::parse(boost::begin(str), boost::end(str), x3::raw[+x3::digit], attr);
// ok:
parse(boost::begin(str), boost::end(str), x3::eps >> x3::raw[+x3::digit], attr);
parse(boost::begin(str), boost::end(str), x3::raw[+x3::digit] >> x3::eps, attr);
// breaks:
parse(boost::begin(str), boost::end(str), x3::eps >> x3::raw[+x3::digit] >> x3::eps, attr);

我的猜测是在这种情况下,元编程以某种方式错误地将 iterator_range 视为 Fusion 序列。当然,我认为这是一个错误。

你应该向上游报告这个。

遗憾的是我还没有找到“顺势疗法”的解决方法。

关于c++ - spirit x3 规则无法在序列解析器中合成 boost::iterator_range 类型的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42955312/

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