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