вычисления логических значений в Java

Я пытаюсь оценить следующее из строки

boolean value = evaluate("false || true && true && false || true");

мне нужно получить логическое значение true для этого.
Любые идеи, как решить эту проблему наиболее эффективным способом?

4 ответов


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");
  }

для более сложных выражений, я нашел библиотека только для этого. Не знаю, насколько это эффективно.


вам понадобится небольшая грамматика логических выражений. Немного рекурсивного анализа должно сделать трюк.

Если вы не знаете как написать такой парсер, вы можете использовать JavaCC или что-то подобное.


доступны парсергенераторы, для которых можно определить грамматику.

но если вы получили только операторы || и && as, а также true и false как значения, вы можете легко сделать это самостоятельно, применив очень простую конечную машину:

1.) Разделить строку на токены

2.) проанализируйте левое наибольшее значение с помощью Boolean.parseBoolean (токен) и safe это значение в некоторой переменной экземпляра (ваше состояние)

3.) объедините свой экземпляр переменная со следующим логическим маркером с использованием данного оператора

4.) Повторите шаг 3, пока не закончите через всю строку

это, кажется, работает, хотя я не тестировал его:)

public class BooleanFSParser {

    private boolean parse(String data) {
        String[] tokens=data.split("\s");
        boolean state=Boolean.parseBoolean(tokens[0]);
        for (int i=1;i<(tokens.length / 2) + 1;i=i+2){
            if (tokens[i].equals("&&")){
                state=state && Boolean.parseBoolean(tokens[i+1]);
            }else{
                state=state || Boolean.parseBoolean(tokens[i+1]);
            }
        }
        return state;
    }

    public static void main(String[] args) {
        BooleanFSParser parser = new BooleanFSParser();
        boolean val = parser.parse("true && true || false");
        System.out.println(String.valueOf(val));
    }
}

это должно дать вам значение cirrectly parsed, но оно будет немного сложнее, если вы разрешите скобки, например;)

получайте удовольствие и проверьте здесь теорию конечно-state_machine