java中的布尔expression式分析器
有没有任何Java库或技术来分解布尔expression式零碎?
我的意思是这样的expression:
T && ( F || ( F && T ) )
它可以被分解成一个expression式树来显示哪个标记导致了'F'值,就像这样( 也许是这样的):
T && <- rhs false ( F || <- rhs false ( F && T ) <- eval, false )
我正在尝试将布尔expression式评估传递给非程序员。 我曾与Anlr探讨过,但我无法做到这一点(似乎有一点学习曲线)。
我不反对自己写,但我不想重新发明。
我已经使用Javaluator对此进行了编码。
这不完全是你正在寻找的输出,但我认为这可能是一个起点。
package test; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import net.astesana.javaluator.*; public class TreeBooleanEvaluator extends AbstractEvaluator<String> { /** The logical AND operator.*/ final static Operator AND = new Operator("&&", 2, Operator.Associativity.LEFT, 2); /** The logical OR operator.*/ final static Operator OR = new Operator("||", 2, Operator.Associativity.LEFT, 1); private static final Parameters PARAMETERS; static { // Create the evaluator's parameters PARAMETERS = new Parameters(); // Add the supported operators PARAMETERS.add(AND); PARAMETERS.add(OR); // Add the parentheses PARAMETERS.addExpressionBracket(BracketPair.PARENTHESES); } public TreeBooleanEvaluator() { super(PARAMETERS); } @Override protected String toValue(String literal, Object evaluationContext) { return literal; } private boolean getValue(String literal) { if ("T".equals(literal) || literal.endsWith("=true")) return true; else if ("F".equals(literal) || literal.endsWith("=false")) return false; throw new IllegalArgumentException("Unknown literal : "+literal); } @Override protected String evaluate(Operator operator, Iterator<String> operands, Object evaluationContext) { List<String> tree = (List<String>) evaluationContext; String o1 = operands.next(); String o2 = operands.next(); Boolean result; if (operator == OR) { result = getValue(o1) || getValue(o2); } else if (operator == AND) { result = getValue(o1) && getValue(o2); } else { throw new IllegalArgumentException(); } String eval = "("+o1+" "+operator.getSymbol()+" "+o2+")="+result; tree.add(eval); return eval; } public static void main(String[] args) { TreeBooleanEvaluator evaluator = new TreeBooleanEvaluator(); doIt(evaluator, "T && ( F || ( F && T ) )"); doIt(evaluator, "(T && T) || ( F && T )"); } private static void doIt(TreeBooleanEvaluator evaluator, String expression) { List<String> sequence = new ArrayList<String>(); evaluator.evaluate(expression, sequence); System.out.println ("Evaluation sequence for :"+expression); for (String string : sequence) { System.out.println (string); } System.out.println (); } }
这里是输出:
评估顺序:T &&(F ||(F && T))
(F && T)= false
(F ||(F && T)= false)= false
(T &&(F ||(F && T)= false)= false)= false评估顺序为:(T && T)|| (F && T)
(T && T)= true
(F && T)= false
((T && T)= true ||(F && T)= false)= true
你可以用MVEL或JUEL来做到这一点 。 两者都是expression式语言库,下面的例子使用MVEL。
例:
System.out.println(MVEL.eval("true && ( false || ( false && true ) )"));
打印:错误
如果你真的想用'T'和'F',你可以这样做:
Map<String, Object> context = new java.util.HashMap<String, Object>(); context.put("T", true); context.put("F", false); System.out.println(MVEL.eval("T && ( F || ( F && T ) )", context));
打印:错误
我最近在Java中专门设置了一个库来操作布尔expression式: jbool_expressions 。
它包含了一个工具,它也在stringinput中parsing了expression式:
Expression<String> expr = ExprParser.parse("( ( (! C) | C) & A & B)")
你也可以做一些相当简单的简化:
Expression<String> simplified = RuleSet.simplify(expr); System.out.println(expr);
给
(A & B)
如果您想逐步完成任务,则可以逐个分配值。 对于这里的例子,
Expression<String> halfAssigned = RuleSet.assign(simplified, Collections.singletonMap("A", true)); System.out.println(halfAssigned);
节目
B
你可以通过分配B来解决它。
Expression<String> resolved = RuleSet.assign(halfAssigned, Collections.singletonMap("B", true)); System.out.println(resolved);
节目
true
不是100%你所要求的,但希望它有帮助。
检查BeanShell 。 它具有接受Java类语法的expression式parsing。
编辑:除非你试图实际parsingT && F
字面上,尽pipe你可以在BeanShell中使用文字true
来做到这一点。
mXparser处理布尔运算符 – 请找几个例子
例1:
import org.mariuszgromada.math.mxparser.*; ... ... Expression e = new Expression("1 && (0 || (0 && 1))"); System.out.println(e.getExpressionString() + " = " + e.calculate());
结果1:
1 && (0 || (0 && 1)) = 0.0
例2:
import org.mariuszgromada.math.mxparser.*; ... ... Constant T = new Constant("T = 1"); Constant F = new Constant("F = 0"); Expression e = new Expression("T && (F || (F && T))", T, F); System.out.println(e.getExpressionString() + " = " + e.calculate());
结果2:
T && (F || (F && T)) = 0.0
有关更多详细信息,请按照mXparser教程 。
最好的祝福