worklist version
[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 void setBounds(Expr lower, Expr upper) {
18         this.lower = lower;
19         this.upper = upper;
20     }
21
22     public Set getRequiredDescriptors() {
23         return new HashSet();
24     }
25
26     public String toString() {
27         return "for quantifier " + var.getSymbol() + " = " + lower + " to " + upper;
28     }
29
30     public void generate_open(CodeWriter writer) {
31         VarDescriptor ld = VarDescriptor.makeNew();
32         VarDescriptor ud = VarDescriptor.makeNew();
33         lower.generate(writer, ld);
34         upper.generate(writer, ud);
35         
36         writer.outputline("for (int " + var.getSafeSymbol() + " = " + ld.getSafeSymbol() + "; " + var.getSafeSymbol() + " <= " + ud.getSafeSymbol() + "; " + var.getSafeSymbol() + "++)");
37         writer.startblock();
38     }
39
40     public int generate_worklistload(CodeWriter writer, int offset) {        
41         String varname = var.getSafeSymbol();
42         writer.outputline("int " + varname + " = wi->word" + offset + ";"); 
43         return offset + 1;       
44     }
45
46     public int generate_workliststore(CodeWriter writer, int offset) {        
47         String varname = var.getSafeSymbol();
48         writer.outputline("wi->word" + offset + " = " + varname + ";");
49         return offset + 1;       
50     }
51
52
53     public boolean typecheck(SemanticAnalyzer sa) {
54         TypeDescriptor lt = lower.typecheck(sa);
55         TypeDescriptor ut = upper.typecheck(sa);
56         
57         if (lt == null || ut == null) {
58             return false;
59         }
60
61         boolean ok = true;
62
63         if (lt != ReservedTypeDescriptor.INT) {
64             sa.getErrorReporter().report(null, "Lower bound of for quantifier must be of type 'int'");
65             ok = false;
66         }
67
68         if (ut != ReservedTypeDescriptor.INT) {
69             sa.getErrorReporter().report(null, "Upper bound of for quantifier must be of type 'int'");
70             ok = false;
71         }
72
73         return ok;       
74     } 
75
76 }
77
78
79
80
81
82
83
84
85
86