C++ 使用Boost.Spirit只解析特定的数字
如何构建只匹配特定范围内的数字的Boost.Spirit解析器C++ 使用Boost.Spirit只解析特定的数字,c++,boost,boost-spirit,C++,Boost,Boost Spirit,如何构建只匹配特定范围内的数字的Boost.Spirit解析器 考虑简单的解析器qi::uint\uu。它匹配所有无符号整数。是否可以构造一个将数字0与12345匹配,但不匹配12346或更大的解析器?一种方法是将一个语义动作附加到qi::uint\u解析器,该动作检查解析器的属性并相应地设置语义动作的第三个参数: #include <iostream> #include <string> #include <vector> #include <boo
考虑简单的解析器
qi::uint\uu
。它匹配所有无符号整数。是否可以构造一个将数字0
与12345
匹配,但不匹配12346
或更大的解析器?一种方法是将一个语义动作附加到qi::uint\u
解析器,该动作检查解析器的属性并相应地设置语义动作的第三个参数:
#include <iostream>
#include <string>
#include <vector>
#include <boost/spirit/include/qi.hpp>
namespace qi = boost::spirit::qi;
int main() {
qi::rule<std::string::const_iterator, unsigned(), qi::ascii::space_type> rule;
const auto not_greater_than_12345 = [](const unsigned& attr, auto&, bool& pass) {
pass = !(attr > 12345U);
};
rule %= qi::uint_[not_greater_than_12345];
std::vector<std::string> numbers{"0", "123", "1234", "12345", "12346", "123456"};
for (const auto& number : numbers) {
unsigned result;
auto iter = number.cbegin();
if (qi::phrase_parse(iter, number.cend(), rule, qi::ascii::space, result) &&
iter == number.cend()) {
std::cout << result << '\n'; // 0 123 1234 12345
}
}
}
从 用作语义动作的函数的可能特征为:
...
template <typename Attrib, typename Context>
void fa(Attrib& attr, Context& context, bool& pass);
。。。
模板
无效fa(属性和属性、上下文和上下文、布尔和传球);
。。。这里Attrib
是附加到语义动作的解析器的属性类型。。。语义操作可以使用第三个参数pass
,强制关联的解析器失败。如果pass
设置为false,动作解析器也将立即返回false,同时不调用p,也不生成任何输出
...
template <typename Attrib, typename Context>
void fa(Attrib& attr, Context& context, bool& pass);