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