2008-12-09 9 views
5

Así que esto es lo que estoy buscando lograr. Me gustaría ofrecer a mis usuarios un cuadro de texto similar al de Google en el que puedan escribir sus consultas. Y me gustaría que sean capaces de expresar el lenguaje semi-natural, comoAnalizando una consulta de usuario

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

Está bien si la sintaxis tiene que ser bastante estructurado y limitado a este dominio específico ... son usuarios expertos que van a utilizar esta.

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

Esto es en C# :-)

Respuesta

4

Usted está describiendo un lenguaje de programación. De acuerdo, es un lenguaje pequeño (a menudo llamado un poco de lenguaje o Dominio específico del lenguaje (DSL)). Si nunca ha escuchado el término analizador de descenso recursivo, probablemente sea mejor seguir los consejos de Paul y usar 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 se usa la sintaxis con Backus-Naur Form.

Luego ejecutarás Antlr sobre tu gramática y generará tu analizador. Luego puede alimentar la entrada de su libro de texto en un Árbol de sintaxis abstracto.A continuación, 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 alargar un poco tus posibilidades de programación, podrías leer más sobre el tema con Dragon Book, AKA Compilers: Principios, técnicas y herramientas.

Buena suerte amigo mío.

-1

intentar analizar eso sería un desastre, y ultimatley muy limitante para el usuario, por lo tanto frustrándolos más de ayudarles. Sugeriría usar clases de Quejas 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éricos, como no para cadenas, etc.), sin embargo, creo que tendría muchísimo más sentido que tratar de analizar lo que un usuario puede escribir.

+0

ya hemos implementado las listas desplegables ... es muy frustrante para nuestros usuarios tener que hacer tantos clics para agregar elementos dinámicos a su consulta. nota que dije "nuestros usuarios", sé que, en general, su sugerencia es probablemente más fácil, pero estas personas conocen nuestra aplicación de arriba a abajo y reciben capacitación :-) –

1

Un árbol de expresiones es una buena idea. Existen muchos analizadores sintácticos y analizadores sintácticos buenos, tanto de código abierto como comerciales, que pueden transformar cadenas de consulta correctas en árboles de expresiones.

+0

me pueden dar algunos ejemplos de estos analizadores sintácticos y analizadores sintácticos que ¿Referirse a? –

+0

Simplemente google "generador de analizador C#", y prepárate para experimentar. – yfeldblum

2

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, se completa y habilita las otras. Así que seleccionarían "ver todo" y luego "entre", y luego tal vez mostrar un cuadro de texto o un calendario para los dos últimos.

Here's an example that's kind of like what I am talking about

3

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

Si su lenguaje 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 hace 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 de 'importación'), lo cual es muy bueno. El código generado se puede depurar, pero toma un poco acostumbrarse antes de que la depuración se pueda considerar 'fácil'.

0

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

1

Uso Oslo, que está diseñado específicamente para este ...

0

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