【问题标题】:boost::spirit (qi) decision between float and doubleboost::spirit (qi) 在 float 和 double 之间做决定
【发布时间】:2012-12-10 16:12:38
【问题描述】:

我有一个解析器,它可以从输入文件中解析不同的数据类型。我已经想通了,这种精神可以在 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)。解析器能够在数字 > 65535 的 int 和数字

 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_ 之间做出决定吗?

非常感谢!

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多