Пару дней назад я прочитал запись в блоге (http://ayende.com/Blog/archive/2008/09/08/Implementing-generic-natural-language-DSL.aspx), где автор обсуждает идею общего парсера DSL на естественном языке с использованием .NET.Какой лучший инструмент для создания естественного DSL в Java?
Блестящая часть его идеи, на мой взгляд, состоит в том, что текст анализируется и сопоставляется с классами, использующими то же имя, что и предложения.
Взяв в качестве примера, следующие строки:
Create user user1 with email [email protected] 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» как пользовательский параметр.
После этого анализатор определит, что следующая часть «с адресом электронной почты» также соответствует имени метода, и поскольку этот метод принимает параметр, он будет анализировать «[email protected]» как параметр электронной почты.
Я думаю, вы поняли эту идею, верно? Одно из ясных приложений, по крайней мере для меня, было бы позволить тестерам приложений создавать «тестовые сценарии» на естественном языке, а затем анализировать предложения в классах, которые используют JUnit для проверки поведения приложений.
Я хотел бы услышать идеи, советы и мнения по инструментам или ресурсам, которые могли бы кодировать такой парсер с помощью Java. Еще лучше, если бы мы могли избежать использования сложных лексеров или фреймворков, таких как ANTLR, которые, я думаю, могли бы использовать молот, чтобы убить муху.
Более того, если кто-то начнет проект с открытым исходным кодом для этого, мне определенно будет интересно.
Похож на ответ Глерка, поэтому в качестве комментария: Если вы ищете исполняемые «естественные» спецификации языка, вы должны дать Cucumber (http://cukes.info/) попытку. Вместе с JRuby (и RSpec) вы можете использовать его для Java-based BDD (http://behaviour-driven.org/). Альтернативы включают EasyB и JBehave. – 2009-03-25 11:00:39
Что такое DSL? это неоднозначность подобных языков? см. corporavm.uni-koeln.de/vardial/sharedtask.html – alvas 2014-03-23 20:52:26