2

我正在寻找一种表示布尔代数的解决方案。假设我有很多要向用户显示的 String 对象。他现在可以多选它们(&& AND在它们之间建立联系),也可以|| OR建立联系。最后的表达式也应该显示给用户。

因此,例如,如果他选择String1, String2, String3我要呈现String1 && String2 && String3。也许稍后用户应该能够构建像(String1 || String 2) && String 3.

我的问题是:如何跟踪字符串对象之间这些布尔选择的引用?当然我可以只创建一个字符串表达式;并始终附加他选择的内容。但是如果他取消选择一个对象呢?然后我将不得不解析整个字符串并重新评估它。

我正在寻找一些东西来保持AND/OR对象之间的引用,然后有一种方法来基于这些构建 String 最终表达式。

欢迎任何想法!

4

2 回答 2

2

听起来你只需要一个树结构。每个内部节点代表一个运算符(&&||等),每个叶节点代表一个术语。


参见:抽象语法树

于 2013-01-16T10:32:41.463 回答
2

您可以通过词法分析来做到这一点。Java 有许多词法生成器,例如:JavaCC、JLex 等。

或者,您可以使用诸如前置/后置计算器或堆栈计算器之类的东西来平衡括号并维护层次结构,最初它是通过遍历“树”并在该计算器中代替“1”-“9”数字来完成的(以字符串形式出现)您必须匹配“true”或“false”,而不是“+”、“-”二元运算符,您必须匹配并操作“and”和“or”!

正如我在之前的评论中所承诺的那样,我已经制作了一个布尔代数解析器,我认为它有效,也欢迎您分叉和贡献: https ://github.com/sadaf2605/Java-Boolean-Algebra-Parser

代码:

public class BooleanAlgebra {

    static final String CONST_and="And";
    static final String CONST_or="Or";
    static final String CONST_true="True";
    static final String CONST_false="False";


    public static void main(String[] args) {

        System.out.println(booleanAlgebra("False")==false);
        System.out.println(booleanAlgebra("True")==true);

        System.out.println(booleanAlgebra("False And False")==false);
        System.out.println(booleanAlgebra("True And False")==false);
        System.out.println(booleanAlgebra("True And True")==true);
        System.out.println(booleanAlgebra("False And True")==false);

        System.out.println(booleanAlgebra("(False And True)")==false);
        System.out.println(booleanAlgebra("True Or (False And True)")==true);
        System.out.println(booleanAlgebra("(True And False) And (False And True) Or True")==true);

        System.out.println(booleanAlgebra("( (True And False) Or True )")==true);

        System.out.println(booleanAlgebra("( False Or (True And (False Or True)) Or True )")==true);




    }




    static boolean booleanAlgebra(String str){
        return TrueFalse(str, false, "Or");
    }


     static boolean TrueFalse(String s,boolean b, String op){
        boolean btemp=false;
        s=s.replaceAll(" ", "");

        while(!s.isEmpty()){

            if(s.startsWith(CONST_true)){
                btemp=true;
                s=s.substring(4);
            }else if(s.startsWith(CONST_false)){
                btemp=false;
                s=s.substring(5);
            }else if(s.startsWith(CONST_and)){
                op=CONST_and;
                s=s.substring(3);
            }else if(s.startsWith(CONST_or)){
                op=CONST_or;
                s=s.substring(2);
            }else if(s.startsWith("(")){
                int end=s.indexOf(")");
                if(end>0){
                b=TrueFalse(s.substring(1, end>-1?end:1),b,op);
                s=s.substring(end);
                }
            }else{
                s=s.substring(1);
            }
            if (op.equals(CONST_and)){
                b=b&&btemp;

            }else if(op.equals(CONST_or)){
                b=b||btemp;
            }   
        }
        return b;   
    }
}
于 2013-01-16T10:50:39.263 回答