Существует ли эквивалент генераторов синтаксического анализа scala только для Java?

#java #scala #parsing #text-parsing

#java #scala #синтаксический анализ #синтаксический анализ текста

Вопрос:

Scala имеет удивительно простой способ создания синтаксических анализаторов. Есть ли достаточно эквивалентный способ сделать то же самое в мире только для Java, который не требует недели обучения?

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

1. Без перегрузки оператора и имплицитов? Возможно, но это, вероятно, будет намного, намного более некрасиво в использовании.

2. Да, я так не думал. В прошлый раз, когда я смотрел на antlr, это был зверь. Стало ли лучше? Какую самую простую библиотеку я мог бы использовать для DSL, которая на самом деле не такая сложная — аналогичная Markdown по сложности.

3. Подождите, вы спрашиваете о синтаксическом анализе в целом (включая «внешние» генераторы синтаксического анализа) или о «встроенных» комбинаторах синтаксического анализа? Я предположил последнее. Но если вы используете генератор синтаксического анализа с собственным DSL, нет причин, по которым он не должен быть красивым и легким.

4. ну, и то, и другое. Мне нравится, как scala это делает — нотация bnf потрясающая. Но если в Java такого нет, я возьму самую простую вещь для работы, с которой я могу получить.

5. Я забыл его название на самом деле… прошло некоторое время с тех пор, как я им пользовался. Раньше я использовал библиотеку нотаций BNF от scala. Это комбинатор? Я не помню (извините, прошло много месяцев). Я бы использовал его снова, но я не могу использовать scala для этого:(

Ответ №1:

Я не уверен насчет кривой лернинга, но в мире Java ANTLR Parser Generator очень хорошо зарекомендовал себя и считается одним из лучших.

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

1. Я пошел с ANTLR. Я не думаю, что ANTLR так же хорош, как комбинаторы синтаксического анализа scala. Мне пришлось оказать ему гораздо большую помощь в синтаксическом анализе с использованием лексических логических членов. Грамматика scala не нуждалась ни в чем из этого. Я думаю, что ANTLR нуждается в дополнительной помощи от автора dsl для выполнения работы, которую, я думаю, он может выполнить самостоятельно. В любом случае, мне удалось заставить его работать, хотя я думаю, что версия scala была бы короче и менее сложной в целом. И генерации кода также не было бы. Тем не менее, это послужило своей цели.

Ответ №2:

Насколько надежным и настраиваемым должен быть анализатор? Если грамматика довольно проста и стабильна, вы могли бы просто использовать анализатор рекурсивного спуска, который использует методы, представляющие каждое правило создания грамматики. Я думаю, что результат будет примерно таким, какой выдал бы JavaCC, поскольку они оба работают сверху вниз.

http://en.wikipedia.org/wiki/Recursive_descent_parser

Надеюсь, это может быть полезно.

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

1. разве это не то, что генерирует ANTLR?

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

Ответ №3:

В издательстве Manning Publications есть книга «DSL в действии«, которая вначале охватывает Java.

Но, возможно, вы захотите рассмотреть возможность использования Groovy для написания вашего DSL, поскольку в динамическом языке есть много возможностей, и у него будет более короткая кривая обучения, чем у Scala.

Для введения вы можете начать сhttp://docs.codehaus.org/display/GROOVY/Writing Domain-Specific Languages .

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

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

1. Я был бы удивлен, если scala запрещена, но groovy приемлем. Кажется, его не беспокоит сложность scaala; он говорит, что ему это нравится, но просто не может использовать его по какой-то неустановленной причине.

2. @Kevin — Для меня «недельная кривая обучения» подразумевает, что сложность может быть проблемой. Groovy имеет гораздо более короткую кривую обучения.

3. В комментариях он говорит, что не может использовать scala, а antlr — зверь. Итак, я воспринял его утверждение как означающее «что-то более простое, чем antlr» на чистой Java, надеюсь, такое же простое, как внешние DSL scala.

4. Да, я не нахожу scala сложным. На самом деле, я уже писал синтаксический анализатор на scala раньше, и это было настолько просто, насколько я мог себе представить. Я не нахожу scala как язык настолько сложным — это проще, чем многие другие вещи, но я думаю, что то, как думает ваш разум, сделает некоторые вещи проще, а другие сложнее. Люди поднимают больше шума по этому поводу, чем следовало бы. Библиотека синтаксического анализа была вполне естественной, честно говоря. Через несколько часов у меня было что-то пригодное для использования, и мне действительно понравился тот факт, что все это было сделано в scala без каких-либо внешних инструментов и файлов. Полиглот может идти к черту.

5. @egervari — Возможно, книга окажется полезной.