Quote Originariamente inviata da jabjoint Visualizza il messaggio
Per allenamento, perche' potrebbe servirmi e per ostinazione forse sto tentando da me di fare un risolutore di espressioni in linguaggio Java.
Scusa ma ... il Nashorn non andava bene?

Questo l'ho scritto velocemente:
codice:
import javax.script.Bindings;
import javax.script.Compilable;
import javax.script.CompiledScript;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class Prova {
    public static void main(String[] args) throws ScriptException {
        ScriptEngine engine = new ScriptEngineManager().getEngineByName("Nashorn");

        CompiledScript compiledExpr = ((Compilable) engine).compile("3*Math.pow(x, 2) - 15*x + 20");
        Bindings bindings = engine.createBindings();

        for (double x = 0; x <= 10; x += 0.1) {
            bindings.put("x", x);
            double result = (double) compiledExpr.eval(bindings);
            System.out.printf("x=%.5f --> %f%n", x, result);
        }
    }
}

Giusto alcune note:

Compilable è una interfaccia che un ScriptEngine può opzionalmente implementare (non è obbligatorio). Il Nashorn la implementa. In questo modo si può "precompilare" l'espressione in modo che sia ri-eseguibile molto velocemente. Chiaramente il compile può fallire con ScriptException. Non l'ho gestita bene solo per brevità.

Con il Bindings si possono "iniettare" valori nella espressione. Ho scritto una espressione matematica pensata a caso (equazione di 2° grado).

Funziona sia con il Nashorn built-in del JDK che con quello messo come dipendenza esplicita (es. con Maven).


Quote Originariamente inviata da jabjoint Visualizza il messaggio
Vi posto il codice. Se volete aiutarmi a renderlo un programma funzionante a tutti gli effetti...

Il programma computa "bene" la stringa di esempio, ma fallisce in numerosi altri casi.
Non l'ho letto tutto in dettaglio .... ma a me sembra scritto un po' maluccio (e fumoso). Sia stilisticamente, sia per cose non molto appropriate tipo if (numero!="")

Per fare un parser di espressioni matematiche si dovrebbero applicare i concetti che portano alla creazione di un "albero" di nodi, come è descritto qui:

https://www.openbookproject.net/book...ParseTree.html

Quindi, in sostanza, se NON hai applicato un concetto del genere ...... hai totalmente sbagliato approccio.