私は、boost :: spiritを使用して文字トークンを解析することに手を加えようとしており、大きな困難を抱えています。ここで私が働いているサンプルコードです:boost :: spirit char/string mix
#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;
}
ERRORは1:
私は何をしたいと、私はA1、A2、B1の全てを解析することを可能にする2つのトークンのルールを作成することです、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â
私は、これは文字の外に列を作成しようとしなければならないと仮定します。私はタイプ推測の任意の数の順列で遊んだが失敗した。
ERROR 2:
また、私はどちらか期待どおりに動作しません+演算子を先頭に追加、トークンの任意の数が、残念ながら、解析することができるようにしたいと思います。
ヒント?規則については
おかげで、精神は非常に簡単/複雑な/素晴らしい/ひどいライブラリです。 –