5 public class LogicStatement {
7 public static final Operation AND = new Operation("AND");
8 public static final Operation OR = new Operation("OR");
9 public static final Operation NOT = new Operation("NOT");
11 public Set getInversedRelations() {
13 throw new IRException();
16 Set set = left.getInversedRelations();
18 set.addAll(right.getInversedRelations());
23 public static class Operation {
24 private final String name;
25 private Operation(String opname) { name = opname; }
26 public String toString() { return name; }
33 public LogicStatement(Operation op, LogicStatement left, LogicStatement right) {
35 throw new IllegalArgumentException("Must be a AND or OR expression.");
43 public LogicStatement(Operation op, LogicStatement left) {
45 throw new IllegalArgumentException("Must be a NOT expression.");
53 protected LogicStatement() {
59 public Set getRequiredDescriptors() {
60 Set v = left.getRequiredDescriptors();
62 v.addAll(right.getRequiredDescriptors());
67 public void generate(CodeWriter writer, VarDescriptor dest) {
69 writer.outputline("int " + dest.getSafeSymbol() + ";");
73 VarDescriptor leftd = VarDescriptor.makeNew("leftboolean");
74 left.generate(writer, leftd);
76 writer.outputline("// 3-valued NOT");
77 writer.outputline("if (!maybe)");
79 writer.outputline(dest.getSafeSymbol() + " = !" + leftd.getSafeSymbol() + ";");
82 } else { // two operands
84 VarDescriptor leftd = VarDescriptor.makeNew("leftboolean");
85 String lm = (VarDescriptor.makeNew("leftmaybe")).getSafeSymbol();
86 left.generate(writer, leftd);
87 writer.outputline("int " + lm + " = maybe;");
89 VarDescriptor rightd = VarDescriptor.makeNew("rightboolean");
90 String rm = (VarDescriptor.makeNew("rightmaybe")).getSafeSymbol();
92 right.generate(writer, rightd);
93 writer.outputline("int " + rm + " = maybe;");
95 String l = leftd.getSafeSymbol();
96 String r = rightd.getSafeSymbol();
123 * M = (L*RM) + (R*LM) + (LM*RM)
127 // maybe = (l && rm) || (r && lm) || (lm && rm)
128 writer.outputline("maybe = (" + l + " && " + rm + ") || (" + r + " && " + lm + ") || (" + lm + " && " + rm + ");");
129 writer.outputline(dest.getSafeSymbol() + " = " + l + " && " + r + ";");
131 } else if (op == OR) {
156 * M = (!L*RM) + (!R*LM) + (LM*RM)
160 // maybe = (!l && rm) || (!r && lm) || (lm && rm)
161 writer.outputline("maybe = (!" + l + " && " + rm + ") || (!" + r + " && " + lm + ") || (" + lm + " && " + rm + ");");
162 writer.outputline(dest.getSafeSymbol() + " = " + l + " || " + r + ";");
164 throw new IRException();