correct
[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         writer.addDeclaration("int",var.getSafeSymbol());
43         writer.outputline("for (" + 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.addDeclaration("int",varname);
55         writer.outputline(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