Comments 25
А еще можно построить автомат для этой грамматики.
Какой автомат?
Я просто не очень понял, что вы имеете ввиду… Может вы просто хотели сказать, что данная грамматика автоматная?
Действительно автомат в данном случае будет эффективнее и проще, поскольку рекурсивный нисходящий парсер используется для разбора составных выражений, которые в ini файлах просто не предусмотрены.
Автомат справится с задачей в 1 проход.
Автомат справится с задачей в 1 проход.
Конечные автоматы по определению «справляются» за один проход =)
Я согласен, что автомат тут справится, но, ИМХО, описание грамматикой намного естественнее и проще. К тому же для таких описаний есть готовые инструменты (будь это yacc или parsec).
Я согласен, что автомат тут справится, но, ИМХО, описание грамматикой намного естественнее и проще. К тому же для таких описаний есть готовые инструменты (будь это yacc или parsec).
Описывая грамматику вы задаете автомат, т.к. есть известные алгоритмы построения по классам грамматик детерминированные автоматы. Грамматика это формализм и сама по себе разбор не делает — разбор делает сгенерированный по грамматике автомат.
логика непонятна :) если Вы пишете BNF, то логичней было бы сравнивать lex/yacc с alex/happy. зачем описывать BNF для реализации с помощью комбинаторных парсеров?
хотя сама идея серии подобных статей интересна, да
хотя сама идея серии подобных статей интересна, да
А у вас случаем статьи, посвященной алгоритму пузырьковой сортировки, нет? Всему хабрасообществу было бы очень интересно и познавательно узнать и оценить все тонкости этого процесса.
С формой БНФ сталкивался лет пять назад, но вот это:
ident = identChar, {identChar}.
identChar = letter | digit…
насторожило.
Если не ошибаюсь, идентификатор в данном случае может начинаться с любого знака, а не только с буквы?
ident = identChar, {identChar}.
identChar = letter | digit…
насторожило.
Если не ошибаюсь, идентификатор в данном случае может начинаться с любого знака, а не только с буквы?
Можете посоветовать какой-нибудь материал по грамматикам, для ознакомления?
Есть классическая книжка Введение в теорию автоматов, языков и вычислений (Хопкрофт, Мотвани, Ульман). Дальше, если заинтересуетесь разбором грамматик, почитайте книжку с драконом.
ням :)
еще бы могли дальше развить эту тему — сериализатор ini-файлов
еще бы могли дальше развить эту тему — сериализатор ini-файлов
Сериализация немного другая тема — там важна поддержка параметров разных типов. Если же ограничиться строчными параметрами, то на C++ это бы выглядело так:
На Haskell (правда тут на стандартный вывод, но можно и на файл переделать)
void serialize( std::ostream & os, IniData const & data )
{
for ( IniData::const_iterator it = data.begin(); it != data.end(); ++it )
{
os << '[' << it->first << "]\n";
for ( Entries::const_iterator p = it->second.begin(); p != it->second.end(); ++p )
os << p->first << '=' << p->second << '\n';
}
}
На Haskell (правда тут на стандартный вывод, но можно и на файл переделать)
printIni sl = mapM_ printSection sl
where
printSection (n, el) = putStrLn ( "[" ++ n ++ "]" ) >> mapM_ printEntry el
printEntry (k, v) = putStr k >> putStr "=" >> putStrLn v
Sign up to leave a comment.
Создаём парсер для ini-файлов. Теория