gpt4 book ai didi

c++ - 使用qi::double_和qi::uint_的组合即时=字符串| float | int规则时,std::cout输出损坏

转载 作者:行者123 更新时间:2023-12-02 10:19:34 25 4
gpt4 key购买 nike

我尝试获取字符串,整数和浮点数的即时规则,以便我可以解析以下测试

 //strings
"\"hello\"",
" \" hello \" ",
" \" hello \"\"stranger\"\" \" ",
//ints
"1",
"23",
"456",
//floats
"3.3",
"34.35"

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

使用
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等。

但是使用
qi::rule<std::string::const_iterator, std::string()>
immediate = double_quoted_string | qi::uint_ | qi::double_;

打印整数值
"1" OK: ''
----
"23" OK: ''
----
"456" OK: '�'

而双数完全无法解析

在Coliru,Win7x64 VS2017最新,LLVM clang-cl下测试

有时Colliru发出过多警告,并且编译停止

知道这里会发生什么吗?

精神上的警告通常意味着-停在这里,一些严重损坏的东西吗?

更新:如果我仅使用 double_,也会在我测试它并且使用/不使用 uint_解析器更改行为时发生
尝试: https://wandbox.org/permlink/UqgItWkfC2I8tkNF

最佳答案

在整数和双浮点解析器上使用qi::raw,以便按词法转换数字:qi::raw[qi::uint_]qi::raw[qi::double_]

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

immediate = double_quoted_string | qi::raw[qi::uint_] | qi::raw[qi::double_];
BOOST_SPIRIT_DEBUG_NODES((immediate)); // for debug output

然后 uint_解析器将部分使用双浮点数,然后整个解析将失败:
<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_];
结果:
"\"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'
----

关于c++ - 使用qi::double_和qi::uint_的组合即时=字符串| float | int规则时,std::cout输出损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60832051/

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