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


Necesito localizar un analizador de expresión rápido y ligero.

Idealmente, quiero pasarle una lista de pares nombre/valor (por ejemplo, variables) y una cadena que contenga la expresión a evaluar. Todo lo que necesito 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.

UPDATE
Como mínimo necesita soporte ==, !=, >, >=,

Con respecto a la velocidad, espero que se ejecuten aproximadamente 5 expresiones por solicitud. Veremos en algún lugar cerca de 100 peticiones un 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, necesitaré 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 nos hemos expandido es uso tal que promediamos 40 + expresiones que cubren 300 + variables en post backs. Ahora hay miles de post backs que ocurren por segundo con absolutamente cero degradación del rendimiento.

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

Author: NotMe, 2010-12-08

5 answers

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

Es extensible, rápido (por ejemplo, tiene su propia caché) le permite proporcionar funciones personalizadas y variables 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 antler si desea cambiar el grammer. También hay un tenedor que soporta MEF para cargar nuevas funciones.

También soporta operadores lógicos, cadenas de fecha/hora y sentencias if.

 31
Author: GreyCloud,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-06 16:24:58

¿Qué tal el Evaluador Rápido de Expresiones Ligeras ? Le permite establecer variables y soporta operadores lógicos.

Si necesitas algo más fuerte y tienes tiempo, también puedes diseñar tu propio lenguaje de expresión con Irony.

 12
Author: Corbin March,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-16 12:53:09

El intérprete de Hisystems soporta funciones personalizadas, operadores y literales, es un código portable ligero y puro de c#. 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.

 5
Author: Toby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-23 10:58:34

Aprecio completamente lo tarde que es esta respuesta, sin embargo, me gustaría agregar mi solución porque creo que puede agregar más sobre la respuesta aceptada de usar NCalc si alguien desea usar las expresiones en múltiples plataformas.

-- Actualizar {

He creado un analizador sintáctico para C# con planes para implementarlo también para Java y Swift en los próximos meses. Esto significaría que puede evaluar las expresiones en multiplataforma sin el necesidad de ajustar por plataforma.

Mientras que Java y Swift fueron planeados, nunca llegaron a una liberación completa. En su lugar, ahora hay soporte para .NET Standard habilitando soporte para aplicaciones Xamarin.

-- End update {

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

El sitio tiene una buena cantidad de documentación en él, pero para evitar la putrefacción de enlaces aquí hay un ejemplo de cómo usarlo:

Variable soporte

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

Funciones

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

Fue diseñado para que coincida con NCalc lo mejor posible, sin embargo, ha añadido soporte para cosas como una palabra clave 'null'.

 1
Author: Bijington,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-26 08:26:01

Autopromoción aquí escribí aa generator parser para c # https://github.com/b3b00/csly puedes encontrar un ejemplo de expresión parseras en mi github. es posible que necesite personalizarlo para satisfacer sus necesidades

 -1
Author: Olivier Duhart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-30 09:01:11