Пару дней назад я прочитал запись в блоге (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, которые, я думаю, возможно, использовали бы молот, чтобы убить муху.
Более того, если кто-то собирается начать проект с открытым исходным кодом для этого, мне определенно будет интересно.