首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >坏掉的std::cout输出时使用组合立即=string规则使用qi::double_,一个qi::uint_

坏掉的std::cout输出时使用组合立即=string规则使用qi::double_,一个qi::uint_
EN

Stack Overflow用户
提问于 2020-03-24 13:29:21
回答 1查看 47关注 0票数 1

我试图获得字符串、int和float的直接规则,以便解析以下测试

代码语言:javascript
复制
 //strings
 "\"hello\"",
 "   \"  hello \"  ",
 "  \"  hello \"\"stranger\"\" \"  ",
 //ints
 "1",
 "23",
 "456",
 //floats
 "3.3",
 "34.35"

在线试用:http://coliru.stacked-crooked.com/a/26fbd691876d9a8f

使用

代码语言:javascript
复制
qi::rule<std::string::const_iterator, std::string()> 
  double_quoted_string = '"' >> *("\"\"" >> qi::attr('"') | ~qi::char_('"')) >> '"';

qi::rule<std::string::const_iterator, std::string()> 
  number = (+qi::ascii::digit >> *(qi::char_('.') >> +qi::ascii::digit));

qi::rule<std::string::const_iterator, std::string()>
  immediate = double_quoted_string | number;

给出正确的结果--但我需要使用double_解析,因为我想支持附属式表示法、NaN等等。

但使用

代码语言:javascript
复制
qi::rule<std::string::const_iterator, std::string()>
  immediate = double_quoted_string | qi::uint_ | qi::double_;

整数值的打印

代码语言:javascript
复制
"1" OK: ''
----
"23" OK: ''
----
"456" OK: '�'

而双数不能完全解析

在Coliru,Win7x64 VS2017最新,LLVM clang下进行测试

有时Colliru发出太多警告,编译就会停止。

知道这里发生了什么吗?

精神上的警告通常意味着-什么东西坏了?

UPDATE:如果我只使用double_,在测试它之前,以及随/不使用uint_解析器而更改的行为:https://wandbox.org/permlink/UqgItWkfC2I8tkNF,也会发生这种情况。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-24 16:30:57

在整数和双浮点分析器上使用qi::raw,以便对数字进行词汇转换:qi::raw[qi::uint_]qi::raw[qi::double_]

但解析的顺序也很重要。如果uint_解析器在double_之前,如下所示:

代码语言:javascript
复制
immediate = double_quoted_string | qi::raw[qi::uint_] | qi::raw[qi::double_];
BOOST_SPIRIT_DEBUG_NODES((immediate)); // for debug output

然后,uint_解析器将部分使用双浮点数,然后整个解析将失败:

代码语言:javascript
复制
<immediate>
  <try>34.35</try>
  <success>.35</success> //<----- this is what is left after uint_ parsed
  <attributes>[[3, 4]]</attributes> // <---- what uint_ parser successfully parsed
</immediate>
"34.35" Failed
Remaining unparsed: "34.35"

uint_double_交换顺序后

immediate = double_quoted_string | qi::raw[qi::double_] | qi::raw[qi::uint_];

结果:

代码语言:javascript
复制
"\"hello\"" OK: 'hello'
----
"   \"  hello \"  " OK: '  hello '
----
"  \"  hello \"\"stranger\"\" \"  " OK: '  hello "stranger" '
----
"1" OK: '1'
----
"64" OK: '64'
----
"456" OK: '456'
----
"3.3" OK: '3.3'
----
"34.35" OK: '34.35'
----
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60832051

复制
相关文章

相似问题

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