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.
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";
}
}
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.
A relevant point yet not the answer for this is that if user want to output a double quote in the result, the embedded quote ("") described in the Wikipedia (like here) should be replaced with a string of (\\\")
, where \\
means a escape char and \"
means the quote mark. In this way, the quote mark will be displayed in the output result.
The following code snippet is an example.
typedef boost::escaped_list_separator<char> std_token;
typedef boost::tokenizer<boost::escaped_list_separator<char>> tokenizer;
std_token a_token( "\\", ",", "\"" );
std::string s = "\"Boost,\\\" C++ Libraries\" ";
tokenizer tok{ s, a_token };
for ( const auto &t : tok )
std::cout << t << '\n';
来源:https://stackoverflow.com/questions/541561/using-boost-tokenizer-escaped-list-separator-with-different-parameters