Как игнорировать разделитель, когда он прокомментирован или процитирован

Я пишу парсер для поиска выражений конкатенации строк. У меня есть ряд строк, заключенных в круглые скобки, в основном возникших в результате вызова функции.

Например, ("one"+"two"+"three") -> ("one"|"two"|"three") — это простой случай, и я могу с ним справиться.

Более сложный случай – (null, "one"+"two"+"three", null) -> (null, "one"|"two"|"three", null), но я могу разобрать его с помощью boost::tokenizer.

(null, "one"+"two"+"three,four", 1 /* third parameter can be: 1, 2, 3 */), в таком сложном примере предлагаю парсить с boost::spirit но нужна помощь в написании правил для него.

Позже:

Кажется, escaped_list_separatorиз boost::tokenizer это то, что мне нужно. Но у меня есть одна проблема с ним:

   using namespace std;
   using namespace boost;
   string s = "Field 1,\"putting quotes around fields, allows commas\",Field 3";
   tokenizer<escaped_list_separator<char> > tok(s,escaped_list_separator<char>("", ",", "\""));
   for(tokenizer<escaped_list_separator<char> >::iterator beg=tok.begin(); beg!=tok.end();++beg){
       cout <<"~~~"<< *beg << "\n";
   }

удаляет " для меня. Можно сохранить кавычки в выводе, как это

Field 1
"putting quotes around fields, allows commas"
Field 3

person triclosan    schedule 24.05.2012    source источник


Ответы (1)


По сути, вы можете использовать operator- с совпадениями кодировки:

   rule = '"' >> (char_ - '"') >> '"';

Также посмотрите на operator ~, чтобы инвертировать кодировку.

Если вы заинтересованы в том, чтобы экранировать кавычки внутри кавычек и, возможно, одновременно комментировать стили, я рекомендую взглянуть на мой ответ здесь:

Отображение (частично) заключенных в кавычки ячеек в файлах CSV, включая экранированные кавычки внутри строк.

Другие интересные объекты:

person sehe    schedule 24.05.2012