Estoy construyendo un analizador de expresiones del cual me gustaría generar el código de consulta de la base de datos, he llegado bastante lejos pero estoy atascado al analizar BinaryExpressions con precisión. Es bastante fácil dividirlos en Izquierda y Derecha, pero necesito detectar paréntesis y generar mi código en consecuencia y no puedo ver cómo hacerlo.Detectar paréntesis en BinaryExpression
Un ejemplo [por favor, ignora la lógica defectuosa :)]:
a => a.Line2 != "1" && (a.Line2 == "a" || a.Line2 != "b") && !a.Line1.EndsWith("a")
necesito para detectar el 'conjunto' en el medio y preservar su agrupación, pero no puedo ver ninguna diferencia en la expresión a una normal BinaryExpression durante el análisis (me gustaría comprobar la representación de la cadena para el paréntesis)
Cualquier ayuda sería apreciada.
(probablemente debería mencionar que estoy usando C#)
--Edit-- me olvidó mencionar que estoy usando las clases de expresión .Net estándar para construir las expresiones (System.Linq. expresiones espacio de nombres)
--Edit2-- Ok no estoy de análisis de texto en código, estoy código de análisis en texto. Así que mi clase Parser tiene un método como este:
void FilterWith<T>(Expression<Func<T, bool>> filterExpression);
que le permite escribir código como este:
FilterWith<Customer>(c => c.Name =="asd" && c.Surname == "qwe");
que es bastante fácil de analizar el uso de las clases de .NET estándar, mi reto es analizar esta expresión:
FilterWith<Customer>(c => c.Name == "asd" && (c.Surname == "qwe" && c.Status == 1) && !c.Disabled)
mi desafío es mantener las expresiones entre paréntesis como un conjunto único. Las clases .Net dividen correctamente las partes entre paréntesis de las otras, pero no da ninguna indicación de que sea un conjunto debido a los paréntesis.
Me limitaré a observar que esto es más difícil de lo que se podría pensar (habiéndolo hecho algunas veces), y es un problema que muchos de los ejemplos de análisis de "juguetes" no abordan convenientemente. –
Los analizadores de voz recursivos son bastante fáciles de poner en marcha, cualquier texto introductorio de nivel universitario sobre la construcción de compiladores lo comentará. Los paréntesis son manejados por la producción expr = "(" + expr + ")". Sin embargo, no es necesario reinventar este tipo de código. Incluso .NET tiene uno: DataTable.Compute(). –
¿Te gustaría compartir lo que has hecho sobre este problema? Acepto, los ejemplos son básicos sobre este tema ... –