Pergunta

Um par de dias atrás, li um post no blog ( http://ayende.com/Blog/archive/2008/09/08/Implementing-generic-natural-language-DSL.aspx ) onde o autor discutir a idéia de uma catástrofe natural genérico linguagem analisador DSL usando .NET.

A parte brilhante de sua idéia, na minha opinião, é que o texto é analisado e comparado com as classes usando o mesmo nome que as sentenças.

tomando como exemplo, as seguintes linhas:

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

iria ficar convertido utilizando uma coleção de objetos "conhecidos", que leva o resultado da análise. Alguns exemplos de objetos seria (usando Java para o meu exemplo):

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

Assim, quando o processamento da primeira frase, classe CreateUser seria um jogo (obviamente, porque é uma concatenação de "criar usuário") e, uma vez que leva um parâmetro no construtor, o analisador levaria "user1" como sendo o parâmetro do usuário.

Depois disso, o analisador seria identificar que a próxima parte, "com e-mail" também coincide com um nome de método, e desde que esse método tem um parâmetro, ele iria analisar "test@email.com" como sendo o parâmetro de e-mail.

Eu acho que essa é a idéia por agora, certo? Uma aplicação bastante clara de que, pelo menos para mim, seria permitir que os testadores aplicação criar "testando scripts" em linguagem natural e, em seguida, analisar as sentenças em classes que usos JUnit para verificar se os comportamentos de aplicativos.

Eu gostaria de ouvir idéias, dicas e opiniões sobre ferramentas ou recursos que poderiam código tal analisador usando Java. Melhor ainda se pudéssemos evitar o uso lexers complexos ou frameworks como ANTLR, que eu acho que talvez seria usar um martelo para matar uma mosca.

Mais do que isso, se alguém está para iniciar um projeto open source para isso, eu com certeza gostaria de estar interessado.

Foi útil?

Solução

Considerando a complexidade do léxico e análise, eu não sei se eu gostaria de código tudo o que a mão. ANTLR não que é difícil de captador e eu acho que é worthing olhando para com base no seu problema. Se você usar uma gramática de análise para construir e árvore de sintaxe abstrata a partir da entrada, o seu muito fácil, em seguida, processar essa AST com uma gramática árvore. A gramática árvore poderia facilmente lidar com a execução do processo que você descreveu.

Você vai encontrar ANTLR em muitos lugares, incluindo Eclipse, Groovy e Grails para um começo. The Definitive ANTLR referência mesmo torna bastante simples para chegar até a velocidade sobre a base rapidamente.

Eu tinha um projeto que teve que lidar com algumas gerado usuário texto da consulta no início deste ano. Comecei a descer um caminho para processá-lo manualmente, mas rapidamente se tornou esmagadora. Eu levei um par de dias para chegar até a velocidade em ANTLR e teve uma versão inicial da minha gramática e processador rodando em poucos dias. alterações subseqüentes e adaptações dos requisitos teria matado qualquer versão personalizada, mas necessário relativamente pouco esforço para ajustar uma vez tive a ANTLR gramáticas instalado e funcionando.

Boa sorte!

Outras dicas

Se você chama isso de "linguagem natural", você está se iludindo. Ainda é uma linguagem de programação, apenas um que tenta imitar a linguagem natural - e eu suspeito que ele irá falhar uma vez que você entrar em detalhes de implementação. A fim de fazer em inequívoca, você vai ter que colocar restrições sobre a sintaxe que irá confundir os usuários que já foram levados a pensar que eles estão escrevendo "Inglês".

A vantagem de uma DSL é (ou deveria ser, pelo menos) é que é simples e clara, mas poderoso em conta o domínio do problema. Imitando uma linguagem natural é uma preocupação secundária, e pode de fato ser contra-produtivo para esses objetivos primários.

Se alguém é muito estúpido ou não tem a capacidade para o pensamento formalmente rigoroso que é necessário para a programação, em seguida, uma linguagem de programação que imita um natural não irá magicamente transformá-los em um programador.

Quando COBOL foi inventado, algumas pessoas acreditavam seriamente que dentro de 10 anos não seria zero demanda por programadores profissionais, desde COBOL era "como o Inglês", e qualquer pessoa que precisava de software poderia escrevê-lo a si mesmo. E todos nós sabemos como isso está trabalhando para fora.

Você pode querer considerar Xtext , que internamente usa ANTLR e faz algumas coisas agradáveis ??como auto-geração um editor para seu DSL.

A primeira vez que ouvi de DSL era da JetBrains, a criadora de IntellJ Idea.

Eles têm esta ferramenta: MPS (Meta Programming System)

Você pode achar esta série de blog multi-parte eu fiz sobre o uso Antlr ser útil como um ponto de partida. Ele usa Antlr 2, então algumas coisas serão diferentes para Antlr 3:

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

apresentações de Mark Volkman / artigos sobre Antlr são bastante úteis, bem como:

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

Eu vou segundo a sugestão sobre o livro ANTLR definitivo, que também é excelente.

"Uma aplicação bastante clara de que, pelo menos para mim, seria permitir que os testadores aplicação criar 'testando scripts' em linguagem natural e, em seguida, analisar as sentenças em classes que usos JUnit para verificar se os comportamentos de aplicativos"

O que você está falando aqui soa exatamente como a ferramenta, FitNesse. Exatamente como você descreve, os clientes escrever testes de aceitação "scripts" em algum tipo de linguagem que sentido makese a eles, e os programadores construir sistemas que fazem os testes passam. Mesmo a implementação você falar é muito bonito exatamente como FitNesse funciona -. O vocabulário utilizado nos scripts são concatenados para nomes de função forma etc, de modo que o quadro FitNesse sabe qual a função de chamada

De qualquer forma, confira:)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top