Вы также можете использовать BeanShell .
На самом деле это скорее интерпретатор исходного кода Java, но недавно я использовал его для оценки некоторых выражений, содержащих переменные (только метод eval
использует BeanShell, rest предназначен для подготовки вывода):
import bsh.EvalError;
import bsh.Interpreter;
public class EVAL {
private static final String FORMAT = "%-5s | %-5s | %-5s | %s%n";
public static void main(String[] args) {
tabela("((a && b)||c)");
tabela("a ? (b || c) : (b && c)");
tabela("(a?1:0) + (b?1:0) + (c?1:0) >= 2");
}
private static void tabela(String expressao) {
System.out.printf(FORMAT, " a ", " b ", " c ", expressao);
System.out.printf(FORMAT, "-----", "-----", "-----", expressao.replaceAll(".", "-"));
try {
for (int i = 0; i < 8; i++) {
boolean a = (i & (1<<2)) != 0;
boolean b = (i & (1<<1)) != 0;
boolean c = (i & (1<<0)) != 0;
boolean r = eval(expressao, a, b, c);
System.out.printf(FORMAT, a, b, c, r);
}
} catch (EvalError ex) {
ex.printStackTrace();
}
System.out.println();
System.out.println();
}
private static boolean eval(String expressao, boolean a, boolean b, boolean c) throws EvalError {
Interpreter inter = new Interpreter();
inter.set("a", a);
inter.set("b", b);
inter.set("c", c);
Object resultado = inter.eval(expressao);
return (Boolean) resultado;
}
}
результаты:
a | b | c | ((a && b)||c)
----- | ----- | ----- | -------------
false | false | false | false
false | false | true | true
false | true | false | false
false | true | true | true
true | false | false | false
true | false | true | true
true | true | false | true
true | true | true | true
a | b | c | a ? (b || c) : (b && c)
----- | ----- | ----- | -----------------------
false | false | false | false
false | false | true | false
false | true | false | false
false | true | true | true
true | false | false | false
true | false | true | true
true | true | false | true
true | true | true | true
a | b | c | (a?1:0) + (b?1:0) + (c?1:0) >= 2
----- | ----- | ----- | --------------------------------
false | false | false | false
false | false | true | false
false | true | false | false
false | true | true | true
true | false | false | false
true | false | true | true
true | true | false | true
true | true | true | true