metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2010-01-09 10:27 pm
Entry tags:

Комбинаторы парсеров на LINQ

Таки дорвался использовать Monadic Parser Combinators. Достаточно удобно, можно думать категориями Parsec-а, но ошибки компилятора или стеки вызовов при рунтайм-ошибках выглядят ужасающе.
Кстати, по моему, там TValue[] в Rep и Rep1 надо на IEnumerable заменить

Пришлось таки сделать иммутабельный список (как обычный хаскелевый) для входных токенов, а то по ссылке автор там хитро обошел - каждый раз при получении символа из строки создает новую подстроку-хвост. Как-то нехорошо это выглядит. А с обычными мутабельными итераторами дотнета это вообще работать по определению не будет.

Теперь думаю, куда бы это контекст со списком парсеров(которые изменяются по ходу разбора) засунуть. Тут подсказали стрелки, но как оные стрелки впихнуть в дотнет и LINQ это отдельный вопрос. Наверно, имеет смысл список парсеров (вернее map идентификатор -> парсер) поселить вместе со входным списком токенов и наколбасить хитрых парсеров, которые кроме того, что потребляют токены, еще и меняют список.

Ну и еще совсем непонятно, как это все будет работать в отсутствие ленивости и оптимизации хвостовых вызовов.

[identity profile] j-sheridan.livejournal.com 2010-01-09 11:13 pm (UTC)(link)
А ты Лепестки Розы (http://gusew.livejournal.com/106191.html) разгадал? :)

[identity profile] metaclass.livejournal.com 2010-01-09 11:34 pm (UTC)(link)
Тяжкий ад.

[identity profile] lionet.livejournal.com 2010-01-09 11:47 pm (UTC)(link)
Ну и еще совсем непонятно, как это все будет работать в отсутствие ленивости и оптимизации хвостовых вызовов.

Монадический парсинг в хаскеле обладает теми же проблемами: непонятно, как избегать тонны стружек при парсинге.

Парсинг на стрелках же прекрасен в этом отношении.

[identity profile] j-sheridan.livejournal.com 2010-01-09 11:55 pm (UTC)(link)
Там все просто :) Я гдето за полчаса (http://j-sheridan.livejournal.com/151331.html) разгадал :)

[identity profile] guamoka.livejournal.com 2010-01-10 01:18 am (UTC)(link)
Ну деццкий сад же ведь:-) Как чувствовал.


Roll #10.

"...The name of the game is Petals Around the Rose?"

"Right, and the name is significant."

[identity profile] demon-gloom.livejournal.com 2010-01-10 07:52 am (UTC)(link)
Была задачка где показывалось число и спрашивалось 863458 = 5 и типа эту задачку любой первокласник решал, т.е. мог обьяснить почему. Решение было в колечках. 8 - 2 колечка, 6 - 1 и т.д. В лепестках тот же принцип.

[identity profile] metaclass.livejournal.com 2010-01-10 09:28 am (UTC)(link)
Ага, разгадал. Что-то с утра как-то быстро понятно стало.

[identity profile] guamoka.livejournal.com 2010-01-10 10:56 am (UTC)(link)
Угу. Меня порадовал нестандартный подход Б. Гейтса- просто запомнить комбинации. Я бы лично Билла проверил (на всякий случай): добавил бы еще пять костяшек и посмотрел, что он скажет;-)

[identity profile] guamoka.livejournal.com 2010-01-10 10:57 am (UTC)(link)
точно. вот она у меня все время в голове вертелась, но вспомнить, как, что и где я не мог.

[identity profile] permea-kra.livejournal.com 2010-01-10 11:07 am (UTC)(link)
Можно ткнуть пальцем в статью про парсинг на стрелках?

[identity profile] permea-kra.livejournal.com 2010-01-10 11:12 am (UTC)(link)
>>Пришлось таки сделать иммутабельный список (как обычный хаскелевый) для входных токенов ... Как-то нехорошо это выглядит.

Эээ. А в чём проблема сделать константный массив а обертку с кастомными head && tail, если противно видеть списки ?

[identity profile] metaclass.livejournal.com 2010-01-10 11:15 am (UTC)(link)
Не, там нехорошо именно что создание новой строки на каждое чтение символа. Списки нормально.
А массив и обертку сделать можно было, но мне было лень.

[identity profile] permea-kra.livejournal.com 2010-01-10 11:16 am (UTC)(link)
Это тяжкое наследие хаскеля .

[identity profile] lionet.livejournal.com 2010-01-10 11:25 am (UTC)(link)
google: Swierstra & Duponcheel

also, check http://en.wikibooks.org/wiki/Haskell/Understanding_arrows

[identity profile] permea-kra.livejournal.com 2010-01-10 11:26 am (UTC)(link)
thanks a lot.

[identity profile] metaclass.livejournal.com 2010-01-10 11:38 am (UTC)(link)
По ссылкам вчера добрался до статьи про нотацию для стрелок: http://www.soi.city.ac.uk/~ross/papers/notation.html

Короче, с 17 страниц меня сморил сон с кошмарами про парсеры, стрелки и дотнет, а сегодня я продолжил читать дальше, дошел до нотации c -> -< и понял, что если я чего-нибудь такое привнесу в продакшен, это будет плач, скрежет зубовный и вакансии для хаскелистов, когда я в дурку таки слягу :)

[identity profile] metaclass.livejournal.com 2010-01-10 11:50 am (UTC)(link)
Кстати, это очень полезный подход для некоторых задач, где вывести аналитическую зависимость вообще непонятно как. Вместо этого делается база знаний покрывающая большую часть входного домена, с обращением к гуру-экспертам в неясных случаях.

[identity profile] lionet.livejournal.com 2010-01-10 11:52 am (UTC)(link)
Это дерьмовая статья такая. Не унывай. Забей лучше.

[identity profile] metaclass.livejournal.com 2010-01-10 11:56 am (UTC)(link)
Не, статья вроде нормальная, т.е. все понятно.
Но мысль "объяснить стрелки свежепринятому на работу студенту" у меня вызывает приступы необъяснимого злорадства.
Очень хочется посмотреть на лицо руководства, когда оно поймет, что из-за экономии на закупку пару десятков обезъянокодеров оно оказалось с проектом, на который придется выписывать гуру из академической среды и мирится с тем, что у него в головах зловещие мертвецы и змеи :)

[identity profile] guamoka.livejournal.com 2010-01-10 12:10 pm (UTC)(link)
Ну, вообще говоря да. К решению можно прийти, определив статистически корреляцию между ответами и выпадающими костями. Думаю, тоже легко покажет, куда надо смотреть.