errorrishe: (Default)
errorrishe ([personal profile] errorrishe) wrote2017-01-04 10:30 pm

дурацкие размышления

есть у меня одно чудо инженерной мысли. Чудо бежит на jvm 1.7 ( на самом деле 1.8 но фичи 8ки не допускаются при сборке)
если микро задачка которую уже сделанна в лоб но оно часто попадается на глаза и муляет как говорят в Одессе
нужно реализовать разбор простого выражения
выглядит оно примерно так:

SomeFreakingMagicShit|parameter_1=123|parameter_2=345|optional_parameter=890
Первое слово определят action которое мы хотим совершить, дальше через пайпы идут параметры которые могут быть как обязательные так и опциональные.
У каждого action наборы параметров разные, их довольно таки много

Хочется не упырьский способ получить на выходе объект по которому будет сразу понятно валидное ли выражение ( да, наверно надо что то типа maybe monad только какое то дурацкое) и какой то вменяемый способ описывать имеющиеся actions тоже

Выражения пишут люди руками во внешней пердуле, по этому просто наконструировать их исходно типобезопасно и все заранее проверить в компайл тайме не покататит.

Чешется еще притулить к этому groovy или какой еще другой скриптинг, хз, не было еще времени подумать на тему перегона этого в такую плоскость
Есть сильное ощущение что это можно сделать
- хорошо
- красиво
Но мозги не работают...
xacid: (Default)

[personal profile] xacid 2017-01-04 11:43 am (UTC)(link)
на джаве 1.7 красиво сделать это нужно будет очень постараться ...
а вобще выглядит все так что обычно такие примерно задачи на валидацию множеств и подмножеств параметров делаются с помощью варианта аппликативного функтора который так и называется validation

на скале примеры

http://eed3si9n.com/learning-scalaz/Validation.html
http://eed3si9n.com/herding-cats/Validated.html

для джавы наверное проще всего будет взять чтото типа этого

https://github.com/neoremind/fluent-validator

но тут конечно нада еще смотреть по конкретике и специфике проблемы ...
juan_gandhi: (Default)

[personal profile] juan_gandhi 2017-01-04 12:03 pm (UTC)(link)
Речь о парсинге или о валидации? Интересно, парсеры-комбинаторы в джаве какие-нибудь существуют, или что...
juan_gandhi: (Default)

[personal profile] juan_gandhi 2017-01-06 02:41 pm (UTC)(link)
Ох не знаю. Ну разве что главу в толстой книжке по Скале.
xacid: (Default)

[personal profile] xacid 2017-01-07 12:14 am (UTC)(link)
вабще первоисточник вот

http://www.cs.nott.ac.uk/~pszgmh/monparsing.pdf

но для комбинаторов парсеров в общем случае нужны монады...
в этом собственно все проблемы с ними в случае пролетарской джавы 1.7 :)
xacid: (Default)

[personal profile] xacid 2017-01-08 07:59 pm (UTC)(link)
для джавы 1.8 есть вот это

https://github.com/jon-hanson/parsecj

для 1.7 можно попробовать вот это

http://www.functionaljava.org/javadoc/4.6/functionaljava/fj/parser/package-summary.html
xacid: (Default)

[personal profile] xacid 2017-01-08 08:15 pm (UTC)(link)
для полноты картины :) есть еще хороший пейпер

http://www.staff.science.uu.nl/~dijks106/Papers/pcjava-mpool2001.pdf
"Lazy Functional Parser Combinators in Java"

другие хорошие парсеры

https://github.com/sirthias/parboiled/wiki

http://www.antlr.org

http://www.cs.nyu.edu/rgrimm/xtc/

http://www.romanredz.se/Mouse/index.htm
xacid: (Default)

[personal profile] xacid 2017-01-08 08:47 pm (UTC)(link)
для смеха же покажите этому человеку вот это

http://www.transylvania-jug.org/archives/5777

https://github.com/scireum/parsii
xacid: (Default)

[personal profile] xacid 2017-01-08 08:59 pm (UTC)(link)
так может ему как раз наоборот будет интересно прочитать и даже может понравится :)
xacid: (Default)

[personal profile] xacid 2017-01-08 09:02 pm (UTC)(link)
вобще советую для проекта попробовать парсер parboiled

https://github.com/sirthias/parboiled/wiki

я правда сам использовал только parboiled2 - он только для скалы, но впечатления хорошие ... )