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 &lt;boost/parser/parser.hpp&gt;<br>#inclu=
de &lt;iostream&gt;<br>#include &lt;string&gt;<br>#include &lt;variant&gt;<=
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&amp; 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&amp;&amp; arg) {<br>=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 using T =3D std::decay_t&lt;declt=
ype(arg)&gt;;<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if constexpr (st=
d::is_same_v&lt;T, int&gt;)<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 std::cout &lt;&lt; &quot;Integer: &quot; &lt;&lt; arg &lt;&lt=
; std::endl;<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 else if constexpr=
 (std::is_same_v&lt;T, double&gt;)<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 std::cout &lt;&lt; &quot;double: &quot; &lt;&lt; arg &=
lt;&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 &lt;&lt; &quot;Parsing failed:&quot; &lt;&lt; &quot; (&quot; &lt=
;&lt; input &lt;&lt; &quot;)&quot; &lt;&lt; std::endl;<br>=C2=A0 =C2=A0 }<b=
r>}<br>int main() {<br><br>=C2=A0 =C2=A0 parse_number(&quot;24&quot;);<br>=
=C2=A0 =C2=A0 parse_number(&quot;24.3&quot;);<br>=C2=A0 =C2=A0 return 0;<br=
>}<br></div><div>```</div><div>Above code failed to parse &quot;24.3&quot; =
which makes me confused. First int should failed=C2=A0but why it didn&#39;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==--