5 public class RelationInclusion extends Inclusion {
7 Expr leftelementexpr, rightelementexpr;
8 RelationDescriptor relation;
10 public RelationInclusion(Expr leftelementexpr, Expr rightelementexpr, RelationDescriptor relation) {
11 this.leftelementexpr = leftelementexpr;
12 this.rightelementexpr = rightelementexpr;
13 this.relation = relation;
16 public Set getTargetDescriptors() {
17 HashSet v = new HashSet();
22 public Set getRequiredDescriptors() {
23 Set v = leftelementexpr.getRequiredDescriptors();
24 v.addAll(rightelementexpr.getRequiredDescriptors());
28 public void generate(CodeWriter writer) {
29 VarDescriptor ld = VarDescriptor.makeNew("leftele");
30 leftelementexpr.generate(writer, ld);
31 VarDescriptor rd = VarDescriptor.makeNew("rightele");
32 rightelementexpr.generate(writer, rd);
33 writer.outputline(relation.getSafeSymbol() + "_hash->add((int)" + ld.getSafeSymbol() + ", (int)" + rd.getSafeSymbol() + ");");
34 //writer.outputline("printf(\"" + relation.getSafeSymbol() + " (add): <%d, %d>\\n\", " + ld.getSafeSymbol() + ", " + rd.getSafeSymbol() + ");");
37 public boolean typecheck(SemanticAnalyzer sa) {
38 TypeDescriptor ld = leftelementexpr.typecheck(sa);
39 TypeDescriptor rd = rightelementexpr.typecheck(sa);
41 if (ld == null || rd == null) {
47 if (ld != relation.getDomain().getType()) {
48 sa.getErrorReporter().report(null, "Type of left element '" + ld.getSymbol() + "' must match domain type '" + relation.getDomain().getType().getSymbol() + "'");
52 if (rd != relation.getRange().getType()) {
53 assert rd.getSymbol() != null;
54 assert relation.getRange().getType() != null : relation.getRange().getSymbol();
55 sa.getErrorReporter().report(null, "Type of right element '" + rd.getSymbol() + "' must match range type '" + relation.getRange().getType().getSymbol() + "'");