c++ - boost::spirit char/string 混合

标签 c++ parsing boost-spirit

我正试图掌握使用 boost::spirit 来解析字符标记的方法,但遇到了很大的困难。这是我正在处理的示例代码:

#include <boost/spirit/include/qi.hpp>
#include <iostream>
#include <string>

using namespace std;
namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;

template <typename Iterator>
struct tok_parser : qi::grammar<Iterator, string(), ascii::space_type>
{
  tok_parser() : tok_parser::base_type(start)
  {
    tok1   = qi::char_("AB");
    tok2   = qi::char_("12");
    mytoks = (qi::lit("A1") | qi::lit("A2") | qi::lit("B1") | qi::lit("B2"));
    start  = mytoks;
    //start  = tok1 >> tok2;  // error 1
    //start  = +mytoks;       // error 2
  }
  qi::rule<Iterator, string(), ascii::space_type> start;
  qi::rule<Iterator, string(), ascii::space_type> mytoks;
  qi::rule<Iterator, char, ascii::space_type> tok1;
  qi::rule<Iterator, char, ascii::space_type> tok2;
};

int main(int argc, char** argv)
{
  tok_parser<string::const_iterator> g; // Our grammar
  string str = argv[1];
  string::const_iterator iter = str.begin();
  string::const_iterator end = str.end();
  bool r = phrase_parse(iter, end, g, boost::spirit::ascii::space, str);

  if (r && iter == end)
      cout << "Parsing succeeded\n";
  else
      cout << "Parsing failed\n";

  return 0;
}

错误 1:

我想做的是创建两个标记规则,使我能够解析所有 A1、A2、B1、B2,而不必列出所有文字排列。正如代码一样,它编译并识别目标标记。但是,如果我尝试根据 tok1 和 tok2 规则构建我的解析器,它不会编译生成有关类型不匹配的错误:

error: invalid static_cast from type âboost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::ascii> >â to type âcharâ

我认为这与尝试用字符创建字符串有关。我玩过任意数量的类型猜测排列,但都失败了。

错误 2:

此外,我想允许解析任意数量的标记,不幸的是,在 + 运算符前面也不能按预期工作。

有什么建议吗?

最佳答案

对于规则,始终需要使用函数声明语法指定属性:

qi::rule<Iterator, char(), ascii::space_type> tok1;  
qi::rule<Iterator, char(), ascii::space_type> tok2;

这应该可以解决您的编译器问题。

关于你的排列问题:我建议做类似的事情:

rule<Iterator, string(), ascii::space_type> r = char_("AB") >> char_("12");

这将匹配“A1”、“A2”、“B1”或“B2”。

创建另一个规则允许所需的重复:

rule<Iterator, vector<string>(), ascii::space_type> rs = +r;

关于c++ - boost::spirit char/string 混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7073344/

相关文章:

c++ - 使用英特尔 C++ 编译器 2015 Windows 构建 Boost 1.56

javascript - 切换网站语言 JS/JSON

parsing - R5RS 方案中未加引号的向量

parsing - 如何以 boost spirit 正确解析保留字

boost-spirit - 从 boostspirit 语法获取结果(phoenixpush_back 导致编译错误)

c++ - 使用 boost::spirit 的代码中的模糊类型编译错误

c++ - 从我的二维数组中设置和获取值时出错

C++ 传递动态方法指针作为不同类的方法参数

c++ - 混淆外部 API 调用 C++

perl - 如何在 Perl 中解析日期和转换时区?