Boolsche Ausdrücke vom Benutzer erlauben und auswerten

thommyslaw

Mitglied
Ich möchte in einem Tool dem Benutzer ermöglichen, dass er gewisse Abhängigkeiten mit Hilfe von boolschen Ausdrücken der Form "if A > 0 then B = 1" selber (als Zeichenkette) definieren kann. Anschließend müssten die Ausdrücke geparst werden, um sie wieder auswerten zu können.
Kennt jemand eine Bibliothek oder ähnliches, um so etwas zu realisieren?
 

Thomas Darimont

Erfahrenes Mitglied
Hallo,

warum nicht einfach:
Java:
/**
 * 
 */
package de.tutorials;

import javax.script.Bindings;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

/**
 * @author Thomas.Darimont
 *
 */
public class ScriptingEngineExample {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception{
        ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName("javascript");
        Bindings bindings = scriptEngine.createBindings();
        bindings.put("A",10);
        bindings.put("B",null);
        scriptEngine.eval("if(A > 0) B = 'Hallo'",bindings);
        System.out.println(bindings.get("B"));
        
    }

}

Ausgabe:
Code:
Hallo

Gruß Tom
 

halech

Grünschnabel
Liebe Tutorials User,

ohne, dass ich diesen Thread hijacken will, moechte ich gerne passende Frage zu diesem Thema stellen.

Hier wurde ein Binding fuer A gesetzt. Aber was ist, wenn ein Binding fehlt? Ich moechte es gerne so haben, dass wenn ein Binding fuer einen Unterausdruck fehlt, dieser Unterausdruck einfach zu false (logisch) oder zu 0 (arithmetisch) evaluiert.

Ist das irgendwie mit den gegebenen Moeglichkeiten erzeugbar, wenn man scripting in Java benutzt?

(Als Tip, wenn man sonst eine Variable nicht bindet wird eine Exception geworfen)
 

Thomas Darimont

Erfahrenes Mitglied
Hallo,

schau mal hier:
Java:
package de.tutorials;

import javax.script.Bindings;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.SimpleBindings;

public class ScriptingEngineExample {
 
    /**
     * @param args
     */
    public static void main(String[] args) throws Exception{
        ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName("javascript");
        Bindings bindings = new SimpleBindings(){
        	@Override
        	public Object get(Object key) {
        		Object value = super.get(key);
        		
        		if(!super.containsKey(key)){
        			value = Boolean.FALSE;
        		}
        		
				return value;
        	}
        	
        	@Override
        	public boolean containsKey(Object key) {
        		return true;
        	}
        };
        bindings.put("A",10);
        bindings.put("B",null);
        //bindings.put("C",true);
        System.out.println(scriptEngine.eval("if(C) 'C da'; else 'C nicht da';",bindings));
        
        
    }
 
}

Gruß Tom