tutorial smart remix programador online español curso c++

c++ - remix - smart contracts ethereum



cálculo de fórmulas definidas por el usuario(con c++) (8)

Nos gustaría tener fórmulas definidas por el usuario en nuestro programa c ++. Por ejemplo, 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 debe 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 para escribir un analizador para calcular estas fórmulas, ¿alguna idea al respecto?


Generalmente hay dos formas de hacerlo, con tres posibles implementaciones:

  1. como te has tocado a ti mismo, una biblioteca para evaluar fórmulas
  2. compilando 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 el resultado necesario.

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


Para hacerte la vida más fácil, creo que obtener este tipo de información se hace mejor a través de una GUI en la que los usuarios pueden restringir lo que pueden escribir.

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

Entonces, necesitarás:
Leer en la matriz de caracteres de entrada
Analizarlo para construir una lista de variables y acciones
Llevar a cabo esas acciones - en orden BOMDAS


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 escribir fácilmente un método que repita a través del árbol, aplicando las operaciones apropiadas a los valores que pase.


Si quieres escribir el tuyo, busca "autómata formal" y / o "gramática de máquina de estados finitos"

En general, lo que harás es analizar la cadena, presionando los caracteres de una pila sobre la marcha. 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.


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


Usar 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. Aquí puede encontrar una gramática para expresiones aritméticas, por ejemplo, si es necesario ... (es bastante sencillo crear la suya propia).

Nota: Spirit es muy simple de aprender y bastante adecuado para tales tareas.


Construir su propio analizador para esto debe ser una operación directa:

) convertir la ecuación de infijo a notación de postfijo (una asignación de compsci típica) (yo usaría una pila)) esperar para obtener los valores que desea) mostrar la pila de elementos de infijo, dejando caer el valor de la variable donde sea necesario) mostrar resultados


Con ANTLR puede crear un analizador / compilador que interpretará la entrada del usuario, luego ejecutará los cálculos utilizando el patrón Visitor. Un buen ejemplo está aquí , pero está en C #. Debería poder adaptarlo rápidamente a sus necesidades y seguir usando C ++ como su plataforma de desarrollo.