4

int32_taまたは aを解析するパーサーを作成しようとしていdoubleます。最初の試みとして、私はこのパーサーを書きました:

const auto int_or_double = boost::spirit::x3::int32 | boost::spirit::x3::double_;

boost::variant<int32_t, double> パーサーが int のような解析に成功することを期待して12, 100, -42, 7いますが、 double のような解析に失敗します13.243, 42.7, 12.0 -10000.3

ここにライブデモがあります

このパーサーが double で失敗するのはなぜですか?

4

2 に答える 2

6

あなたの問題はこの質問に非常に似ています。

整数パーサーが文法で最初に出現する場合、それが優先されます。入力"12.9"の場合、パーサーは整数部分を解析し、"12.912停止し.ます。live example

double パーサーが整数パーサーよりも優先されるように、順序を逆にする必要があります。

const auto double_or_int =  boost::spirit::x3::double_ | boost::spirit::x3::int32;

これは次の場合に機能し"12.9"ます。live example

"12"ただし、double パーサーは整数も解析するため、入力が次 の場合でも、常に double を取得します。live example

これを防ぐには、厳密な double パーサーが必要です。

boost::spirit::x3::real_parser<double, boost::spirit::x3::strict_real_policies<double> > const double_ = {};

live example

于 2016-06-19T12:06:55.633 に答える
1

どちらも知りませんでしたstrict_real_policies、便利そうです。

次のように、より直接的な方法でこれを回避しました。

(qi::int_ >> !lit('.') >> !lit('e') >> !lit('E')) | qi::float_

http://www.json.org/のフロー チャートを 見ると、これらの 3 文字が、数値を float として解析するすべての正当な方法をカバーしていることがわかります。(私の特定の問題では。)

于 2016-06-19T14:16:04.013 に答える