pasos - ¿Cuál sería la mejor herramienta para crear una DSL natural en Java?
swing containers (6)
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 es muy interesante analizarlo en función de tu problema. Si usa una gramática parse para construir 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 de árbol podría manejar fácilmente la ejecución del proceso que describió.
Encontrarás ANTLR en muchos lugares, incluidos Eclipse, Groovy y Grails para empezar. La referencia ANTLR definitiva incluso hace que sea bastante sencillo ponerse al día rápidamente con lo básico.
Tenía un proyecto que tenía que manejar algún texto de consulta generado por el usuario a principios de este año. Comencé un camino para procesarlo manualmente, pero rápidamente se volvió abrumador. Me 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 pocos días. Los cambios y ajustes posteriores a los requisitos habrían acabado con cualquier versión personalizada, pero requirieron relativamente poco esfuerzo para ajustarse una vez que tuve las gramáticas ANTLR en funcionamiento.
¡Buena suerte!
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 analiza la idea de un analizador DSL genérico de lenguaje natural con .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 [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
Se convertiría utilizando una colección de objetos "conocidos", que toma el resultado del análisis sintáctico. 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 "user1" como 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 dado que ese método toma un parámetro, analizará "[email protected]" como el parámetro de correo electrónico.
Creo que ya entendiste la idea, ¿verdad? Una aplicación bastante clara de eso, al menos para mí, sería permitir que los evaluadores de aplicaciones creen "scripts de prueba" en lenguaje natural y luego analizar las oraciones en clases que usen JUnit para verificar el comportamiento 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, que creo que podría estar usando un martillo para matar a una mosca.
Más que eso, si alguien está listo para comenzar un proyecto de código abierto para eso, definitivamente me interesaría.
Es posible que desee considerar Xtext , que internamente utiliza ANTLR y hace algunas cosas agradables, como la generación automática de un editor para su DSL.
Puede encontrar esta serie de blog de varias partes que hice sobre el uso de Antlr para ser ú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-1-lexer/
Las presentaciones / artículos de Mark Volkman sobre Antlr son bastante útiles también:
http://www.ociweb.com/mark/programming/ANTLR3.html
Apoyaré la sugerencia sobre el libro Definitivo ANTLR, que también es excelente.
"Una aplicación bastante clara de eso, al menos para mí, sería permitir que los evaluadores de aplicaciones creen" scripts de prueba "en lenguaje natural y luego analizar las oraciones en clases que usen JUnit para verificar el comportamiento de las aplicaciones".
De lo que estás hablando aquí suena exactamente como la herramienta, FitNesse. Exactamente como usted describe, los clientes escriben "scripts" de pruebas de aceptación en algún tipo de lenguaje que tenga sentido para ellos, y los programadores crean sistemas que hacen que las pruebas pasen. Incluso la implementación de la que habla es más o menos la forma en que funciona FitNesse: el vocabulario utilizado en los scripts se concatena para formar nombres de funciones, etc., de modo que el marco FitNesse sabe a qué función llamar.
De todos modos, compruébalo :)
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 ingrese a los detalles de la implementación. Para que no quede ambiguo, tendrá que poner restricciones a la sintaxis que confundirá a los usuarios a quienes se les ha inducido a pensar que están escribiendo en "inglés".
La ventaja de una DSL es (o debería ser, en cualquier caso) que es simple y clara, pero poderosa con respecto al 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 carece de la capacidad de pensamiento formalmente riguroso que se requiere para la programación, entonces un lenguaje de programación que imita a uno natural NO los convertirá mágicamente en un programador.
Cuando se inventó COBOL, algunas personas creían seriamente que dentro de 10 años habría una demanda cero para los programadores profesionales, ya que COBOL era "como el inglés", y cualquiera que necesitara un software podría escribirlo él mismo. Y todos sabemos cómo ha funcionado.
La primera vez que oí hablar de DSL fue de Jetbrains, el creador de IntellJ Idea.
Tienen esta herramienta: MPS (Meta Programming System)