2016-07-24 104 views
1

我想用spirit x3将各种数字解析成一个字符串。我试图这样做,但它不起作用。用boost spirit x3解析一个数字到一个字符串

typedef x3::rule<class int_parser_id, std::string> int_parser_type; 
const int_parser_type int_parser = "int_parser"; 
auto const int_parser_def = x3::int32; 

我能做些什么来解析一个INT与x3 :: int32分析器到一个字符串?

+2

只是说“它不起作用”并没有告诉我们任何可以帮助你的东西。请描述***如何“它不起作用”。你有构建错误吗?在运行时崩溃?错误的结果?越详细越好。如果出现构建错误,您应该将错误(全部和完整)*作为文本*未经编辑复制粘贴到问题的正文中。如果您收到意想不到的结果,请告诉我们您的输入以及实际的*和预期的*输出。如果发生崩溃,则在调试器中运行以查找崩溃。另请[请阅读如何提出好问题](http://stackoverflow.com/help/how-to-ask)。 –

+0

@JoachimPileborg:在这种情况下,它不起作用,就像我的车不会游泳一样 - 图书馆不是这样的。但是,如果OP知道,他们不会首先问这个问题......; - ] – ildjarn

+2

这个解析器应该将一系列数字解析为一个字符串: std :: string input =“1234”; std :: string out; x3 :: phrase_parse(input.begin(),input.end(),+ x3 :: digit,x3 :: space,out); assert(输出==输入); (意思是一个或多个数字,'digit'分析器的属性是'char',所以当你在前面加一个加号时,你会得到一个char或string的向量)。 – matiu

回答

1

解析正在扫描字符串以产生具体类型或类型集合的对象;你要求的是与Spirit相反的那种,Spirit称之为“一代”。 Spirit.X3只执行解析,所以对你的直接问题的答案是:你不能。

但是,Spirit确实附带了一个用于生成的独立组件:Spirit.Karma

namespace karma = boost::spirit::karma; 

int const i = /*...*/; 
std::string str; 
karma::generate(std::back_inserter(str), karma::int_, i); 

Online Demo

必须指出的是,噶是一个C++代码库03,因此具有更长的编译时间比X3 - 强烈建议使用预编译头!