Vor ein paar Tagen habe ich einen Blog-Eintrag (http://ayende.com/Blog/archive/2008/09/08/Implementing-generic-natural-language-DSL.aspx) gelesen, wo der Autor die Idee eines generischen natürlichen Sprache DSL-Parser mit .NET diskutieren.Was wäre das beste Werkzeug, um eine natürliche DSL in Java zu erstellen?
Der brillante Teil seiner Idee ist meiner Meinung nach, dass der Text geparst und mit Klassen verglichen wird, die den gleichen Namen wie die Sätze verwenden.
Nehmen wir als Beispiel die folgenden Zeilen:
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
Würde eine Sammlung von „bekannten“ Objekte erhalten umgewandelt verwenden, die das Ergebnis der Analyse nimmt. Einige Beispiel-Objekte wäre (unter Verwendung von Java für mein Beispiel):
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;
}
}
Also, wenn der erste Satz der Verarbeitung würde AngelegtVon Klasse ein Spiel sein (natürlich, weil es eine Verkettung von „create user“) und, da es Nimmt ein Parameter den Konstruktor an, würde der Parser "user1" als Benutzerparameter annehmen.
Danach würde der Parser identifizieren, dass der nächste Teil "mit E-Mail" auch einen Methodennamen entspricht, und da diese Methode einen Parameter benötigt, würde sie "[email protected]" als E-Mail-Parameter analysieren.
Ich denke, Sie haben die Idee, oder? Eine ziemlich klare Anwendung davon wäre, zumindest für mich, den Anwendungstestern zu ermöglichen, "Testskripte" in natürlicher Sprache zu erstellen und dann die Sätze in Klassen zu analysieren, die JUnit verwenden, um nach App-Verhalten zu suchen.
Ich würde gerne Ideen, Tipps und Meinungen zu Tools oder Ressourcen hören, die einen solchen Parser mit Java codieren könnten. Besser noch, wenn wir es vermeiden könnten, komplexe Lexer oder Frameworks wie ANTLR zu benutzen, von denen ich denke, dass sie vielleicht einen Hammer benutzen würden, um eine Fliege zu töten.
Mehr als das, wenn jemand ein Open-Source-Projekt dafür starten möchte, wäre ich definitiv interessiert.
Ähnlich Glurks Antwort, daher als Kommentar: Wenn Sie nach ausführbaren "natürlichen" Sprachspezifikationen suchen, sollten Sie Cucumber (http://cukes.info/) ausprobieren. Zusammen mit JRuby (und RSpec) können Sie es für Java-basierte BDD (http://behaviour-driven.org/) verwenden. Alternativen sind EasyB und JBehave. –
Was ist DSL? ist es Disambiguierung ähnlicher Sprachen? siehe corporavm.uni-koeln.de/vardial/sharedtask.html – alvas