Pregunta

Hace un par de días, leí una entrada de blog ( http://ayende.com/Blog/archive/2008/09/08/Implementing-generic-natural-language-DSL.aspx ) donde el autor discute la idea de un genérico natural analizador de lenguaje DSL usando .NET.

La parte brillante de su idea, en mi opinión, es que el texto se analiza y se compara con las clases que usan el mismo nombre que las oraciones.

Tomando como ejemplo, las siguientes líneas:

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

Se convertiría utilizando una colección de " conocido " Objetos, que toma el resultado del análisis. Algunos objetos de ejemplo serían (usando Java para mi ejemplo):

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

Entonces, al procesar la primera oración, la clase CreateUser sería una coincidencia (obviamente porque es una concatenación de " crear usuario ") y, dado que toma un parámetro en el constructor, el analizador tomaría " usuario1 " como siendo el parámetro de usuario.

Después de eso, el analizador identificará que la siguiente parte, " con correo electrónico " también coincide con el nombre de un método, y como ese método toma un parámetro, se analizará " test@email.com" como el parámetro de correo electrónico.

Creo que ya entiendes la idea, ¿verdad? Una aplicación bastante clara de eso, al menos para mí, sería permitir a los probadores de aplicaciones crear " scripts de prueba " en lenguaje natural y luego analice las oraciones en clases que usan JUnit para verificar los comportamientos de las aplicaciones.

Me gustaría escuchar ideas, consejos y opiniones sobre herramientas o recursos que podrían codificar dicho analizador usando Java. Mejor aún, si pudiéramos evitar el uso de lexers complejos, o marcos como ANTLR, lo que creo que quizás sería usar un martillo para matar una mosca.

Más que eso, si alguien está preparado para iniciar un proyecto de código abierto para eso, definitivamente estaría interesado.

¿Fue útil?

Solución

Teniendo en cuenta la complejidad de leer y analizar, no sé si quisiera codificar todo eso a mano. ANTLR no es tan difícil de recoger y creo que vale la pena analizarlo en función de su problema. Si usa una gramática de análisis para compilar y abstraer el árbol de sintaxis de la entrada, es bastante fácil procesar ese AST con una gramática de árbol. La gramática del árbol podría manejar fácilmente la ejecución del proceso que describiste.

Encontrarás ANTLR en muchos lugares, como Eclipse, Groovy y Grails, para empezar. La referencia definitiva ANTLR incluso hace que sea bastante sencillo ponerse al día en lo básico con bastante rapidez.

Tuve un proyecto que tuvo que manejar un texto de consulta generado por el usuario a principios de este año. Comencé por un camino para procesarlo manualmente, pero rápidamente se volvió abrumador. Tomé un par de días para aumentar la velocidad en ANTLR y tuve una versión inicial de mi gramática y procesador funcionando en unos pocos días. Los cambios posteriores y los ajustes a los requisitos habrían eliminado cualquier versión personalizada, pero requirieron relativamente poco esfuerzo para ajustarse una vez que tuve las gramáticas ANTLR en funcionamiento.

¡Buena suerte!

Otros consejos

Si llamas a ese "lenguaje natural", te estás engañando a ti mismo. Sigue siendo un lenguaje de programación, solo uno que intenta imitar el lenguaje natural, y sospecho que fallará una vez que entres en los detalles de la implementación. Para que sea inequívoco, deberás poner restricciones en la sintaxis que confundirá a los usuarios que han sido inducidos a pensar que están escribiendo " Inglés " ;.

La ventaja de un DSL es (o debería ser, en cualquier caso) es que es simple y clara, pero potente en relación con el dominio del problema. Imitar un lenguaje natural es una preocupación secundaria y, de hecho, puede ser contraproducente para esos objetivos primarios.

Si alguien es demasiado estúpido o no tiene la capacidad de pensar formalmente rigurosamente que se requiere para la programación, entonces un lenguaje de programación que imita a uno natural NO lo convertirá mágicamente en un programador.

Cuando se inventó COBOL, algunas personas creyeron seriamente que dentro de 10 años no habría ninguna demanda de programadores profesionales, ya que COBOL era como "inglés", y cualquiera que necesitara software podría escribirlo él mismo. Y todos sabemos cómo ha estado funcionando.

Es posible que desee considerar Xtext , que utiliza ANTLR internamente y hace algunas cosas buenas como la generación automática un editor para tu DSL.

La primera vez que escuché sobre DSL fue de Jetbrains, el creador de IntellJ Idea.

Tienen esta herramienta: MPS (Meta Programming System)

Es posible que esta serie de blogs de varias partes que hice sobre el uso de Antlr sea útil como punto de partida. Utiliza Antlr 2, por lo que algunas cosas serán diferentes para Antlr 3:

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

Las presentaciones / artículos de Mark Volkman en Antlr también son bastante útiles:

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

Secundaré la sugerencia sobre el libro ANTLR definitivo, que también es excelente.

" Una aplicación bastante clara de eso, al menos para mí, sería permitir a los probadores de aplicaciones crear " scripts de prueba " en lenguaje natural y luego analice las oraciones en clases que usan JUnit para verificar los comportamientos de las aplicaciones "

De lo que estás hablando aquí suena exactamente igual que la herramienta, FitNesse. Exactamente como lo describe, los clientes escriben las pruebas de aceptación " scripts " en algún tipo de lenguaje que tenga sentido para ellos, y los programadores construyen sistemas que hacen que las pruebas pasen. Incluso la implementación de la que hablas es exactamente cómo funciona FitNesse: el vocabulario utilizado en los scripts se concatena para formar nombres de funciones, etc., de modo que el marco de FitNesse sabe qué función llamar.

De todos modos, échale un vistazo :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top