2011-08-16 13 views
1

私は、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:

また、私はどちらか期待どおりに動作しません+演算子を先頭に追加、トークンの任意の数が、残念ながら、解析することができるようにしたいと思います。

ヒント?規則については

答えて

3

、属性は常に関数宣言の構文を使用して指定する必要があります

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

あなたのコンパイラの問題を解決するべきです。

Wrtのあなたの順列の問題: 'A1'、 'A2'、 'B1' または 'B2' をマッチします

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

:私のような何かをすることをお勧めしたいです。別のルールを作成する

が必要な繰り返しが可能になります:先端のための

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

おかげで、精神は非常に簡単/複雑な/素晴らしい/ひどいライブラリです。 –

関連する問題