Какой лучший инструмент для создания естественного DSL в Java? - PullRequest
14 голосов
/ 27 сентября 2008

Пару дней назад я прочитал запись в блоге (http://ayende.com/Blog/archive/2008/09/08/Implementing-generic-natural-language-DSL.aspx)), где автор обсуждает идею универсального парсера DSL на естественном языке с использованием .NET.

Самой блестящей частью его идеи, на мой взгляд, является то, что текст анализируется и сопоставляется с классами, используя то же имя, что и предложения.

Взяв в качестве примера следующие строки:

Create user user1 with email test@email.com and password test
Log user1 in
Take user1 to category t-shirts
Make user1 add item Flower T-Shirt to cart
Take user1 to checkout

Преобразуется с использованием коллекции «известных» объектов, которая принимает результат анализа. Некоторые примеры объектов будут (используя Java для моего примера):

public class CreateUser {
    private final String user;
    private String email;
    private String password;

    public CreateUser(String user) {
    this.user = user;
    }

    public void withEmail(String email) {
    this.email = email;
    }

    public String andPassword(String password) {
        this.password = password;
    }
}

Таким образом, при обработке первого предложения класс CreateUser будет соответствовать (очевидно, потому что это конкатенация «создать пользователя»), и, поскольку он принимает параметр в конструкторе, синтаксический анализатор примет «user1» как пользовательский параметр.

После этого синтаксический анализатор определит, что следующая часть «с электронной почтой» также соответствует имени метода, а поскольку этот метод принимает параметр, он будет анализировать «test@email.com» как параметр электронной почты.

Я думаю, вы уже поняли идею, верно? Одним из вполне очевидных применений этого, по крайней мере для меня, было бы позволить тестировщикам приложений создавать «сценарии тестирования» на естественном языке, а затем разбивать предложения на классы, использующие JUnit для проверки поведения приложений.

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

Более того, если кто-то собирается начать проект с открытым исходным кодом для этого, мне определенно будет интересно.

Ответы [ 6 ]

25 голосов
/ 28 сентября 2008

Учитывая сложность лексирования и синтаксического анализа, я не знаю, захочу ли я написать все это вручную. ANTLR не так сложно подобрать, и я думаю, что стоит рассмотреть его на основе вашей проблемы. Если вы используете грамматику разбора для построения и абстрагирования синтаксического дерева от ввода, его довольно легко обработать этот AST с помощью древовидной грамматики. Древовидная грамматика может легко справиться с выполнением описанного вами процесса.

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

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

Удачи!

10 голосов
/ 25 марта 2009

Если вы называете это "естественным языком", вы обманываете себя. Это все еще язык программирования, который пытается имитировать естественный язык - и я подозреваю, что он потерпит неудачу, как только вы попадете в детали реализации. Чтобы сделать это однозначным, вам придется наложить ограничения на синтаксис, который будет вводить пользователей в заблуждение, заставляя их думать, что они пишут на английском языке.

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

Если кто-то слишком глуп или ему не хватает формально строгого мышления, необходимого для программирования, то язык программирования, имитирующий естественный, НЕ волшебным образом превратит его в программиста.

Когда был изобретен COBOL, некоторые люди всерьез полагали, что в течение 10 лет спрос на профессиональных программистов будет нулевым, поскольку COBOL «как английский», и любой, кто нуждается в программном обеспечении, может написать его сам. И мы все знаем, как это работает.

9 голосов
/ 28 сентября 2008

Возможно, вы захотите рассмотреть Xtext , который внутренне использует ANTLR и выполняет некоторые полезные функции, такие как автоматическая генерация редактора для вашего DSL.

4 голосов
/ 28 января 2009

Впервые я услышал о DSL от Jetbrains, создателя идеи IntellJ.

У них есть этот инструмент: MPS (система метапрограммирования)

1 голос
/ 28 сентября 2008

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

http://tech.puredanger.com/2007/01/13/implementing-a-scripting-language-with-antlr-part-1-lexer/

Презентации / статьи Марка Фолькмана по Antlr также весьма полезны:

http://www.ociweb.com/mark/programming/ANTLR3.html

Я поддержу предложение о книге «Окончательный ANTLR», которая также превосходна.

0 голосов
/ 25 марта 2009

"Одним из вполне понятных применений этого, по крайней мере для меня, было бы позволить тестировщикам приложений создавать" сценарии тестирования "на естественном языке, а затем разбивать предложения на классы, использующие JUnit для проверки поведения приложений"

То, о чем вы говорите, звучит так же, как инструмент FitNesse. Точно так же, как вы описываете, клиенты пишут "сценарии" приемочных тестов на каком-то языке, который им понятен, а программисты создают системы, которые делают тесты успешными. Даже реализация, о которой вы говорите, в значительной степени именно так и работает FitNesse - словарь, используемый в сценариях, объединяется для формирования имен функций и т. Д., Так что среда FitNesse знает, какую функцию вызывать.

В любом случае, проверьте это:)

...