Question

Il y a quelques jours, j'ai lu une entrée de blog ( http://ayende.com/Blog/archive/2008/09/08/Implementing-generic-natural-language-DSL.aspx ) où l'auteur discute de l'idée d'un produit naturel générique analyseur DSL de langue utilisant .NET.

La partie brillante de son idée, à mon avis, est que le texte est analysé et comparé à des classes utilisant le même nom que les phrases.

En prenant pour exemple les lignes suivantes:

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

serait converti à l'aide d'une collection de " connus " objets, qui prend le résultat de l'analyse. Voici quelques exemples d’objets (en utilisant Java pour mon exemple):

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;
    }
}

Ainsi, lors du traitement de la première phrase, la classe CreateUser serait une correspondance (bien évidemment, il s'agit d'une concaténation de "create user") et, comme il faut un paramètre sur le constructeur, l'analyseur prendrait "user1". comme étant le paramètre utilisateur.

Après cela, l’analyseur identifierait la partie suivante, "avec email". correspond également à un nom de méthode, et puisque cette méthode utilise un paramètre, elle analysera " test@email.com" comme étant le paramètre email.

Je pense que vous avez déjà eu l'idée, non? Une application assez claire de cela, du moins pour moi, serait de permettre aux testeurs d’applications de créer des "scripts de test". en langage naturel, puis analysez les phrases en classes utilisant JUnit pour vérifier le comportement des applications.

J'aimerais entendre des idées, des conseils et des opinions sur des outils ou des ressources qui pourraient coder un tel analyseur syntaxique à l'aide de Java. Mieux encore si nous pouvions éviter d’utiliser des lexers complexes, ou des frameworks comme ANTLR, qui, je pense, utiliseraient un marteau pour tuer une mouche.

Plus que cela, si quelqu'un est prêt à démarrer un projet open source pour cela, je serais certainement intéressé.

Était-ce utile?

La solution

Compte tenu de la complexité du lexing et de l'analyse syntaxique, je ne sais pas si je souhaiterais coder tout cela à la main. ANTLR n'est pas si difficile à trouver et je pense que cela vaut la peine de regarder en fonction de votre problème. Si vous utilisez une grammaire d'analyse pour créer un arbre de syntaxe abstrait à partir de l'entrée, il est assez facile de traiter ensuite cet AST avec une grammaire arborescente. La grammaire arborescente peut facilement gérer l’exécution du processus que vous avez décrit.

Vous trouverez ANTLR dans de nombreux endroits, notamment Eclipse, Groovy et Grails. La référence définitive ANTLR rend même assez simple la mise à jour rapide. assez rapidement.

J'ai eu un projet qui devait traiter du texte de requête généré par les utilisateurs plus tôt cette année. J'ai commencé à le traiter manuellement, mais cela est vite devenu écrasant. J'ai mis quelques jours à passer à la vitesse supérieure sur ANTLR et une version initiale de ma grammaire et de mon processeur a été utilisée dans quelques jours. Des modifications et des ajustements ultérieurs des exigences auraient tué toute version personnalisée, mais nécessiteraient relativement peu d’efforts pour s’adapter une fois que les grammaires ANTLR seraient opérationnelles.

Bonne chance!

Autres conseils

Si vous appelez cela le "langage naturel", vous vous leurrez. C'est toujours un langage de programmation, juste un qui essaye d'imiter le langage naturel - et je suppose que cela échouera une fois que vous aurez abordé les détails de la mise en œuvre. Afin de rendre les choses sans ambiguïté, vous devrez imposer des restrictions sur la syntaxe qui dérouteront les utilisateurs qui ont été amenés à penser qu'ils écrivaient en "anglais".

L’avantage d’un DSL est (ou devrait être, en tout cas) est qu’il est simple et clair, mais puissant en ce qui concerne le domaine du problème. Imiter une langue naturelle est une préoccupation secondaire et peut en fait aller à l'encontre de ces objectifs principaux.

Si quelqu'un est trop stupide ou n'a pas la capacité de penser de manière formellement rigoureuse, ce qui est nécessaire pour la programmation, alors un langage de programmation qui imite un langage naturel ne le transformera PAS comme par magie en programmeur.

Lors de l’invention de COBOL, certaines personnes pensaient sérieusement qu’il n’y aurait plus de demande de programmeurs professionnels dans 10 ans, car COBOL était «semblable à l’anglais», et quiconque ayant besoin d’un logiciel pouvait l’écrire lui-même. Et nous savons tous comment cela a fonctionné.

Vous voudrez peut-être envisager de Xtext , qui utilise en interne ANTLR et effectue des tâches intéressantes, telles que la génération automatique. un éditeur pour votre DSL.

La première fois que j'ai entendu parler de DSL venait de Jetbrains, le créateur d’IntellJ Idea.

Ils ont cet outil: MPS (système de méta-programmation)

Vous trouverez peut-être que cette série de blogs en plusieurs parties que j'ai créée avec Antlr est utile comme point de départ. Il utilise Antlr 2, donc certaines choses seront différentes pour Antlr 3:

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

Les présentations / articles de Mark Volkman sur Antlr sont également très utiles:

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

J'appuie également la suggestion concernant le livre Definitive ANTLR, qui est également excellente.

"Une application très claire de cela, du moins pour moi, serait de permettre aux testeurs d'applications de créer des" scripts de test "" en langage naturel, puis analysez les phrases en classes utilisant JUnit pour rechercher les comportements d'application "

".

Ce dont vous parlez ici ressemble exactement à l'outil FitNesse. Exactement comme vous le décrivez, les clients écrivent des tests d'acceptation et des "scripts". dans un langage qui leur semble logique, et les programmeurs construisent des systèmes qui permettent aux tests de réussir. Même l’implémentation dont vous parlez est à peu près exactement le fonctionnement de FitNesse: le vocabulaire utilisé dans les scripts est concaténé pour former des noms de fonctions, etc., de sorte que le cadre FitNesse sache quelle fonction appeler.

Quoi qu'il en soit, jetez un œil dessus:)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top