【发布时间】:2015-05-21 13:51:07
【问题描述】:
我想解析一个浮点数,但不允许 NaN 值,所以我生成了一个继承自默认策略的策略并用它创建一个 real_parser:
// using boost::spirit::qi::{real_parser,real_policies,
// phrase_parse,double_,char_};
template <typename T>
struct no_nan_policy : real_policies<T>
{
template <typename I, typename A>
static bool
parse_nan(I&, I const&, A&) {
return false;
}
};
real_parser<double, no_nan_policy<double> > no_nan;
// then I can use no_nan to parse, as in the following grammar
bool ok = phrase_parse(first, last,
no_nan[ref(valA) = _1] >> char_('@') >> double_[ref(b) = _1],
space);
但现在我也要确保用no_nan解析的字符串的总长度不超过4,即“1.23”或“.123”甚至“2.e6”或“inf”是可以的,“3.2323”不是,“nan”也不是。我不能在政策的parse_n/parse_frac_n 部分执行此操作,该部分分别查看点的左/右并且无法通信(...干净地),他们会有因为整体长度是相关的。
当时的想法是扩展real_parser(在boost/spirit/home/qi/numeric/real.hpp 中)并包装parse 方法——但是这个类没有方法。 real_parser 旁边是 any_real_parser 结构,确实有 parse,但这两个结构似乎没有任何明显的交互方式。
有没有一种方法可以轻松地注入我自己的 parse(),进行一些预检查,然后调用 real 解析 (return boost::spirit::qi::any_real_parser<T, RealPolicy>::parse(...)),然后遵循给定的策略?编写一个新的解析器是不得已的方法,但我希望有更好的方法。
(使用 Boost 1.55,即 Spirit 2.5.2,与 C++11)
【问题讨论】:
-
给定你想要的这个节点的规则集,听起来它本身就是一种迷你语言。为它定义一个语法怎么样,然后看看如何compose grammars?
-
@AmiTavory 会非常缓慢和乏味
-
好吧,只要它在某些方面很棒......虽然说真的,这是一个有趣的断言,但如果你能解释为什么会很好(尤其是“慢”部分)。
-
@AmiTavory 当然。今天来回答这个问题
-
好的,谢谢 - 这是一个有趣的问题。
标签: c++ parsing boost boost-spirit boost-spirit-qi