僕は小数点数のパースがやりたかった
Boost.Spirit.Qi で定数リテラルのパースを行う処理を書くときに,小数点数と整数のパースでちょっと詰まった.
qi::double_ | qi::int_
とすると 42
などの整数値も double
型でパースされてしまうし,
qi::int_ | qi::double_
とすると,3.14
などの小数点数でも最初の 3
だけ読んで整数にパースされてしまう.
先読みして .
があるか調べても良いけれど,inf
とかもあるので面倒だと思って,ドキュメントに泣きついてみると,qi::double_
のような簡易パーサでなく,qi::real_parser
を使うと,第2テンプレート引数にポリシーというのが取れることに気づいた.このポリシーに qi::strict_real_policies
を指定してやると,小数点.
があるときのみ小数点数にパースしてくれるようになる.他にも,符号なしの場合のみパースする qi::ureal_policies
といった定義済みポリシーがあり,必要であれば自作もできるらしい.
もっと簡潔に書けるかもしれないけれど,とりあえずはこれでいけてる.