# Boolsche Ausdrücke vom Benutzer erlauben und auswerten



## thommyslaw (19. Februar 2008)

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?


----------



## zeja (19. Februar 2008)

Mit dem ANTLR Parser Generator kriegt man sowas ganz gut hin.


----------



## Thomas Darimont (19. Februar 2008)

Hallo,

warum nicht einfach:

```
/**
 * 
 */
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:

```
Hallo
```

Gruß Tom


----------



## zeja (19. Februar 2008)

Ja oder so... kommt drauf an was man damit machen will


----------



## halech (21. Februar 2011)

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 (21. Februar 2011)

Hallo,

schau mal hier:

```
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


----------

