2

我有一个解析器,它解析来自输入文件的不同数据类型。我已经想通了,这种精神可以在 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)];

我也使用这种类型的规则来检测双打(来自这里这里的答案)。解析器能够在数字 > 65535 的 int 和数字 <= 65535 的 short 之间做出决定。但是,对于 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_ 之间做出决定?

非常感谢!

4

1 回答 1

4

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

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

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

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

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

float_or_double = floatrule | doublerule;
于 2012-12-10T23:01:32.703 回答