我想编写一个Java解析器,将非标准格式(NSF)布尔函数转换为标准格式(SF)。
NSF的例子:
A * B + D (A + B) C + A * B (A * B '+ A + B) D
要将NSF添加到SF,必须将括号相乘。来自上述函数的SF如下所示:A*B + D*A*C + D*B*C + A*B*A*B'*D + A*B*A*D + A*B*B*D
有没有人知道如何实现这个?
谢谢
答案 0 :(得分:2)
您必须完成4个步骤才能达到目的:
1)使用“标准”(与你的术语无关)解析技术解析表达式,并产生相当于表示(解析)表达式的布尔表达式树。
2)将布尔代数规则应用于表达式树,将其从您不想要的表示转换为您所做的那个。你的“标准形式”似乎是联合正常形式(CNF),所以你需要分配法律代数规则来“乘以”产品而不是总和(例如,a *(b + c)),以“摆脱括号”< / p>
3)然后,您需要应用一些简化规则(例如,包含,取消)以消除多余的术语,例如,a * b + a * b + c ==&gt; a * b [a * b * c包含],a * b * a'+ b * c ==&gt; b * c [a * .. a'取消'。这只是更多的代数规则。
4)PrettyPrint以人类可读的格式生成的代数项。
您可以通过以下方式编写所有这些:A)临时手动编码递归下降解析和ad hoc规则应用程序和漂亮打印,或者B)您可以获得解析器生成器(ANTLR很好)来执行解析,并执行规则操作通过ad hoc方法和prettyprint使用一些帮助,比如字符串模板,或者C)你可以得到一个工具来解析,构建树,应用你定义的代数规则,并内置漂亮印刷。
我们的DMS Software Reengineering Toolkit可以很好地处理案例C.您可以看到example of applying standard algebra rules that is a direct analog to your problem。
其中一个难以解决的问题是在代数中处理关联性和交换性,例如,知道A * B * A'是“false”是代数规则X * X'=&gt的结果;是的,但你不能直接检查代数规则中的模式。您必须应用代数规则来计算传播性。关联性的相同论点。如果你声明适当的运算符来拥有这些属性,那么DMS做得很好的一件事就是为你处理。您可以在示例中看到这一点。
唉,不是用Java编写的。