Использование Boost Tokenizer escaped_list_separator с различными параметрами - PullRequest
4 голосов
/ 12 февраля 2009

Здравствуйте, я пытался заставить токенайзер работать, используя класс токенайзера библиотеки повышения. Я нашел этот урок в документации по бусту:

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

проблема в том, что я не могу получить аргумент для экранированного _list _separator ("", "", "");

но если я изменю файл boost / tokenizer.hpp, он будет работать. но это не так, и идеальным решением было задаться вопросом, есть ли что-то, чего мне не хватает, чтобы получить разные аргументы в экранированном _list _separator.

Я хочу разделить его на пробелы с "и" для экранирования и без экранирующего символа внутри строки в кавычках.

используется для системы анализа аргументов в игровой консоли.

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

<p>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&#95;list&#95;separator<char>(separator1,separator2,separator3)> tok(s);
    for(tokenizer<escaped&#95;list_separator<char>(separator1,separator2,separator3)>::iterator beg=tok.begin(); beg!=tok.end();++beg)
    {
    cout << *beg << "\n";
    }
}
ошибка из visual studio 2005 есть ошибка C2974: 'boost :: tokenizer': неверный аргумент шаблона для 'TokenizerFunc', ожидаемый тип

EDIT: Этот вопрос был задуман Феррусио и объяснен всеми Питером Хейлом.

Ответы [ 3 ]

15 голосов
/ 12 февраля 2009

попробуйте это:

#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";
    }
}
4 голосов
/ 12 февраля 2009

Похоже, вы неправильно указали тип своего токенизатора.

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"; }

Вы хотите создать типизированный объект boost::tokenizer< boost::escaped_list_separator< char > > с объектом-разделителем boost::escaped_list_separator< char > в качестве его TokenizerFunc.

0 голосов
/ 24 января 2017

Важным моментом, но не ответом на это, является то, что если пользователь хочет вывести двойную кавычку в результате, следует заменить встроенную цитату (""), описанную в Википедии ( как здесь ) со строкой (\\\"), где \\ означает escape-символ, а \" означает кавычку. Таким образом, кавычка будет отображаться в выходном результате. Следующий фрагмент кода является примером.

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';

Это типичный выход для этого

...