Здравствуйте, Keith, Вы писали:
1.23e45 — это 3 поля или одно научное число ?
А вообще —
boost/spirit
Парсер для списка полей ("field, [long name], [еще поле]") выглядит примерно так:
bool columnlist::parse_list( const string& str )
{
using namespace boost::spirit;
rule<> list, field, identificator, long_identificator;
list = field
>> *(space_p)
>> *(',' >> *(space_p) >> field)
>> *(space_p);
field = identificator[ append( m_list ) ]
| ('[' >> *(space_p) >> long_identificator[ append( m_list ) ] >> *(space_p) >> ']');
identificator = alpha_p >> *(alnum_p);
long_identificator = alpha_p >> *(alnum_p | space_p);
return parse( str.c_str(), list ).full;
}
Интересны варианты распознавания строк на отдельные части. Т.е.
1. читаем из cin.
2. распознаем прочитанное.
3. заполняем структуру имеющую различные типы.
Интересует 2-ой пункт. Т.е. я получаю что-то вроде "abc123.13ggde435.345" и должен это епревести в
"abc" — строка
"12" — целое, длиной два символа
"3.13" — float
и т.д. Т.е. всего(на сколько я понимаю) ограничений может быть только два:
а) на тип;
б) на длинну;
Интересуют самые красивые\быстрые варианты, и вообще все идеи по этому поводу.
Конечный автомат. На нем основываются сканнеры в компиляторах.
Здравствуйте, Keith, Вы писали:
K> Интересны варианты распознавания строк на отдельные части. Т.е.
K>1. читаем из cin.
K>2. распознаем прочитанное.
K>3. заполняем структуру имеющую различные типы.
K>Интересует 2-ой пункт. Т.е. я получаю что-то вроде "abc123.13ggde435.345" и должен это епревести в
K>"abc" — строка
K>"12" — целое, длиной два символа
K>"3.13" — float
K> и т.д. Т.е. всего(на сколько я понимаю) ограничений может быть только два:
K>а) на тип;
K>б) на длинну;
K> Интересуют самые красивые\быстрые варианты, и вообще все идеи по этому поводу.