оценивать логические значения в Java - PullRequest
6 голосов
/ 04 июня 2010

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

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

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

Ответы [ 4 ]

7 голосов
/ 04 июня 2010
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
1 голос
/ 04 июня 2010

Если единственными операторами являются && и ||, то я думаю, что это будет работать:

  static boolean eval(String str) {
    String s = str.replaceAll("\\s|\\|\\|false|false\\|\\|", "");
    return !s.contains("false") || s.contains("||true");
  }

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

0 голосов
/ 04 июня 2010

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

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

1.) Разбейте строку на токены

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

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

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

повеселись и проверь здесь теорию Конечнозонный state_machine

0 голосов
/ 04 июня 2010

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

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

...