Analizador para árbol de expresión de filtro de consulta

c# expression-trees parsing tsql

Pregunta

Estoy buscando un analizador que pueda operar en un filtro de consulta. Sin embargo, no estoy muy seguro de la terminología, así que está demostrando ser un trabajo duro. Espero que alguien me pueda ayudar. He leído sobre 'analizadores de descendencia recursiva' pero me pregunto si estos son analizadores de lenguaje en toda regla en lugar de la evaluación de la expresión lógica que estoy buscando.

Idealmente, estoy buscando un código .NET (C #) pero también un analizador similar que funcione en T-SQL.

Lo que quiero es que algo se analice, por ejemplo:

((a = b) | (e = 1)) & (c <= d)

Idealmente, los operadores pueden ser definibles (por ejemplo, '<' vs 'lt', '=' vs '==' vs 'eq', etc.) y podemos especificar etiquetas de tipo de función (por ejemplo, (izquierda (x, 1) = 'mi')). El analizador carga esto, obedece la prioridad de orden (e idealmente maneja la falta de corchetes) y luego devuelve la llamada a mi código con expresiones para evaluar un resultado booleano, por ejemplo, 'a = b'?). No esperaría que el analizador entendiera las funciones personalizadas en la expresión (aunque algunas básicas serían útiles, como la división de cadenas). Dividir la expresión (en partes de la mano izquierda y derecha) sería agradable.

Es preferible que el analizador haga la cantidad mínima de preguntas para calcular el resultado final; por ejemplo, si un lado de un AND es falso, no tiene sentido evaluar el otro lado, y evaluar el lado más fácil primero (es decir, en la expresión anterior, 'c <= d' se debe asumir que es más rápida y, por lo tanto, se debe evaluar primero.

Puedo imaginar que esto es mucho trabajo por hacer, sin embargo, bastante común. ¿Alguien puede darme algún puntero? Si no hay analizadores que sean tan flexibles como los anteriores, ¿hay algunos analizadores básicos que pueda usar como comienzo?

Muchas gracias

Sotavento

Respuesta popular

Podrías echarle un vistazo a Irony . Con él, define su gramática en código C # usando una sintaxis que no está muy lejos de bnf. Incluso tienen un ejemplo simple en su sitio (evaluador de expresiones) que parece estar muy cerca de lo que quieres lograr.

Edit: Ha habido una charla sobre Irony en el simposio de Lang.Net de este año.

¡Espero que esto ayude!



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow