提升Fortran的精神解析器打印双打

时间:2015-12-17 16:26:51

标签: c++ boost-spirit

我正在使用Boost Spirit示例中的num_list3.cpp。我正在测试它可以解析的各种类型。我使用了以下列表:

1.2,0.2
.2,5.
1.e+23,.23E4
0e+10
1.3D+3

我注意到它在解析最后一个数字1.3D+3时失败了。

如何将D设置为double的指数前缀?

2 个答案:

答案 0 :(得分:2)

你不能。

尽管FORTRAN apparently uses this,但它并未广泛用于任何其他环境,并且不是ISO标准化的科学记数法。

答案 1 :(得分:2)

您可以使用Boost.Spirit轻松完成此操作。您只需要使用自定义策略实例化real_parser,该策略将处理“d | D”前缀。它可以很简单:

template <typename Type>
struct fortran_policy : qi::real_policies<Type>
{
    template <typename Iterator>
    static bool parse_exp(Iterator& first, const Iterator& last)
    {
        if (first == last || (*first != 'e' && *first != 'E' && *first != 'd' && *first != 'D'))
            return false;
        ++first;
        return true;
    }
};

然后你只需要使用:

qi::real_parser<double,fortran_policy<double>> double_;

无需更改任何其他内容(尽管语义操作似乎没有必要)。

Live on ideone