1052eaa7ced7ea0212621f690e724d0b7d5ff2dd
[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 boolean typecheck(SemanticAnalyzer sa) {
41         TypeDescriptor lt = lower.typecheck(sa);
42         TypeDescriptor ut = upper.typecheck(sa);
43         
44         if (lt == null || ut == null) {
45             return false;
46         }
47
48         boolean ok = true;
49
50         if (lt != ReservedTypeDescriptor.INT) {
51             sa.getErrorReporter().report(null, "Lower bound of for quantifier must be of type 'int'");
52             ok = false;
53         }
54
55         if (ut != ReservedTypeDescriptor.INT) {
56             sa.getErrorReporter().report(null, "Upper bound of for quantifier must be of type 'int'");
57             ok = false;
58         }
59
60         return ok;       
61     } 
62
63 }
64
65
66
67
68
69
70
71
72
73