2010-09-09 14 views
0

Comment puis-je définir le codage des valeurs dans assign_a? Je dois mettre cyrrilic, mais je nai aucune idée comment fairecodage dans boost.spirit

#include "filter_data.h" 
    #include <boost/bind.hpp> 
    #include <boost/spirit.hpp> 
    #include <boost/spirit/actor.hpp> 
    #include <boost/spirit/attribute.hpp> 
    #include <boost/config/warning_disable.hpp> 
    #include <boost/spirit/home/support/char_encoding/standard_wide.hpp> 
    #include <boost/spirit/home/support/char_class.hpp> 
    #include <string> 

    using namespace boost::spirit; 
    using char_encoding::standard_wide; 
    class filter_grammar : public grammar<filter_grammar> 
    { 
    public: 

     static filter_data _filter_data; 

    protected: 

     static std::pair<std::wstring,std::wstring> _replace_arg; 
     static std::wstring _remove_arg; 
     static std::wstring _duplicate_arg; 
     static std::wstring _errorstr; 

     static void add_replace_arg(); 
     static void add_remove_arg(); 
     static void add_duplicate_arg(); 
     static void err(); 

    public: 
     template<typename ScannerT> 
     class definition { 
     public: 
      definition(const filter_grammar & self); 

      rule<ScannerT> const & start() const ; 

     private: 
      rule<ScannerT> filters, filter_replace, filter_remove, filter_duplicate,errstr,arg; 

      typedef definition _self; 
     }; 
    }; 


    template<typename ScannerT> 
    filter_grammar::definition<ScannerT>::definition(const filter_grammar & self) 
    { 
      filters = *(filter_replace|filter_remove|filter_duplicate|errstr); 
      filter_replace = str_p("replace_word")>>blank_p>>arg[assign_a(_replace_arg.first)]>>blank_p>>arg[assign_a(_replace_arg.second)][boost::bind(&filter_grammar::add_replace_arg)]>>!(ch_p('\r'))>>ch_p('\n'); 
      filter_remove = str_p("remove_word")>>blank_p>>arg[assign_a(_remove_arg)][boost::bind(&filter_grammar::add_remove_arg)]>>!(ch_p('\r'))>>ch_p('\n'); 
      filter_duplicate = str_p("duplicate_word")>>blank_p>>arg[assign_a(_duplicate_arg)][boost::bind(&filter_grammar::add_duplicate_arg)]>>!(ch_p('\r'))>>ch_p('\n'); 
      errstr = *(arg[assign_a(_errorstr)][boost::bind(&filter_grammar::err)]>>!ch_p('_')>>!arg[assign_a(_errorstr)][boost::bind(&filter_grammar::err)]>>!blank_p)>>!(ch_p('\r'))>>ch_p('\n'); 

      arg = lexeme_d[+anychar_p]; 
    } 

    template<typename ScannerT> 
    rule<ScannerT> const & filter_grammar::definition<ScannerT>::start() const 
    { 
      return filters; 
    } 
filter_data filter_grammar::_filter_data; 

std::pair<std::wstring,std::wstring> filter_grammar::_replace_arg; 
std::wstring filter_grammar::_remove_arg; 
std::wstring filter_grammar::_duplicate_arg; 
std::wstring filter_grammar::_errorstr; 

void filter_grammar::add_replace_arg() 
{ 
    try 
    { 
     _filter_data._replace.insert(std::make_pair(_filter_data._total_count,_replace_arg)); 
     _filter_data._queue.insert(std::make_pair(_filter_data._total_count,std::make_pair(1,_filter_data._total_count))); 
     _filter_data._total_count++; 
    } 
    catch(std::exception& e) 
    { 
     std::wcerr << "Exception:" << e.what() << std::endl; 
    } 
} 

void filter_grammar::add_remove_arg() 
{ 
    try 
    { 
     _filter_data._remove.insert(std::make_pair(_filter_data._total_count,_remove_arg)); 
     _filter_data._queue.insert(std::make_pair(_filter_data._total_count,std::make_pair(2,_filter_data._total_count))); 
     _filter_data._total_count++; 
    } 
    catch(std::exception& e) 
    { 
     std::wcerr << "Exception:" << e.what() << std::endl; 
    } 
} 

void filter_grammar::add_duplicate_arg() 
{ 
    try 
    { 
     _filter_data._duplicate.insert(std::make_pair(_filter_data._total_count,_duplicate_arg)); 
     _filter_data._queue.insert(std::make_pair(_filter_data._total_count,std::make_pair(3,_filter_data._total_count))); 
     _filter_data._total_count++; 
    } 
    catch(std::exception& e) 
    { 
     std::wcerr << "Exception:" << e.what() << std::endl; 
    } 
} 

void filter_grammar::err() 
{ 
    std::wcerr<<"Error - unknown symbol: "<<_errorstr<<" in filter file"<<std::endl; 

} 

Répondre

1

Tout d'abord, vous mixez Spirit.Classic (la version plus pof Spirit) avec Spirit.Qi (la version actuelle). S'il vous plaît ne le faites pas car cela ne fonctionnera pas, dans le meilleur des cas, cela n'interférera pas, mais très probablement, cela va casser des choses.

Deuxièmement, Spirit.Classic ne supporte pas très bien les encodages. Je vous suggère de passer entièrement à la version la plus récente (Spirit.Qi). Cela vous donne l'avantage supplémentaire de travailler avec une base de code activement supportée, et avec quelque chose qui est beaucoup plus rapide que l'ancienne version. À mon humble avis, il est plus facile à utiliser, mais YMMV. Troisièmement, si vous décidez de passer à Spirit.Qi, vous voudrez peut-être utiliser les encodages préexistants. Cela peut être fait en utilisant explicitement, par exemple, iso8859_1 :: char_ ou standard_wide :: char_ au lieu de qi :: char_ par défaut (ce qui équivaut à ascii :: char_). qi :: string a des homologues spécifiques d'encodage similaires. Spirit.Qi a aussi un support préliminaire Unicode, mais ceci n'est pas documenté aussi bien. Regardez l'exemple de l'analyseur de schéma, si cela vous intéresse. Une autre option serait d'écrire votre propre encodage pour Spirit, mais cela nécessite plus d'explications, donc vous feriez probablement mieux d'en discuter sur la liste de diffusion Spirit.