Anatolii
я вот начал с малого
Anatolii
разбития на строчки:)
Denis
Для этого есть функция lines. Потому и странная задача.
Anatolii
ты вообще спишь?:)
Anatolii
я уже спал а ты ответил:)
Anatolii
я проснулся и ты тут:)
Anatolii
я может еще не понял как этим Parsec пользоваться
Anatolii
но чтобы файлик распарсить, надож е его разбить на строки саначала
Denis
ты вообще спишь?:)
В данный момент сплю, на работе :)
Denis
Я вчера уснуть не смог, пока не решил эту гребаную задачу!
Anatolii
ну круто конечно
Denis
но чтобы файлик распарсить, надож е его разбить на строки саначала
Тут ты не прав. В структуре твоего файлика есть секции, а в секциях встречаются поля с одинаковыми наименованиями. Так что просто разбив на строчки файл ты получишь просто мешанину из данных.
Denis
Лучше пропиши нормальный парсер, который будет парсить сразу секциями
Anatolii
...
Anatolii
да
Anatolii
что-то я не стой стороны пошел
Anatolii
я вчера просто только начал Parsec играться
Denis
Файл неплохо бьется на нужные куски. Синтаксис довольно удобный.
Anatolii
ну по пустой строке можно разбить
Denis
По строке, начинающейся с #
Anatolii
# - это коменты
Anatolii
они не обязатеьны
Anatolii
даже так
Anatolii
не по пустой строке
Denis
Это начало секции. Дальше парсишь до двух newline
Anatolii
It's a simple list of key/value pairs, with the dsn, driver_dsn or key keys being used to split successive entries
Anatolii
начало секции dsn или driver_dsn
Anatolii
еще вон key бывает
Anatolii
отдельно стоящий
Denis
В итоге получишь список списков настроек по секциям.
Denis
Ну, может быть, я файл мельком посмотрел.
Denis
Интересно, что этот parsec вообще никакой защиты от зацикливания не имеет. Одно неверное движение и комп уходит в глубокий DOS...
Anatolii
буду сегодня с этим играться
Denis
Ресет только помогает
Anatolii
я вчера часто натыкался на ошибку
Anatolii
оно мне писало что many принимает пустую строку
Anatolii
Exception вылетал
Denis
оно мне писало что many принимает пустую строку
Верно, поэтому я и отказался от этой функции.
Denis
И использовал вместо нее manyTill. Она более демократичная и согласна вернуть ""
Denis
Ну и вообще старался поменьше обращаться, собственно, к парсеку, а все делал через комбинаторы.
Denis
Раз уж ты с ними связался :)
Anatolii
не очень понял это утверждение:)
Anatolii
Комбинаторы же тоже в parsec
Denis
Я так понял, это два модуля в одном пакете, потому и часть функций реимплементирована.
Anatolii
ну да
Anatolii
там пакет Prim - в нем many
Denis
И они не совсем совместимы...
Anatolii
а Combinator - в нем manyTill
Denis
В парсеке есть замечательная функция endOfLine, а в комбинаторах ее нет. Почему-то. Писать свою ох как не хотелось!
Denis
Поэтому использовал то, что было у тебя. Тем более, что этим путем все идут, похоже.
Denis
Кстати, задачу можно решить без Control.Monad, но код красивее точно не станет. Я теоретически прикинул, сколько придется оберток сделать для типов и забил на этот вариант
Anatolii
да Control.Monad то не мешает особо
Denis
Если еще подключить templateHaskell, можно и синтаксис покрасивее сделать :)
Anatolii
мне пока рановато :)
Denis
Но это уже из области эстетики
Anatolii
я do убрал из твоего кода
Anatolii
он отлично выглядит:)
Denis
Ну и хорошо. Я давно хотел в парсеке разобраться, а то с парсерами только в Эрланге раньше имел дело. Приятная штука :) но замороченная
Anatolii
ну я думаю на таких маленбких обьемах
Anatolii
типа разбить на линии - она кажется замороченной
Anatolii
но нормальных форматах
Anatolii
будет очень круто выглядеть все
Anatolii
в RWH классно выглядит
Denis
А ты для плюсов попробуй САМ парсер написать. Проклянешь все на свете, я думаю :)
Anatolii
Parsec.Extra
Anatolii
на stackege нету судя по всему
Anatolii
:(
Anatolii
первый раз воспользовался stack solver
Anatolii
приятная штука
Anatolii
parseTDB = parse tdbfile "invalid file format" tdbfile = manyTill myLine eof myLine = manyTill anyToken (eol <|> eof)
Anatolii
вот что получилось
Denis
Без try работает??
Anatolii
это в RWH плохой eol был
Anatolii
а почему нет?
Anatolii
там же eol нормально сделан внутри
Anatolii
у нас же try был в eol
Denis
Так эта книжка, говорят, устарела уже сильнл
Denis
А, ну да.
Anatolii
ну а почем учиться?:)
Anatolii
но да