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教程 。

最好的祝福