boost.parser parse int or double?
kila suelika via Boost-users <[email protected]> Sat, 12 Apr 2025 15:22:56 +0800
| Newsgroups | gmane.comp.lib.boost.user |
|---|---|
| Message-ID | <CAH8XdD0+utc7gxY5Brsq8Fka5LoK7tZ9TwrSHF6p-KBm=Dy3-g@mail.gmail.com> |
--===============4793366081313274888==
Content-Type: multipart/alternative; boundary="000000000000aaa74906328fb051"
--000000000000aaa74906328fb051
Content-Type: text/plain; charset="UTF-8"
```
#include <boost/parser/parser.hpp>
#include <iostream>
#include <string>
#include <variant>
namespace bp = boost::parser;
auto numeric_parser = bp::int_ | bp::double_;
//auto numeric_parser = bp::double_ | bp::int_;
void parse_number(const std::string& input)
{
auto result = bp::parse(input, numeric_parser);
if (result) {
std::visit([](auto&& arg) {
using T = std::decay_t<decltype(arg)>;
if constexpr (std::is_same_v<T, int>)
std::cout << "Integer: " << arg << std::endl;
else if constexpr (std::is_same_v<T, double>)
std::cout << "double: " << arg << std::endl;
}, *result);
}
else {
std::cout << "Parsing failed:" << " (" << input << ")" << std::endl;
}
}
int main() {
parse_number("24");
parse_number("24.3");
return 0;
}
```
Above code failed to parse "24.3" which makes me confused. First int should
failed but why it didn't match double? If use
```
auto numeric_parser = bp::double_ | bp::int_;
```
then all number parsed to double.
--000000000000aaa74906328fb051
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">```<div>#include <boost/parser/parser.hpp><br>#inclu=
de <iostream><br>#include <string><br>#include <variant><=
br><br>namespace bp =3D boost::parser;<br><br>auto numeric_parser =3D bp::i=
nt_ | bp::double_;<br>//auto numeric_parser =3D bp::double_ | bp::int_;<br>=
<br>void parse_number(const std::string& input)<br>{<br>=C2=A0 =C2=A0 a=
uto result =3D bp::parse(input, numeric_parser);<br>=C2=A0 =C2=A0 if (resul=
t) {<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 std::visit([](auto&& arg) {<br>=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 using T =3D std::decay_t<declt=
ype(arg)>;<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if constexpr (st=
d::is_same_v<T, int>)<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 std::cout << "Integer: " << arg <<=
; std::endl;<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 else if constexpr=
(std::is_same_v<T, double>)<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 std::cout << "double: " << arg &=
lt;< std::endl;<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }, *result)=
;<br>=C2=A0 =C2=A0 }<br>=C2=A0 =C2=A0 else {<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0=
std::cout << "Parsing failed:" << " (" <=
;< input << ")" << std::endl;<br>=C2=A0 =C2=A0 }<b=
r>}<br>int main() {<br><br>=C2=A0 =C2=A0 parse_number("24");<br>=
=C2=A0 =C2=A0 parse_number("24.3");<br>=C2=A0 =C2=A0 return 0;<br=
>}<br></div><div>```</div><div>Above code failed to parse "24.3" =
which makes me confused. First int should failed=C2=A0but why it didn't=
match double? If use=C2=A0</div><div>```</div><div>auto numeric_parser =3D=
bp::double_ | bp::int_;</div><div>```</div><div>then all number parsed to =
double.=C2=A0</div></div>
--000000000000aaa74906328fb051--
--===============4793366081313274888==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
_______________________________________________
Boost-users mailing list
[email protected]
https://lists.boost.org/mailman/listinfo.cgi/boost-users
--===============4793366081313274888==--