1
我想要使用boost :: spirit來解析字符標記,並且有很大的困難。下面是示例代碼,我的工作:boost :: spirit char /字符串混合
#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:
此外,我想允許解析令牌任意數量的,不幸的是,+運算符前面加上預期要麼不起作用。
任何提示?
謝謝你的提示,精神也相當簡單/複合/妙/可怕庫。 –