编辑代码

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
//error = '0' AND (name ='NE40' OR name ='NE20')
//error = '1' AND (name ='NE40' OR name ='NE20')
public class Main {
    public static void main(String[] args)throws ScriptException {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        scanner.nextLine(); // 消耗换行符

        String[] expressions = new String[n];
        for (int i = 0; i < n; i++) {
            expressions[i] = scanner.nextLine();
        }

        Map<String, String> keyValuePairs = new HashMap<>();
        for (int i = 0; i < m; i++) {
            String key = scanner.next();
            String value = scanner.next();
            keyValuePairs.put(key, value);
        }
        scanner.close();
        
        for (String expression : expressions) {
            int result = evaluateExpression(expression, keyValuePairs);
            System.out.println(result);
        }
    }

    private static int evaluateExpression(String expression, Map<String, String> keyValuePairs)throws ScriptException {
        expression = expression.replaceAll("AND", "&&"); // 移除所有空格
        expression = expression.replaceAll("OR", "||"); // 移除所有空格
        ScriptEngineManager manager = new ScriptEngineManager();  
        ScriptEngine engine = manager.getEngineByName("js"); 
        for (Map.Entry <String, String> entry : keyValuePairs.entrySet()) {
        System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
            engine.put(entry.getKey(),entry.getValue());
        }
        
        
        Object result2 = engine.eval(expression);
        System.out.println(result2);
        return 0;
    }

    private static boolean evaluate(String expression, Map<String, String> keyValuePairs) {
        if (expression.isEmpty()) {
            return false;
        }

        int index = expression.indexOf(')');
        if (index != -1) {
            int startIndex = expression.lastIndexOf('(', index);
            String subExpression = expression.substring(startIndex + 1, index);
            boolean subResult = evaluate(subExpression, keyValuePairs);
            String before = expression.substring(0, startIndex);
            String after = expression.substring(index + 1);
            return evaluate(before + (subResult ? "1" : "0") + after, keyValuePairs);
        }

        String[] parts = expression.split("OR");
        for (String part : parts) {
            if (evaluateAnd(part, keyValuePairs)) {
                return true;
            }
        }
        return false;
    }

    private static boolean evaluateAnd(String expression, Map<String, String> keyValuePairs) {
        String[] conditions = expression.split("AND");
        for (String condition : conditions) {
            if (!evaluateCondition(condition, keyValuePairs)) {
                return false;
            }
        }
        return true;
    }

    private static boolean evaluateCondition(String condition, Map<String, String> keyValuePairs) {
        String[] parts = condition.split("=");
        if (parts.length != 2) {
            return false;
        }
        String key = parts[0];
        String value = parts[1].replaceAll("'", "");
        return keyValuePairs.getOrDefault(key, "").equals(value);
    }
}