2008-08-26 53 views
10

Nos gustaría tener fórmulas definidas por el usuario en nuestro programa C++. p. El valor v = x + (y - (z - 2))/2. Más adelante en el programa, el usuario definiría x, y y z -> el programa debería devolver el resultado del cálculo.
Algunas veces, la fórmula puede cambiarse, por lo que la próxima vez el programa debería analizar la fórmula y agregar los nuevos valores.

¿Alguna idea/sugerencia de cómo hacer algo como esto?

Hasta ahora llegué a la solución de escribir un analizador para calcular estas fórmulas, ¿alguna idea al respecto?cálculo de fórmulas definidas por el usuario (con C++)

Respuesta

3

Si se usará con frecuencia y se extenderá en el futuro, casi recomiendo agregar python o LUA a su código. LUA es un lenguaje de scripting muy ligero que puede conectar y proporcionar nuevas funciones, operadores, etc. Si desea hacer cosas más robustas y complicadas, use Python en su lugar.

0

El uso de Spirit (por ejemplo) para analizar (y las "acciones semánticas" que proporciona para construir un árbol de expresiones que luego puede manipular, por ejemplo, evaluar) parece una solución bastante simple. Puede encontrar una gramática para las expresiones aritméticas there, por ejemplo, si es necesario ... (es bastante sencillo crear la suya propia).

Nota: Spirit es muy fácil de aprender, y bastante adecuado para esas tareas.

0

lo general hay dos maneras de hacerlo, con tres posibles implementaciones:

  1. como que ha tocado en sí mismo, una biblioteca que evalúe fórmulas
  2. compilación de la fórmula en código

La segunda opción aquí se hace generalmente compilando algo que se puede cargar como un tipo de complemento, o se puede compilar en un programa separado que luego se invoca y produce la salida necesaria.

Para C++ Supongo que una biblioteca para evaluación probablemente existiría en alguna parte, así que ahí es donde comenzaría.

0

Si desea escribir su propia, la búsqueda de "autómatas formales" y/o "finito máquina de gramática estado"

En general lo que va a hacer es analizar la cadena, empujando a los personajes en una pila a medida que avanza . A continuación, comience a mostrar los caracteres y realice tareas según lo que se haya reventado. Es más fácil codificar si fuerza las ecuaciones a la notación de pulido inverso.

1

Puede representar su fórmula como un árbol de operaciones y subexpresiones. Es posible que desee definir tipos o constantes para Tipos de operación y Variables.

A continuación, puede fácilmente bastante escribir un método que recursivamente a través del árbol, la aplicación de las operaciones correspondientes a los valores que se pasa en.

0

Para hacer la vida más fácil, creo que conseguir este tipo de entrada se realiza mejor a través una GUI donde los usuarios están restringidos en lo que pueden escribir.

Si planea hacerlo desde la línea de comando (esa es la impresión que obtengo de su publicación), entonces probablemente deba definir un conjunto estricto de entradas permitidas (por ejemplo, solo variables de una sola letra, sin espacio en blanco, y solo ciertos símbolos matemáticos:() + - */etc.).

A continuación, tendrá que:
Leer en la matriz de caracteres de entrada
analizarlo con el fin de crear una lista de variables y acciones
Llevar a cabo estas acciones - en BOMDAS fin

1

La construcción de su propio analizador para este debería ser una operación recta de avance:

) convertir la ecuación de infija a la notación de sufijo (una asignación típica CompSci) (que haría uso de una pila) ) esperar a llegar los valores que desee ) pop la pila de artículos infijos, dejando caer el valor de la variable en donde sea necesario ) Mostrar resultados

0

Con ANTLR puede crear un analizador/compilador que va a interpretar la entrada del usuario, a continuación, ejecutar los cálculos usando el patrón del visitante. A good example is here, pero está en C#. Debería poder adaptarlo rápidamente a sus necesidades y seguir usando C++ como su plataforma de desarrollo.

Cuestiones relacionadas