您可以通过词法分析来做到这一点。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;
}
}