Domanda

Un paio di giorni fa, ho letto un post sul blog ( http://ayende.com/Blog/archive/2008/09/08/Implementing-generic-natural-language-DSL.aspx ) dove l'autore discute l'idea di un generico naturale parser DSL in lingua usando .NET.

La parte geniale della sua idea, secondo me, è che il testo viene analizzato e confrontato con le classi usando lo stesso nome delle frasi.

Prendendo come esempio, le seguenti righe:

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

Verrà convertito utilizzando una raccolta di "quotata" " oggetti, che prende il risultato dell'analisi. Alcuni oggetti di esempio sarebbero (usando Java per il mio esempio):

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

Quindi, durante l'elaborazione della prima frase, la classe CreateUser sarebbe una corrispondenza (ovviamente perché si tratta di una concatenazione di "crea utente") e, dato che accetta un parametro sul costruttore, il parser prenderebbe "utente1". come parametro utente.

Successivamente, il parser identificherebbe che la parte successiva, "con email" corrisponde anche al nome di un metodo e poiché tale metodo accetta un parametro, analizzerebbe " test@email.com" come parametro di posta elettronica.

Penso che tu abbia avuto l'idea ormai, giusto? Un'applicazione abbastanza chiara di ciò, almeno per me, sarebbe quella di consentire ai tester delle applicazioni di creare "script di test". in linguaggio naturale e quindi analizzare le frasi in classi che utilizzano JUnit per verificare i comportamenti delle app.

Mi piacerebbe sentire idee, suggerimenti e opinioni su strumenti o risorse che potrebbero codificare tale parser usando Java. Meglio ancora se potessimo evitare l'uso di lexer complessi o framework come ANTLR, che penso che forse userebbero un martello per uccidere una mosca.

Oltre a ciò, se qualcuno fosse pronto ad avviare un progetto open source per questo, sarei sicuramente interessato.

È stato utile?

Soluzione

Considerando la complessità del lexing e dell'analisi, non so se vorrei codificare tutto a mano. ANTLR non è così difficile da raccogliere e penso che valga la pena esaminarlo in base al tuo problema. Se usi una grammatica di analisi per costruire e sottrarre l'albero di sintassi dall'input, è abbastanza facile elaborare quell'AST con una grammatica ad albero. La grammatica dell'albero potrebbe facilmente gestire l'esecuzione del processo che hai descritto.

Troverai ANTLR in molti posti, tra cui Eclipse, Groovy e Grails per cominciare. Il riferimento ANTLR definitivo rende anche abbastanza semplice aggiornarsi sulla base abbastanza rapidamente.

Avevo un progetto che doveva gestire alcuni testi di query generati dagli utenti all'inizio di quest'anno. Ho iniziato un percorso per elaborarlo manualmente, ma è diventato rapidamente travolgente. Ho impiegato un paio di giorni per aumentare la velocità su ANTLR e ho avuto una versione iniziale della mia grammatica e processore in esecuzione in pochi giorni. Le successive modifiche e regolazioni ai requisiti avrebbero ucciso qualsiasi versione personalizzata, ma avrebbero richiesto uno sforzo relativamente piccolo per adattarsi una volta che avessi messo in funzione le grammatiche ANTLR.

Buona fortuna!

Altri suggerimenti

Se lo chiami "linguaggio naturale", stai illudendo te stesso. È ancora un linguaggio di programmazione, solo uno che cerca di imitare il linguaggio naturale - e sospetto che fallirà una volta entrati nei dettagli dell'implementazione. Per renderlo inequivocabile, dovrai mettere delle restrizioni sulla sintassi che confonderà gli utenti che sono stati indotti a pensare che stiano scrivendo "inglese".

Il vantaggio di una DSL è (o dovrebbe essere, in ogni caso) è che è semplice e chiaro, ma potente per quanto riguarda il dominio problematico. Imitare un linguaggio naturale è una preoccupazione secondaria e può in effetti essere controproducente per questi obiettivi primari.

Se qualcuno è troppo stupido o non ha la capacità di pensare formalmente rigoroso che è necessario per la programmazione, allora un linguaggio di programmazione che imita uno naturale NON li trasformerà magicamente in un programmatore.

Quando fu inventata la COBOL, alcune persone credevano seriamente che entro 10 anni non ci sarebbe stata la domanda zero per i programmatori professionisti, poiché COBOL era "come l'inglese" e chiunque avesse bisogno di software poteva scriverlo da solo. E sappiamo tutti come sta andando.

Potresti prendere in considerazione Xtext , che utilizza internamente ANTLR e fa cose carine come la generazione automatica un editor per il tuo DSL.

La prima volta che ho sentito parlare di DSL è stato da Jetbrains, il creatore di IntellJ Idea.

Hanno questo strumento: MPS (Meta Programming System)

Potresti trovare utile questa serie di blog in più parti che ho fatto usando Antlr come punto di partenza. Usa Antlr 2, quindi alcune cose saranno diverse per Antlr 3:

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

Anche le presentazioni / articoli di Mark Volkman su Antlr sono abbastanza utili:

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

Seguirò il suggerimento sul libro ANTLR definitivo, che è anche eccellente.

"Un'applicazione abbastanza chiara di ciò, almeno per me, sarebbe quella di consentire ai tester delle applicazioni di creare" script di test ". in linguaggio naturale e quindi analizzare le frasi in classi che utilizzano JUnit per verificare i comportamenti delle app "

Quello di cui stai parlando qui suona esattamente come lo strumento, FitNesse. Esattamente come descrivi, i clienti scrivono test di accettazione "script" in una sorta di linguaggio che ha senso makese per loro, e i programmatori costruiscono sistemi che fanno passare i test. Anche l'implementazione di cui parli è praticamente esattamente come FitNesse funziona - il vocabolario usato negli script è concatenato per formare nomi di funzioni ecc., Così che il framework FitNesse sappia quale funzione chiamare.

Comunque, dai un'occhiata :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top