在java中将非标准表单解析为标准表单



我想编写一个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

有人知道我该如何实现吗?

感谢

你必须完成4个步骤才能达到目的:

1) 使用"标准"(与术语无关)解析技术解析表达式,并生成表示(解析的)表达式的布尔表达式树。

2) 将布尔代数规则应用于表达式树,将其从你不想要的表示转换为你想要的表示。你的"标准形式"似乎是连接范式(CNF),所以你需要分配律代数规则来"乘出"和上的乘积(例如,a*(b+c)),以"去掉括号"

3) 然后,您需要应用一些简化规则(例如,包含、取消)来消除多余的项,例如,a*b+a*b+c=>a*b[a*b*c包含],以及a*b*a'+b*c==>b*c[a*..a'取消]。这只是更多的代数规则。

4) Pretty以可读的格式打印生成的代数术语。

你可以通过A)特别手工编码的递归下降解析、特别规则应用和预打印来完成这一切,或者B)你可以得到一个解析器生成器(ANTLR很好)来进行解析,通过特别方法进行规则操作,并使用一些帮助(如字符串模板)预打印,或者C)你可以获得一个进行解析、构建树、应用你定义的代数规则的工具,并内置了预打印功能。

我们的DMS软件重组工具包可以很好地完成案例C。你可以看到一个应用标准代数规则的例子,它直接类似于你的问题。

其中一个很难解决的问题是处理代数中的结合性和交换性,例如,知道A*B*A'是"false"是代数规则X*X'=>false的结果,但你不能直接检查代数规则中的模式。你必须应用代数规则来解释通用性。关联性的参数相同。DMS做得很好的一件事是,如果您声明适当的运算符具有这些属性,那么它将为您处理这些问题。您可以在示例中看到这一点。

唉,不是用Java编码的。

相关内容

最新更新