C++ 精神助推x3(A | A)属性类型为变体<;A、 ?>;而不是
我正在尝试创建一个简单的解析器,它使用C++ 精神助推x3(A | A)属性类型为变体<;A、 ?>;而不是,c++,boost,boost-spirit,boost-spirit-x3,C++,Boost,Boost Spirit,Boost Spirit X3,我正在尝试创建一个简单的解析器,它使用boost::spirit::x3获取两个可能的字符之一。问题是x3::char_('#')|x3::char_('.')似乎有一个boost::variant类型的属性。这意味着我必须在\u attr上使用boost::get,而它应该可以直接转换为字符 ,上面写着A | A->A 如果使用注释掉的mapChars版本,则可以将其转换为char,但不能转换为 我使用的是boost 1.63.0版和Linux。使用-std=c++14在g++和clang++
boost::spirit::x3
获取两个可能的字符之一。问题是x3::char_('#')|x3::char_('.')
似乎有一个boost::variant
类型的属性。这意味着我必须在\u attr
上使用boost::get
,而它应该可以直接转换为字符
,上面写着A | A->A
如果使用注释掉的mapChars
版本,则可以将其转换为char
,但不能转换为
我使用的是boost 1.63.0版和Linux。使用-std=c++14
在g++和clang++上编译代码失败
我做错了什么
#include <iostream>
#include <string>
#include <boost/spirit/home/x3.hpp>
int main() {
std::string s("#");
namespace x3 = boost::spirit::x3;
auto f = [](auto & ctx) {
auto & attr = x3::_attr(ctx);
//char c = attr; // doesn't work
char c = boost::get<char>(attr); // does work
};
auto mapChar = x3::char_('#') | x3::char_('.'); // _attr not convertible to char, is a variant
//auto mapChar = x3::char_('#'); // _attr convertible to char, isn't a variant
auto p = mapChar[f];
auto b = s.begin();
bool success = x3::parse(b, s.end(), p);
std::cout << "Success: " << success << ' ' << (b == s.end()) << '\n';
}
#包括
#包括
#包括
int main(){
std::字符串s(“#”);
名称空间x3=boost::spirit::x3;
自动f=[](自动和ctx){
自动&attr=x3::_attr(ctx);
//char c=attr;//不起作用
char c=boost::get(attr);//有效
};
auto mapChar=x3::char_u('.#')| x3::char_('.');//attr不可转换为char,是一个变体
//auto mapChar=x3::char_u389;('#');//\u attr可转换为char,不是一个变体
自动p=mapChar[f];
自动b=s.begin();
bool success=x3::parse(b,s.end(),p);
std::cout您是对的,它应该是兼容的,事实上它已经是:
auto const& attr = x3::_attr(ctx);
char c;
x3::traits::move_to(attr, c);
Spirit的属性兼容性规则(加上定制点)就是承载这种语义的工具
我同意你的观点,如果属性类型可以直接简化为char
,那么这可能是一个很好的可用性改进,但我认为这会进一步影响未来的结果。如果你的语义操作按值获取属性,那么它应该会起作用:
char result = 0;
auto f = [&result](char c){ result = c; };
auto mapChar = x3::char_('#') | x3::char_('.');
auto p = mapChar[f];
auto b = s.begin();
bool success = x3::parse(b, s.end(), p);
我认为,x3::char_389;(“#”)
应该做你想做的事情。当然,这并不能解决A | A->variant
的问题。对于这个示例,我尝试了非常等效的方法,并且基本上给出了相同的错误(从不兼容的类型分配给char…
)。在这种情况下,x3::traits::move__to
似乎只是在做dest=std::move(src);
,这不会改变任何东西。@aeubanks-Mmm。你是对的。我一定是做错了什么。同时,你可以使用规则强制()这就方便多了:如果您觉得应该讨论这方面的改进,您可以通过[spirit general]邮件列表与开发人员联系