Anatolii
я вот начал с малого
Anatolii
разбития на строчки:)
Denis
Для этого есть функция lines. Потому и странная задача.
Anatolii
ты вообще спишь?:)
Anatolii
я уже спал а ты ответил:)
Anatolii
я проснулся и ты тут:)
Anatolii
я может еще не понял как этим Parsec пользоваться
Anatolii
но чтобы файлик распарсить, надож е его разбить на строки саначала
Denis
Я вчера уснуть не смог, пока не решил эту гребаную задачу!
Anatolii
ну круто конечно
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
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
но да