Added:
[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 void generate_open(CodeWriter writer, String type,int number, String
49 left,String right) {
50         generate_open(writer);
51     }
52
53     public int generate_worklistload(CodeWriter writer, int offset) {        
54         String varname = var.getSafeSymbol();
55         writer.outputline("int " + varname + " = wi->word" + offset + ";"); 
56         return offset + 1;       
57     }
58
59     public int generate_workliststore(CodeWriter writer, int offset) {        
60         String varname = var.getSafeSymbol();
61         writer.outputline("wi->word" + offset + " = " + varname + ";");
62         return offset + 1;       
63     }
64
65
66     public boolean typecheck(SemanticAnalyzer sa) {
67         TypeDescriptor lt = lower.typecheck(sa);
68         TypeDescriptor ut = upper.typecheck(sa);
69         
70         if (lt == null || ut == null) {
71             return false;
72         }
73
74         boolean ok = true;
75
76         if (lt != ReservedTypeDescriptor.INT) {
77             sa.getErrorReporter().report(null, "Lower bound of for quantifier must be of type 'int'");
78             ok = false;
79         }
80
81         if (ut != ReservedTypeDescriptor.INT) {
82             sa.getErrorReporter().report(null, "Upper bound of for quantifier must be of type 'int'");
83             ok = false;
84         }
85
86         return ok;       
87     } 
88
89 }
90
91
92
93
94
95
96
97
98
99