public static final Operation OR = new Operation("OR");
public static final Operation NOT = new Operation("NOT");
+ public String name() {
+ if (op==NOT)
+ return "!"+left.name();
+ String name=left.name();
+ name+=" "+op.toString()+" ";
+ if (right!=null)
+ name+=right.name();
+ return name;
+ }
+
public Set getInversedRelations() {
if (left == null) {
throw new IRException();
}
-
Set set = left.getInversedRelations();
if (right != null) {
set.addAll(right.getInversedRelations());
return set;
}
+ public DNFConstraint constructDNF() {
+ if (op==AND) {
+ DNFConstraint leftd=left.constructDNF();
+ DNFConstraint rightd=right.constructDNF();
+ return leftd.and(rightd);
+ } else if (op==OR) {
+ DNFConstraint leftd=left.constructDNF();
+ DNFConstraint rightd=right.constructDNF();
+ return leftd.or(rightd);
+ } else if (op==NOT) {
+ DNFConstraint leftd=left.constructDNF();
+ return leftd.not();
+ } else throw new Error();
+ }
+
public static class Operation {
private final String name;
private Operation(String opname) { name = opname; }
left.generate(writer, leftd);
writer.outputline("// 3-valued NOT");
- writer.outputline("if (!maybe)");
+ // writer.outputline("if (!maybe)"); //this isn't really necessary
writer.startblock();
writer.outputline(dest.getSafeSymbol() + " = !" + leftd.getSafeSymbol() + ";");
writer.endblock();
String lm = (VarDescriptor.makeNew("leftmaybe")).getSafeSymbol();
left.generate(writer, leftd);
writer.outputline("int " + lm + " = maybe;");
-
+ writer.outputline("maybe=0;");
VarDescriptor rightd = VarDescriptor.makeNew("rightboolean");
String rm = (VarDescriptor.makeNew("rightmaybe")).getSafeSymbol();
assert right != null;
* 1110 1 X
* 1111 1 X
*
- * M = (L*RM) + (R*LM) + (LM*RM)
+ * M = (L*RM) + (R*LM) + (LM*RM)
* O = (L*R)
*/