Thursday, March 31, 2011

Using Boost Tokenizer escaped_list_separator with different parameters

Hello i been trying to get a tokenizer to work using the boost library tokenizer class. I found this tutorial on the boost documentation:

http://www.boost.org/doc/libs/1 _36 _0/libs/tokenizer/escaped _list _separator.htm

problem is i cant get the argument's to escaped _list _separator("","","");

but if i modify the boost/tokenizer.hpp file it work's. but that's not and ideal solution was wondering if there's anything i am missing to get diferent arguments into the escaped _list _separator.

i want to make it split on spaces with " and ' for escaping and with no escape character inside the quoted string.

this is used for a argument parsing system in a ingame console system.


include <iostream>
include <boost/tokenizer.hpp>
include <string>

int main() { using namespace std; using namespace boost; string s = "exec script1 \"script argument number one\""; string separator1("");//dont let quoted arguments escape themselves string separator2(" ");//split on spaces string separator3("\"\'");//let it have quoted arguments tokenizer<escaped_list_separator<char>(separator1,separator2,separator3)> tok(s); for(tokenizer<escaped_list_separator<char>(separator1,separator2,separator3)>::iterator beg=tok.begin(); beg!=tok.end();++beg) { cout << *beg << "\n"; } }

the error from visual studio 2005 is error C2974: 'boost::tokenizer' : invalid template argument for 'TokenizerFunc', type expected

EDIT: This question was awnsered by ferrucio and explained by peter thank's everybody.

From stackoverflow
  • It seems like you're declaring your tokenizer type incorrectly.

    typedef boost::tokenizer< boost::escaped_list_separator<char> > Tokenizer;
    boost::escaped_list_separator<char> Separator( '\\', ' ', '\"' );
    Tokenizer tok( s, Separator );
    
    for( Tokenizer::iterator iter = tok.begin(); iter != tok.end(); ++iter )
    { cout << *iter << "\n"; }
    

    You want to make a boost::tokenizer< boost::escaped_list_separator< char > > typed object with a boost::escaped_list_separator< char > separator object as its TokenizerFunc.

    Harper Shelby : Those should be single quotes in your constructor - the double quotes are for char*, not char.
  • try this:

    #include <iostream>
    #include <boost/tokenizer.hpp>
    #include <string>
    
    int main()
    {
        using namespace std;
        using namespace boost;
        string s = "exec script1 \"script argument number one\"";
        string separator1("");//dont let quoted arguments escape themselves
        string separator2(" ");//split on spaces
        string separator3("\"\'");//let it have quoted arguments
    
        escaped_list_separator<char> els(separator1,separator2,separator3);
        tokenizer<escaped_list_separator<char>> tok(s, els);
    
        for(tokenizer<escaped_list_separator<char>>::iterator beg=tok.begin(); beg!=tok.end();++beg)
        {
            cout << *beg << "\n";
        }
    }
    
    Annerajb : Thank's this actually worked i knew it was something small :P.

0 comments:

Post a Comment