Checking in specs
[repair.git] / Repair / RepairCompiler / MCC / IR / LogicStatement.java
index 9c3a1ed335e7a46e4796fb4449bfcd77b6da8877..f31c81555df7aa7ac9c1a683620e51c77967ed12 100755 (executable)
@@ -8,11 +8,20 @@ public class LogicStatement {
     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());
@@ -20,6 +29,34 @@ public class LogicStatement {
         return set;
     }
     
+    public TypeDescriptor typecheck(SemanticAnalyzer sa) {
+       TypeDescriptor lt=left.typecheck(sa);
+       if (lt!=ReservedTypeDescriptor.INT)
+           return null;
+       TypeDescriptor rt;
+       if (op!=NOT) {
+           rt=right.typecheck(sa);
+           if (rt!=ReservedTypeDescriptor.INT)
+               return null;
+       }
+       return ReservedTypeDescriptor.INT;
+    }
+
+    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; }
@@ -74,7 +111,7 @@ public class LogicStatement {
             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();
@@ -85,7 +122,7 @@ public class LogicStatement {
             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;
@@ -120,7 +157,7 @@ public class LogicStatement {
                  * 1110  1 X
                  * 1111  1 X
                  *
-                 * M = (L*RM) + (R*LM) + (LM*RM)                 
+                 * M = (L*RM) + (R*LM) + (LM*RM)
                  * O = (L*R)
                  */