在Java中计算布尔值

在Java中计算布尔值,java,eval,Java,Eval,我试图从字符串中计算以下内容 boolean value = evaluate("false || true && true && false || true"); 我需要为这一个获取布尔值true。 关于如何以最有效的方式解决这个问题,您有什么想法吗?您需要一个小型布尔表达式语法。一点递归解析就可以了 如果您不知道如何编写这样的解析器,可以使用JavaCC或类似的工具。可以使用ParserGenerator来定义语法 但是,如果您只得到| |和&&as运算符以

我试图从字符串中计算以下内容

boolean value = evaluate("false || true && true && false || true");
我需要为这一个获取布尔值
true


关于如何以最有效的方式解决这个问题,您有什么想法吗?

您需要一个小型布尔表达式语法。一点递归解析就可以了


如果您不知道如何编写这样的解析器,可以使用JavaCC或类似的工具。

可以使用ParserGenerator来定义语法

但是,如果您只得到| |和&&as运算符以及true和false as值,那么您可以通过实现一个非常简单的有限状态机,轻松完成这项工作:

1.)将字符串拆分为标记

2.)使用Boolean.parseBoolean(标记)解析最左边的值,并在某个实例变量(您的状态)中保护它的值

3.)使用给定运算符将实例变量与下一个布尔标记组合

4.)重复步骤3,直到完成整个字符串

虽然我还没有彻底测试过,但这似乎有效:)

公共类BooleanFSParser{
私有布尔解析(字符串数据){
字符串[]标记=data.split(\\s”);
布尔状态=boolean.parseBoolean(标记[0]);

对于(int i=1;i而言,如果唯一的运算符是
&&
|
,那么我认为这将起作用:

  static boolean eval(String str) {
    String s = str.replaceAll("\\s|\\|\\|false|false\\|\\|", "");
    return !s.contains("false") || s.contains("||true");
  }
对于更复杂的表达式,我只找到了它。
不知道效率有多高。

看看这个问题:thanx Thierry,现在就来看看。@Thierry我认为这不是加载整个Intepreterd的最有效的方法,不要使用公认的答案方法。看看下一个(投票方面)我认为它很好地总结了您的可能性,但它没有直接回答您的问题;-)您的字符串是否可以包含括号和其他运算符,如^or!?谢谢@aioobe,这很好,因为不需要第三方库。您可以通过打破它来优化外部循环(使用while代替for,或在for末尾使用break)一旦结果是真的:它就不可能变成假的again@Thierry,当然。使用正则表达式进行拆分也不是最有效的解决方案:P@aioobe这是否意味着?@c0mrade
result=result | b
…类似于
i+=5
,但使用或代替加号。
String value = ("false || true && true && false || true");
boolean result = false;
for (String conj : value.split("\\|\\|")) {
    boolean b = true;
    for (String litteral : conj.split("&&"))
        b &= Boolean.parseBoolean(litteral.trim());
    result |= b;
}
System.out.println(result); // prints true
  static boolean eval(String str) {
    String s = str.replaceAll("\\s|\\|\\|false|false\\|\\|", "");
    return !s.contains("false") || s.contains("||true");
  }