
Anatolii
26.08.2016
04:32:03
ну по пустой строке можно разбить

Denis
26.08.2016
04:32:31
По строке, начинающейся с #

Anatolii
26.08.2016
04:32:47
# - это коменты
они не обязатеьны

Google

Anatolii
26.08.2016
04:33:02
даже так
не по пустой строке

Denis
26.08.2016
04:33:12
Это начало секции. Дальше парсишь до двух newline

Anatolii
26.08.2016
04:33:12
It's a simple list of key/value pairs, with the dsn, driver_dsn or key keys being used to split successive entries
начало секции dsn или driver_dsn
еще вон key бывает
отдельно стоящий

Denis
26.08.2016
04:34:00
В итоге получишь список списков настроек по секциям.
Ну, может быть, я файл мельком посмотрел.
Интересно, что этот parsec вообще никакой защиты от зацикливания не имеет. Одно неверное движение и комп уходит в глубокий DOS...

Anatolii
26.08.2016
04:36:07
буду сегодня с этим играться

Denis
26.08.2016
04:36:10
Ресет только помогает

Anatolii
26.08.2016
04:36:20
я вчера часто натыкался на ошибку

Google

Anatolii
26.08.2016
04:36:42
оно мне писало что many принимает пустую строку
Exception вылетал

Denis
26.08.2016
04:37:49
И использовал вместо нее manyTill. Она более демократичная и согласна вернуть ""
Ну и вообще старался поменьше обращаться, собственно, к парсеку, а все делал через комбинаторы.
Раз уж ты с ними связался :)

Anatolii
26.08.2016
04:39:58
не очень понял это утверждение:)
Комбинаторы же тоже в parsec

Denis
26.08.2016
04:40:15
Я так понял, это два модуля в одном пакете, потому и часть функций реимплементирована.

Anatolii
26.08.2016
04:40:24
ну да
там пакет Prim - в нем many

Denis
26.08.2016
04:40:34
И они не совсем совместимы...

Anatolii
26.08.2016
04:40:48
а Combinator - в нем manyTill

Denis
26.08.2016
04:41:58
В парсеке есть замечательная функция endOfLine, а в комбинаторах ее нет. Почему-то. Писать свою ох как не хотелось!
Поэтому использовал то, что было у тебя. Тем более, что этим путем все идут, похоже.
Кстати, задачу можно решить без Control.Monad, но код красивее точно не станет. Я теоретически прикинул, сколько придется оберток сделать для типов и забил на этот вариант

Anatolii
26.08.2016
04:44:53
да Control.Monad то не мешает особо

Denis
26.08.2016
04:45:58
Если еще подключить templateHaskell, можно и синтаксис покрасивее сделать :)

Anatolii
26.08.2016
04:46:08
мне пока рановато :)

Denis
26.08.2016
04:46:15
Но это уже из области эстетики

Google

Anatolii
26.08.2016
04:46:16
я do убрал из твоего кода
он отлично выглядит:)

Denis
26.08.2016
04:48:15
Ну и хорошо. Я давно хотел в парсеке разобраться, а то с парсерами только в Эрланге раньше имел дело. Приятная штука :) но замороченная

Anatolii
26.08.2016
04:48:31
ну я думаю на таких маленбких обьемах
типа разбить на линии - она кажется замороченной
но нормальных форматах
будет очень круто выглядеть все
в RWH классно выглядит

Denis
26.08.2016
04:49:51
А ты для плюсов попробуй САМ парсер написать. Проклянешь все на свете, я думаю :)

Anatolii
26.08.2016
04:52:18
Parsec.Extra
на stackege нету судя по всему
:(

Anatolii
26.08.2016
04:52:35
первый раз воспользовался stack solver
приятная штука
parseTDB = parse tdbfile "invalid file format"
tdbfile = manyTill myLine eof
myLine = manyTill anyToken (eol <|> eof)
вот что получилось

Denis
26.08.2016
04:53:20
Без try работает??

Anatolii
26.08.2016
04:53:26
это в RWH плохой eol был
а почему нет?
там же eol нормально сделан внутри

Google

Anatolii
26.08.2016
04:54:00
у нас же try был в eol

Denis
26.08.2016
04:54:02
Так эта книжка, говорят, устарела уже сильнл
А, ну да.

Anatolii
26.08.2016
04:54:14
ну а почем учиться?:)
но да
там беда
половину пример не компилится
я читаю главы
и что-то свое делаю

Denis
26.08.2016
04:54:54
Я вчера на хакадже сидел, штудировал первоисточник.

Admin
ERROR: S client not available

Denis
26.08.2016
04:55:08
Сказывается эрланговское прошлое :)

Anatolii
26.08.2016
04:55:13
сорцы всмысле?

Denis
26.08.2016
04:55:32
Не, до туда не добрался. :)
Только документацию к парсеку

Anatolii
26.08.2016
04:55:58
eol с try красивее выглядит
eol :: GenParser Char state ()
eol = (char '\n' <|> (char '\r' >> option '\n' (char '\n'))) >> return ()
но try вроде не советуют использовать

Denis
26.08.2016
04:56:20
Она, к слову, неплоха, но не хватает ей вводной статьи что ли...

Anatolii
26.08.2016
04:56:23
а какую доку ты читал?
как вводную статью может вот это прочтешь? http://www.cs.uwyo.edu/~jlc/courses/3015/parser_pearl.pdf

Google

Denis
26.08.2016
05:02:16
а какую доку ты читал?
https://hackage.haskell.org/package/parsec-3.1.11/docs/Text-ParserCombinators-Parsec-Combinator.html

Anatolii
26.08.2016
05:02:48
ну тут я тоже сидел
и согласен про вводую статью
мне еще не нравятся варнинг компилятора про то что тип не выведен
я над parseTBD вывел
но зачем мне этим занимать над всем остальным

Denis
26.08.2016
05:07:30
Я, кстати, не смог для остальных функций вывести тип. Эта сволочь меня нехорошими словами обзывать начинала, мол не знает таких типов и вообще, шел бы я куда подальше. Видать, не дорос я еще до дзена :)

Anatolii
26.08.2016
05:10:15
причем я даже скрыл функции, а он все равно ругается
если бы тот тип увидел
я в виме вывел плагином его
тоже не смог руками
--tdbfile :: Text.Parsec.Prim.ParsecT [Char] u Data.Functor.Identity.Identity [[Char]]
tdbfile = myLine manyTill eof
--myLine :: Text.Parsec.Prim.ParsecT [Char] u Data.Functor.Identity.Identity [Char]
myLine = anyToken manyTill (eol <|> eof)
вот
я их закментил
потому что там еще на импортить надо ведро всего
для этих типов

Denis
26.08.2016
05:13:30
Вот, типы эти же я и через ghci :t вывел. А он меня обозвал.

Anatolii
26.08.2016
05:13:58
я через GhcMod ывел
и норм

Denis
26.08.2016
05:14:02
То ли типы другие надо указывать, то ли я чего-то не понимаю

Anatolii
26.08.2016
05:14:16
а хотя я не импортил
я заимпортил
но пишет что такого найти не может