我正在尝试使用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:
此外,我想允许解析任意数量的令牌,遗憾的是,在+运算符之前也没有按预期工作。
任何提示?
答案 0 :(得分:3)
对于规则,始终需要使用函数声明语法指定属性:
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;