86cf50a893e438a28e6de533c95e4bcd977d272e
[repair.git] / Repair / RepairCompiler / MCC / IR / ForQuantifier.java
1 package MCC.IR;
2
3 import java.util.*;
4
5 public class ForQuantifier extends Quantifier {
6
7     VarDescriptor var = null;
8     Expr lower = null;
9     Expr upper = null;
10
11     public ForQuantifier() {}
12
13     public void setVar(VarDescriptor vd) {
14         this.var = vd;
15     }
16
17     public VarDescriptor getVar() {
18         return var;
19     }
20
21
22     public void setBounds(Expr lower, Expr upper) {
23         this.lower = lower;
24         this.upper = upper;
25     }
26
27     public Set getRequiredDescriptors() {
28         HashSet set=new HashSet();
29         set.addAll(lower.getRequiredDescriptors());
30         set.addAll(upper.getRequiredDescriptors());
31         return set;
32     }
33
34     public String toString() {
35         return "for quantifier " + var.getSymbol() + " = " + lower.name() + " to " + upper.name();
36     }
37
38     public void generate_open(CodeWriter writer) {
39         VarDescriptor ld = VarDescriptor.makeNew();
40         VarDescriptor ud = VarDescriptor.makeNew();
41         lower.generate(writer, ld);
42         upper.generate(writer, ud);
43         
44         writer.outputline("for (int " + var.getSafeSymbol() + " = " + ld.getSafeSymbol() + "; " + var.getSafeSymbol() + " <= " + ud.getSafeSymbol() + "; " + var.getSafeSymbol() + "++)");
45         writer.startblock();
46     }
47
48     public int generate_worklistload(CodeWriter writer, int offset) {        
49         String varname = var.getSafeSymbol();
50         writer.outputline("int " + varname + " = wi->word" + offset + ";"); 
51         return offset + 1;       
52     }
53
54     public int generate_workliststore(CodeWriter writer, int offset) {        
55         String varname = var.getSafeSymbol();
56         writer.outputline("wi->word" + offset + " = " + varname + ";");
57         return offset + 1;       
58     }
59
60
61     public boolean typecheck(SemanticAnalyzer sa) {
62         TypeDescriptor lt = lower.typecheck(sa);
63         TypeDescriptor ut = upper.typecheck(sa);
64         
65         if (lt == null || ut == null) {
66             return false;
67         }
68
69         boolean ok = true;
70
71         if (lt != ReservedTypeDescriptor.INT) {
72             sa.getErrorReporter().report(null, "Lower bound of for quantifier must be of type 'int'");
73             ok = false;
74         }
75
76         if (ut != ReservedTypeDescriptor.INT) {
77             sa.getErrorReporter().report(null, "Upper bound of for quantifier must be of type 'int'");
78             ok = false;
79         }
80
81         return ok;       
82     } 
83
84 }
85
86
87
88
89
90
91
92
93
94