提升::精神(气)在浮点和双倍之间做出决定

boost::spirit (qi) decision between float and double

本文关键字:之间 决定 精神 提升      更新时间:2023-10-16

>我有一个解析器,它可以解析输入文件中的不同数据类型。我已经想通了,这种精神可以在短和整之间做出决定,例如:

value %= (shortIntNode | longIntNode);

shortIntNode %= (qi::short_ >> !qi::double_)
                [qi::_val = phoenix::bind(&CreateShortIntNode, qi::_1)];
longIntNode  %= (qi::int_ >> !qi::double_)
                [qi::_val = phoenix::bind(&CreateLongIntNode, qi::_1)];

我也使用这种类型的规则来检测双精度(来自这里和这里的答案)。解析器能够在 int 表示数字> 65535 和 short 表示数字 <= 65535 之间做出决定。但是,对于float_和double_,它没有按预期工作。它只是将这些值舍入以将其解析为浮点值,如果有这样的规则:

 value %= (floatNode | doubleFloatNode);   

floatNode       %= (qi::float_)
                   [qi::_val = phoenix::bind(&CreateFloatNode, qi::_1)];
doubleFloatNode %= (qi::double_)
                   [qi::_val = phoenix::bind(&CreateDoubleFloatNode, qi::_1)];

您是否知道是否有选项或其他技巧可以根据数据类型范围在float_和double_之间做出决定?

谢谢!

Lexing 可以提供帮助。最终由您决定,而不是解析器。订购您的分支机构应该会有所帮助。参见

  • 使用提升精神解析 int 或双精度 (longest_d)

  • 与 qi::重复和可选解析器不匹配

对于具有Boost Spirit的类似解析器。

如果要在浮点数/双精度数之间做出决定,则没有实际的输入标准。我建议总是解析为双精度。但是,您当然可以使用语义操作来强制浮点数达到特定大小。

以下是C++语法的作用(例如):

floatrule  = lexeme [ float_ >> 'f' ];
doublerule = double_;
float_or_double = floatrule | doublerule;