复合命题的绘制电路

时间:2015-07-12 10:13:15

标签: java diagram boolean-expression

我想用括号解决一个复合命题并为它绘制电路。

我的问题是我不知道哪种算法是正确的算法。我尝试了抽象语法树,但没有结论。 也许反向波兰表示法是用括号解决复合命题的正确方法,但我应该在每个级别绘制一个电路,反向波兰表示法只是给出最终答案。

示例:

Example

**我想的方式**

The way i think about it

1 个答案:

答案 0 :(得分:0)

我会按如下方式分解您的问题:

  • 编写可以将表达式解析为AST的代码。
  • 编写代码以绘制给定最小AST节点的每个电路符号:来自~AA|BA&BA^B的NOT,OR,AND,XOR,分别
  • 编写代码以绘制整个解析树。

您的AST节点可能如下所示:

 public interface CircuitNode {
     // parsing-related
     String getExpression();      
     List<String> getInputNames();
     List<CircuitNode> getChildren();      
     String getOutputName();

     // drawing-related; call children to compute things and draw children
     int calculateHeight();
     int calculateWidth();
     void draw(Graphics2D g, int x, int y);

     // simulate circuit, if you need it 
     boolean simulate(boolean[] inputs);
 }

如果您遵循分解步骤,您将首先实现CircuitNode接口的解析相关部分(无需绘图)。然后,您将尝试draw个简单节点(那些不包含其他节点的节点),这将返回例如100 calculateWidth和50 calculateHeight。最后,您将尝试使用calculateHeightcalculateWidthdraw的实现来绘制更大的表达式,这些实现将使用递归来绘制多节点电路。