在float和double之间的boost :: spirit(qi)决定

时间:2012-12-10 16:12:39

标签: c++ boost boost-spirit boost-spirit-qi

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

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)];

我也使用这种类型的规则来检测双打(来自答案herehere)。解析器能够在int之间决定数字> 65535和数字的缩写< = 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_之间是否存在选项或其他技巧?

非常感谢!

1 个答案:

答案 0 :(得分:4)

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

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

如果你想在float / double之间做出决定,那么就没有真正的输入标准。我建议总是解析为double。但是,您当然可以使用语义操作强制浮动一定大小。

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

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

float_or_double = floatrule | doublerule;