Pregunta

Entonces, esto es lo que estoy buscando lograr. Me gustaría dar a mis usuarios un único cuadro de texto similar a Google donde puedan escribir sus consultas. Y me gustaría que pudieran expresar un lenguaje seminatural como

"view all between 1/1/2008 and 1/2/2008"

está bien si la sintaxis tiene que estar bastante estructurada y limitada a este dominio específico ... estos son usuarios expertos que los usarán.

Finalmente, creo que me gustaría que los resultados de análisis estén disponibles como algún tipo de árbol de expresión. Pero si tiene otras ideas sobre qué estructura de datos podría ser mejor.

Esto está en C # :-)

¿Fue útil?

Solución

Estás describiendo un lenguaje de programación. Por supuesto, es un lenguaje pequeño (a menudo llamado un lenguaje pequeño o lenguaje específico de dominio (DSL)). Si nunca ha escuchado el término analizador de descenso recursivo, probablemente sea mejor que siga los consejos de Paul y utilice cuadros desplegables de alguna descripción.

Sin embargo, de nuevo, tendría que estar de acuerdo con él, que si quieres hacerlo, Antlr es el camino a seguir. Hay tutoriales en el sitio que pueden ayudarlo a comenzar. Básicamente, deberá describir cómo la sintaxis utiliza la notación Backus-Naur Form .

A continuación, ejecutará Antlr sobre su gramática y generará su analizador. Luego puede alimentar la entrada de su libro de texto en un árbol de sintaxis abstracta. Luego puede usar ese árbol para generar su consulta. No es tan difícil como parece, pero hay un poco de eso.

Si realmente te gusta esto y / o quieres extender un poco tus alas de programación, puedes leer más sobre el tema con Dragon Book, AKA Compilers: Principles, Techniques and Tools.

Buena suerte amigo mío

Otros consejos

Para un lenguaje muy simple, iría con expresiones regulares. El beneficio principal es que no tiene que lidiar con ninguna generación de código. Sin embargo, la depuración de la coincidencia de patrones es básicamente nula.

Si su idioma es moderadamente complejo (no le importaría especificar todo en un solo archivo de gramática), iría con Coco / R : es rápido, fácil de usar y crea un código extremadamente depurable.

Para un lenguaje más complejo, mi favorito actual es Antlr v3 . Admite gramáticas de múltiples archivos (a través de la declaración 'import'), lo cual es muy agradable. El código generado es depurable, pero lleva un tiempo acostumbrarse antes de que la depuración se considere 'fácil'.

He estado en esta situación antes. Después de mucha discusión, decidimos que los menús desplegables sensibles al contexto eran una mejor solución que solo un cuadro de texto.

Por ejemplo, tiene 4 menús desplegables, pero los últimos 3 están deshabilitados. Luego, cuando el usuario selecciona una opción de la primera, completa y habilita las demás. Entonces seleccionarían & Quot; ver todos & Quot; luego " entre " ;, y luego tal vez abrir un cuadro de texto o un calendario para los dos últimos.

Aquí hay un ejemplo similar a lo que estoy hablando

Un árbol de expresión es una buena idea. Existen muchos buenos analizadores generales y generadores de analizadores, tanto de código abierto como comerciales, que pueden transformar las cadenas de consulta correctas en árboles de expresión.

Utilice Oslo , está diseñado específicamente para esto ...

No sé si esto lo ayudará, pero lo que hicimos fue: le dimos al usuario criterios predefinidos como para la selección de fecha, les dimos dos ventanas emergentes de calendario para que puedan seleccionar desde y hasta el rango de fechas. no lo hicimos obligatorio ... por lo que el filtro de fecha se usa para aplicar solo cuando el usuario especifica las fechas ... de manera similar, también puede proporcionar a los usuarios una selección de criterios predefinidos ... además de que el árbol de expresión parece ser un buen solución para eso.

El GOLD Parser Generator tiene una interfaz de usuario útil para diseñar y probar su gramática, tutoriales razonablemente buenos y documentación, y es fácil de usar desde C #.

Intentar analizar esas cosas sería un desastre y, en última instancia, muy limitante para el usuario, lo que lo frustraría más que ayudarlo. Sugeriría usar Clases de consulta predefinidas, con algún tipo de herramienta de creación de consultas que tenga todas las opciones disponibles en forma desplegable. Puede tener diferentes operadores booleanos para diferentes tipos de datos (mayor que, menor que para numérico, como no como para cadenas, etc.), sin embargo, creo que eso tendría mucho más sentido que tratar de analizar lo que un usuario puede escribir.

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