Necesito un analizador de expresiones de tiempo de ejecución rápido

Necesito encontrar un analizador de expresiones rápido y liviano.

Idealmente, quiero pasarle una lista de pares nombre / valor (por ejemplo, variables) y una cadena que contenga la expresión para evaluar. Todo lo que necesito de él es un valor verdadero / falso.

Los tipos de expresiones deben estar en la línea de:

varA == "xyz" and varB==123 

Básicamente, solo un motor lógico simple cuya expresión se proporciona en tiempo de ejecución.

ACTUALIZAR
Como mínimo, debe admitir ==,! =,>,> =, <, <=

En cuanto a la velocidad, espero que se ejecuten aproximadamente 5 expresiones por solicitud. Veremos un lugar en las proximidades de 100 / solicitudes por segundo. Nuestras páginas actuales tienden a ejecutarse en menos de 50 ms. Por lo general, solo habrá 2 o 3 variables involucradas en cualquier expresión. Sin embargo, tendré que cargar aproximadamente 30 en el analizador antes de la ejecución.

ACTUALIZACIÓN 2012/11/5
Actualización sobre el rendimiento Implementamos nCalc hace casi 2 años. Desde entonces, hemos ampliado su uso de modo que promediemos más de 40 expresiones que cubren más de 300 variables en las publicaciones posteriores. Ahora hay miles de reversiones de publicaciones por segundo con una degradación del rendimiento absolutamente nula.

También lo hemos ampliado para incluir un puñado de funciones adicionales, nuevamente sin pérdida de rendimiento. En resumen, nCalc cumplió con todas nuestras necesidades y superó nuestras expectativas.

¿Has visto https://ncalc.codeplex.com/ y https://github.com/sheetsync/NCalc ?

Es extensible, rápido (por ejemplo, tiene su propio caché) le permite proporcionar funciones personalizadas y varaibles en tiempo de ejecución mediante el manejo de eventos EvaluateFunction / EvaluateParameter. Ejemplos de expresiones que puede analizar:

 Expression e = new Expression("Round(Pow(Pi, 2) + Pow([Pi2], 2) + X, 2)"); e.Parameters["Pi2"] = new Expression("Pi * Pi"); e.Parameters["X"] = 10; e.EvaluateParameter += delegate(string name, ParameterArgs args) { if (name == "Pi") args.Result = 3.14; }; Debug.Assert(117.07 == e.Evaluate()); 

También maneja unicode y muchos tipos de datos de forma nativa. Viene con un archivo de astas si quieres cambiar la gramática. También hay un tenedor que soporta MEF para cargar nuevas funciones.

También es compatible con operadores lógicos, cadenas de fecha / hora y declaraciones if.

¿Qué tal el Evaluador rápido de expresiones ligeras ? Le permite establecer variables y admite operadores lógicos .

Si necesita algo más sólido y tiene más tiempo, también puede diseñar su propio lenguaje de expresiones con Irony .

El intérprete de Hisystems admite funciones personalizadas, operadores y literales, es un código portátil c # puro liviano. Actualmente se ejecuta en iOS a través de MonoTouch y debe ejecutarse en cualquier otro entorno Mono así como en Windows. Gratis para uso comercial. Disponible en GitHub en https://github.com/hisystems/Interpreter .

Sin embargo, aprecio plenamente cuán tarde es esta respuesta, me gustaría incluir mi solución porque creo que puede agregar más por encima de la respuesta aceptada de usar NCalc si alguien desea usar las expresiones en múltiples plataformas.

He creado un analizador sintáctico para C # con planes para implementarlo también para Java y Swift en los próximos meses. Esto significa que puede evaluar las expresiones en plataformas múltiples sin la necesidad de ajustar por plataforma.

Expressive es la herramienta y está disponible en: GitHub o Nuget .

El sitio tiene una buena cantidad de documentación, pero para evitar la descomposición del enlace aquí hay un ejemplo sobre cómo usarlo:

Soporte variable

 var expression = new Expression("1 * [variable]"); var result = expression.Evaluate(new Dictionary { ["variable"] = 2); 

Funciones

 var expression = new Expression("sum(1,2,3,4)"); var result = expression.Evaluate(); 

Fue diseñado para coincidir con NCalc de la mejor manera posible, sin embargo, ha agregado soporte para cosas como una palabra clave ‘nula’.

autopromoción aquí escribí un generador genérico de analizador para c # https://github.com/b3b00/csly puedes encontrar un ejemplo de parseras de expresión en mi github. es posible que deba personalizarlo para que se ajuste a sus necesidades