Boost spirit 解析器的 Fortran 打印双打
Boost spirit parser of Fortran printed doubles
我正在使用来自 Boost Spirit 示例的 num_list3.cpp。我正在测试它可以解析的各种双精度类型。我使用了以下列表:
1.2,0.2
.2,5.
1.e+23,.23E4
0e+10
1.3D+3
我注意到它无法解析最后一个数字 1.3D+3
。
如何将 D
设置为双精度数的指数前缀?
你不能。
尽管 FORTRAN apparently uses this,它并未广泛用于任何其他上下文,也不是 ISO 标准化的科学记数法。
您可以使用 Boost.Spirit 轻松做到这一点。您只需要使用处理 "d|D" 前缀的自定义策略来实例化 real_parser
。它可以像这样简单:
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_;
无需更改任何其他内容(尽管语义操作似乎相当不必要)。
我正在使用来自 Boost Spirit 示例的 num_list3.cpp。我正在测试它可以解析的各种双精度类型。我使用了以下列表:
1.2,0.2
.2,5.
1.e+23,.23E4
0e+10
1.3D+3
我注意到它无法解析最后一个数字 1.3D+3
。
如何将 D
设置为双精度数的指数前缀?
你不能。
尽管 FORTRAN apparently uses this,它并未广泛用于任何其他上下文,也不是 ISO 标准化的科学记数法。
您可以使用 Boost.Spirit 轻松做到这一点。您只需要使用处理 "d|D" 前缀的自定义策略来实例化 real_parser
。它可以像这样简单:
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_;
无需更改任何其他内容(尽管语义操作似乎相当不必要)。