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 String name() {
13 return "!"+left.name();
14 String name=left.name();
15 name+=" "+op.toString()+" ";
21 public Set getInversedRelations() {
23 throw new IRException();
25 Set set = left.getInversedRelations();
27 set.addAll(right.getInversedRelations());
32 public TypeDescriptor typecheck(SemanticAnalyzer sa) {
33 TypeDescriptor lt=left.typecheck(sa);
34 if (lt!=ReservedTypeDescriptor.INT)
38 rt=right.typecheck(sa);
39 if (rt!=ReservedTypeDescriptor.INT)
42 return ReservedTypeDescriptor.INT;
45 public DNFConstraint constructDNF() {
47 DNFConstraint leftd=left.constructDNF();
48 DNFConstraint rightd=right.constructDNF();
49 return leftd.and(rightd);
51 DNFConstraint leftd=left.constructDNF();
52 DNFConstraint rightd=right.constructDNF();
53 return leftd.or(rightd);
55 DNFConstraint leftd=left.constructDNF();
57 } else throw new Error();
60 public static class Operation {
61 private final String name;
62 private Operation(String opname) { name = opname; }
63 public String toString() { return name; }
70 public LogicStatement(Operation op, LogicStatement left, LogicStatement right) {
72 throw new IllegalArgumentException("Must be a AND or OR expression.");
80 public LogicStatement(Operation op, LogicStatement left) {
82 throw new IllegalArgumentException("Must be a NOT expression.");
90 protected LogicStatement() {
96 public Set getRequiredDescriptors() {
97 Set v = left.getRequiredDescriptors();
99 v.addAll(right.getRequiredDescriptors());
104 public void generate(CodeWriter writer, VarDescriptor dest) {
106 writer.addDeclaration("int", dest.getSafeSymbol());
110 VarDescriptor leftd = VarDescriptor.makeNew("leftboolean");
111 left.generate(writer, leftd);
113 writer.outputline("/* 3-valued NOT*/");
114 // writer.outputline("if (!maybe)"); //this isn't really necessary
116 writer.outputline(dest.getSafeSymbol() + " = !" + leftd.getSafeSymbol() + ";");
119 } else { // two operands
121 VarDescriptor leftd = VarDescriptor.makeNew("leftboolean");
122 String lm = (VarDescriptor.makeNew("leftmaybe")).getSafeSymbol();
123 left.generate(writer, leftd);
124 writer.addDeclaration("int", lm);
125 writer.outputline(lm + " = maybe;");
126 writer.outputline("maybe=0;");
127 VarDescriptor rightd = VarDescriptor.makeNew("rightboolean");
128 String rm = (VarDescriptor.makeNew("rightmaybe")).getSafeSymbol();
129 assert right != null;
130 right.generate(writer, rightd);
131 writer.addDeclaration("int", rm);
132 writer.outputline(rm + " = maybe;");
134 String l = leftd.getSafeSymbol();
135 String r = rightd.getSafeSymbol();
162 * M = (L*RM) + (R*LM) + (LM*RM)
166 // maybe = (l && rm) || (r && lm) || (lm && rm)
167 writer.outputline("maybe = (" + l + " && " + rm + ") || (" + r + " && " + lm + ") || (" + lm + " && " + rm + ");");
168 writer.outputline(dest.getSafeSymbol() + " = " + l + " && " + r + ";");
170 } else if (op == OR) {
195 * M = (!L*RM) + (!R*LM) + (LM*RM)
199 // maybe = (!l && rm) || (!r && lm) || (lm && rm)
200 writer.outputline("maybe = (!" + l + " && " + rm + ") || (!" + r + " && " + lm + ") || (" + lm + " && " + rm + ");");
201 writer.outputline(dest.getSafeSymbol() + " = " + l + " || " + r + ";");
203 throw new IRException();