Pregunta

¿Cómo evaluar expresiones booleanas complejas generadas en tiempo de ejecución en un programa Java?

Ejemplo:

(x e y o z) y s

con variables booleanas x, y, z...

Gracias

¿Fue útil?

Solución

Utilice http://docs.codehaus.org/display/JANINO/Home por trabajo mínimo.Puedo hacer mucho más que simples expresiones.

Otros consejos

Muy brevemente, se necesita una "representación intermedia" de las expresiones booleanas.Este es un árbol formado por Node objetos. Node tiene estas subclases AndNode, OrNode, NotNode, y VariableNode.Un AndNode tiene dos hijos Nodes, un OrNode tiene dos hijos Nodes, y un NotNode tiene un hijo Node.

A VariableNode tiene sólo un nombre de variable Cadena, por ejemplo, "x".tendrías un HashMap<String, Boolean> donde cada clave de nombre de variable tiene un valor booleano asociado.

Cada clase de nodo tiene un eval() método que evalúa su expresión y devuelve un boolean.El VariableNode.eval() El método busca el valor de la variable en su HashMap y lo devuelve. NotNode.eval() devoluciones !child.eval(). AndNode.evaluate() devoluciones child1.eval() && child2.eval(), mientras OrNode.evaluate() devoluciones child1.eval() || child2.eval().Para evaluar un árbol de expresión booleana completo, simplemente llame al nodo raíz eval() método.

Puede crear estos árboles de expresiones booleanas mediante programación, utilizando constructores de Java, etc.

Si desea construir sus árboles de expresión a partir de cadenas, necesitará escribir un analizador que produzca un árbol a partir de una cadena.Terence Parr Patrones de implementación del lenguaje Es una introducción muy simple y clara a esto.

¿Cómo evaluar una expresión lógica?Expresiones lógicas como esas se pueden evaluar como un árbol de sintaxis, y creo que hay buena información en esta pregunta relacionada Logicanalizador de expresiones

La otra cosa que me viene a la mente es que desea poder manejar expresiones lógicas como datos, lo que parece algo más adecuado para un lenguaje de scripting como tal vez Jython, JRuby, Groovy o Scala (asumiendo que está restringido ala JVM).Aunque dudo que sea muy difícil escribir un analizador para manejar expresiones básicas y / o no lógicas.

Tendrá que generar un árbol de expresión y vincular cada hoja a un valor booleano.Para analizar esta expresión y generar un AST, eche un vistazo al algoritmo Shunting Yard de Dijkstra.Todo se explica allí y es bastante sencillo de implementar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top