jav*_*y79 18 java parsing boolean-expression
是否有任何java库或技术来逐步解析布尔表达式?
我的意思是给出一个这样的表达式:
T && ( F || ( F && T ) )
它可以分解为一个表达式树来显示哪个令牌导致'F'值,就像这样(可能是这样的):
T && <- rhs false
( F || <- rhs false
( F && T ) <- eval, false
)
Run Code Online (Sandbox Code Playgroud)
我试图将布尔表达式评估传达给非程序员.我和Anlr在一起,但是我无法做到这一点(似乎有一点学习曲线).
我并不反对自己写,但我宁愿不重新发明轮子.
Jea*_*ana 11
我用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 ();
}
}
Run Code Online (Sandbox Code Playgroud)
这是输出:
评价序列为:T &&(F ||(F && T))
(F && T)= false
(F ||(F && T)= false)= false
(T &&(F ||(F && T)=假)=假)=假评估顺序为:(T && T)|| (F && T)
(T && T)=真
(F && T)=假
((T && T)=真||(F && T)=假)=真
Dev*_*Dev 10
你可以用MVEL或JUEL做到这一点.两者都是表达式语言库,下面的示例使用MVEL.
例:
System.out.println(MVEL.eval("true && ( false || ( false && true ) )"));
Run Code Online (Sandbox Code Playgroud)
打印:错误
如果您真的想要使用'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));
Run Code Online (Sandbox Code Playgroud)
打印:错误
小智 6
我最近专门用Java 编写了一个库来操作布尔表达式:jbool_expressions.
它包含一个工具,也解析了字符串输入中的表达式:
Expression<String> expr = ExprParser.parse("( ( (! C) | C) & A & B)")
Run Code Online (Sandbox Code Playgroud)
您还可以进行一些相当简单的简化:
Expression<String> simplified = RuleSet.simplify(expr);
System.out.println(expr);
Run Code Online (Sandbox Code Playgroud)
给
(A & B)
Run Code Online (Sandbox Code Playgroud)
如果您想逐步完成任务,可以逐个分配值.对于这里的例子,
Expression<String> halfAssigned = RuleSet.assign(simplified, Collections.singletonMap("A", true));
System.out.println(halfAssigned);
Run Code Online (Sandbox Code Playgroud)
节目
B
Run Code Online (Sandbox Code Playgroud)
你可以通过分配B.来解决它.
Expression<String> resolved = RuleSet.assign(halfAssigned, Collections.singletonMap("B", true));
System.out.println(resolved);
Run Code Online (Sandbox Code Playgroud)
节目
true
Run Code Online (Sandbox Code Playgroud)
不是100%你所要求的,但希望它有所帮助.
| 归档时间: |
|
| 查看次数: |
24769 次 |
| 最近记录: |