Tengo que evaluar un gran número de expresiones que contienen variables y estoy pensando en escribir un pequeño intérprete personalizado para mantener la compilación rápida y pequeña. Sin embargo, no tengo experiencia con este tema y tengo algunas preguntas.Intérprete personalizado para expresiones matemáticas
Digamos que tenemos un archivo con expresiones matemáticas y un conjunto limitado de objetos. El archivo podría quedar así:
expr[x,y,z] = 2*x*y + x^2 + 28/14*z*(x*y^2 + 15*z) + ...
me gustaría analizar esto de alguna manera para que pueda evaluar las expresiones numéricamente en mi solicitud simplemente llamando a una función expr(float x, float y, float z)
. El número de parámetros no debería ser fijo (EDITAR: cada expresión tendría su propia definición con el número apropiado de parámetros o aceptaría una matriz) y se debería permitir que la anidación de paréntesis mantenga los archivos de entrada razonablemente pequeños.
Dado que las expresiones son todas de tipo polinomial, puedo pensar en cómo debería ser la estructura de datos, pero el análisis parece difícil. Ya he encontrado algunas respuestas a preguntas algo similares aquí en SO, por ejemplo usando Lua.
La pregunta más importante, sin embargo, es cuál sería la penalización del rendimiento al crear y llamar a esos objetos en comparación con la compilación directa de estas expresiones del código C generado automáticamente.
¡Gracias de antemano!
EDITAR: Tenga en cuenta el ejemplo de expr()
anterior solo como tal. Supongo que la mejor manera sería tener objetos de una clase con plantilla que contenga coeficientes y potencias de las variables en matrices dispersas.
"llamar a una función expr (float x, float y, float z). El número de parámetros no debe ser corregido" - hay un problema allí, entonces, ya que el número de parámetros en una C o la llamada a la función C++ * es * fija. Incluso con varargs, donde el destinatario puede hacer frente a diferentes números, la persona que llama tiene que fijar el número en el momento de la compilación. Probablemente necesites pasar una matriz en su lugar. –
@Steve Jessop: corregido, estoy enterado de esto. – bbtrb
¿Por qué no simplemente escribe la expresión de su función como una función C y la compila/ejecuta? –