Я пишу парсер для поиска выражений конкатенации строк. У меня есть ряд строк, заключенных в круглые скобки, в основном возникших в результате вызова функции.
Например, ("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