【问题标题】:Parse int or double using boost spirit (longest_d)使用 boost 精神 (longest_d) 解析 int 或 double
【发布时间】:2012-10-27 00:34:28
【问题描述】:

我正在寻找一种将字符串解析为 int 或 double 的方法,解析器应该尝试这两种方法并选择与输入流中最长部分匹配的方法。

有一个已弃用的指令 (longest_d) 完全符合我的要求:

number = longest_d[ integer | real ];

...既然它已被弃用,还有其他选择吗?如果需要实现语义动作来实现所需的行为,有没有人有建议?

【问题讨论】:

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


    【解决方案1】:

    首先,请切换到 Spirit V2 - 它已经取代了 classical 精神多年。

    其次,您需要确保 int 被首选。默认情况下,double 可以很好地解析任何整数,因此您需要改用strict_real_policies

    real_parser<double, strict_real_policies<double>> strict_double;
    

    现在你可以简单地陈述

    number = strict_double | int_;
    

    查看测试程序Live on Coliru

    #include <boost/spirit/include/qi.hpp>
    
    using namespace boost::spirit::qi;
    
    using A  = boost::variant<int, double>;
    static real_parser<double, strict_real_policies<double>> const strict_double;
    
    A parse(std::string const& s)
    {
        typedef std::string::const_iterator It;
        It f(begin(s)), l(end(s));
        static rule<It, A()> const p = strict_double | int_;
    
        A a;
        assert(parse(f,l,p,a));
    
        return a;
    }
    
    int main()
    {
        assert(0 == parse("42").which());
        assert(0 == parse("-42").which());
        assert(0 == parse("+42").which());
    
        assert(1 == parse("42.").which());
        assert(1 == parse("0.").which());
        assert(1 == parse(".0").which());
        assert(1 == parse("0.0").which());
        assert(1 == parse("1e1").which());
        assert(1 == parse("1e+1").which());
        assert(1 == parse("1e-1").which());
        assert(1 == parse("-1e1").which());
        assert(1 == parse("-1e+1").which());
        assert(1 == parse("-1e-1").which());
    }
    

    【讨论】:

    • 可能是我不理解问题的场景,但number=double_|int_ 不能正常工作?
    • @llonesmiz 是的,real_parser>()|int_ 也可以正常工作。
    • (int_ - double_)不是总是解析失败,因为每个int都可以解析为double吗?
    • 不应该把顺序倒过来number = strict_double | int_吗?假设它尝试从左到右解析。
    • @UndefinedPavel 当然,你说得对。现在添加了一个带有固定版本的测试程序:)(排序是这个答案的旧版本的遗留物。显然,我设法捏造了两次......
    猜你喜欢
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多