Как стать автором
Обновить

Комментарии 17

Монументальная статья! Спасибо, как раз недавно общался насчет парсеров в других языках. Вы не проводили какого-нибудь сравнения самостоятельно? (да, я вижу, что это перевод).

НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь

Я было начал сообщать о кривых конструкциях в переводе, но быстро понял, что так придется переписать всю статью. Так что лучше ее все же написать заново — читается ну очень тяжело. Есть и полностью неверный перевод ("Наконец, атрибуты разбора" — серьезно?).


По делу — то, что здесь описано, называется PEG и такие парсеры писать руками на самом языке комбинированием функций — самоубийство. Как обучающая статья очень хорошо (только перевести нормально), но для дела лучше возьмите rust-peg (кстати, корни явно растут из pegjs).

Что вы посоветуете первым посмотреть, если выбор между nom и rust-peg?

Я только с pegjs работал, когда заинтересовался Rust-ом, решил посмотреть, есть ли там что-то подобное и стоит ли попробовать написать цель генерации на Rust для pegjs. А там оказывается уже есть точь-в-точь такая же библиотека, причем по некоторому коду у меня сильные подозрения, что это порт pegjs, хотя нигде я этой информации в ее readme не видел.


Посмотрел nom — если важна понятность парсера, то однозначно лучше использовать rust-peg. Как я говорил выше, ручное комбинирование функций никогда не будет таким понятным, как специализированный DSL. А благодаря макросам Rust он очень органично вплетается в процесс сборки приложения. Но если важны какие-то другие критерии, то тут только сравнить или поискать обзоры.


Если для обучения — то однозначно лучше rust-peg.

Тогда уж pest. Он значительно популярнее.

Мда, красиво, конечно, и сложно. А потом подумалось, насколько же проще написать ad-hoc парсер. И поддерживать его, наверное, будет куда легче.

Clone пришлось затащить в Parser и добавить как доп. зависимость для типов F — тогда one_or_more через zero_or_more сработал.

>>Представляю вашему вниманию перевод статьи «Learning Parser Combinators With Rust».
сорри за off-topic — как же всё-таки приятно видеть информацию о том, что это перевод, и ссылку на оригинал в первой строчке статьи.

Статья из песочницы — а там ставить "перевод" нельзя по какой-то странной причине.

Но ведь в таком случае информация о переводе будет в конце статьи, а не в шапке.

И когда статью переводят переводчики, а не профильные специалисты — после нескольких абзацев бывает очень грустно читать, и до ссылки на оригинал, где всё правильно — уже можно и недолистать;)

По идее, у перевода ссылка на оригинал должна быть в самом начале просто как элемент интерфейса, не как часть статьи.

Спасибо, хорошая статья. Как раз на неделе пришлось столкнуться с чем-то подобным. Реализовал на конечных автоматах, теперь думаю переписать — этот подход более понятный.
Единственное — а почему всё в функциональном стиле? Возможно, это было бы оправдано для универсальной библиотеки для парсинга, но в обучающих целях, на конкретном языке — императивный стиль был бы проще.
В императивном стиле композиция несколько болезненна.
Объясните?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории