Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用Boost.Spirit只解析特定的数字_C++_Boost_Boost Spirit - Fatal编程技术网

C++ 使用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

如何构建只匹配特定范围内的数字的Boost.Spirit解析器


考虑简单的解析器
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);