@haskellru

Страница 107 из 1551
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
оно мне писало что many принимает пустую строку
Верно, поэтому я и отказался от этой функции.

И использовал вместо нее 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
а хотя я не импортил

я заимпортил

но пишет что такого найти не может

Страница 107 из 1551