}
public void generate_inclusion(CodeWriter writer, VarDescriptor dest, VarDescriptor element) {
- String hash = inverse ? "_hashinv->contains(" : "_hash->contains(" ;
- writer.outputline("int " + dest.getSafeSymbol() + " = " + rd.getSafeSymbol() + hash + vd.getSafeSymbol() + ", " + element.getSafeSymbol() + ");");
+ String hash = inverse ? "_hashinv, " : "_hash, " ;
+ if (!isimageset) {
+ writer.addDeclaration("int", dest.getSafeSymbol());
+ writer.outputline(dest.getSafeSymbol() + " = SimpleHashcontainskeydata(" + rd.getSafeSymbol() + hash + vd.getSafeSymbol() + ", " + element.getSafeSymbol() + ");");
+ } else {
+ VarDescriptor newset=VarDescriptor.makeNew("newset");
+ generate_set(writer,newset);
+ writer.addDeclaration("int", dest.getSafeSymbol());
+ writer.outputline(dest.getSafeSymbol()+"=SimpleHashcontainskey("+newset.getSafeSymbol()+","+element.getSafeSymbol()+");");
+ writer.outputline("freeSimpleHash("+newset.getSafeSymbol()+");");
+ }
}
public void generate_size(CodeWriter writer, VarDescriptor dest) {
assert dest != null;
- assert vd != null;
assert rd != null;
- String hash = inverse ? "_hashinv->count(" : "_hash->count(" ;
- writer.outputline("int " + dest.getSafeSymbol() + " = " + rd.getSafeSymbol() + hash + vd.getSafeSymbol() + ");");
+ if (!isimageset) {
+ String hash = inverse ? "_hashinv, " : "_hash, " ;
+ writer.addDeclaration("int", dest.getSafeSymbol());
+ writer.outputline(dest.getSafeSymbol() + " = SimpleHashcount(" + rd.getSafeSymbol() + hash + vd.getSafeSymbol() + ");");
+ } else {
+ VarDescriptor newset=VarDescriptor.makeNew("newset");
+ generate_set(writer,newset);
+ writer.addDeclaration("int", dest.getSafeSymbol());
+ writer.outputline(dest.getSafeSymbol()+"=SimpleHashcountset("+newset.getSafeSymbol()+");");
+ writer.outputline("freeSimpleHash("+newset.getSafeSymbol()+");");
+ }
+ }
+
+ public void generate_leftside(CodeWriter writer, VarDescriptor dest) {
+ if (!isimageset) {
+ writer.addDeclaration(vd.getType().getGenerateType().toString(), dest.getSafeSymbol());
+ writer.outputline(dest.getSafeSymbol()+" = "+vd.getSafeSymbol()+";");
+ } else {
+ VarDescriptor iseset=VarDescriptor.makeNew("set");
+ ise.generate_set(writer,iseset);
+ writer.addDeclaration("int",dest.getSafeSymbol());
+ writer.outputline(dest.getSafeSymbol()+" = SimpleHashfirstkey("+iseset.getSafeSymbol()+");");
+ writer.outputline("freeSimpleHash("+iseset.getSafeSymbol()+");");
+ }
+ }
+
+ public void generate_set(CodeWriter writer, VarDescriptor dest) {
+ if (!isimageset) {
+ String hash = inverse ? "_hashinv, " : "_hash, " ;
+ writer.addDeclaration("struct SimpleHash *",dest.getSafeSymbol());
+ writer.outputline(dest.getSafeSymbol()+"=SimpleHashimageSet("+rd.getSafeSymbol()+hash+vd.getSafeSymbol()+");");
+ } else {
+ VarDescriptor iseset=VarDescriptor.makeNew("set");
+ ise.generate_set(writer,iseset);
+
+ VarDescriptor itvd=VarDescriptor.makeNew("iterator");
+ writer.addDeclaration("struct SimpleIterator",itvd.getSafeSymbol());
+ writer.outputline("SimpleHashiterator("+iseset.getSafeSymbol()+",&"+itvd.getSafeSymbol()+");");
+ writer.addDeclaration("struct SimpleHash *", dest.getSafeSymbol());
+ writer.outputline(dest.getSafeSymbol()+"=allocateSimpleHash(10);");
+ writer.outputline("while (hasNext(&"+itvd.getSafeSymbol()+")) {");
+
+ VarDescriptor keyvd=VarDescriptor.makeNew("key");
+
+ writer.addDeclaration("int",keyvd.getSafeSymbol());
+ writer.outputline(keyvd.getSafeSymbol()+"=next(&"+itvd.getSafeSymbol()+");");
+ String hash = inverse ? "_hashinv, " : "_hash, " ;
+ VarDescriptor newset=VarDescriptor.makeNew("newset");
+ writer.addDeclaration("struct SimpleHash *", newset.getSafeSymbol());
+ writer.outputline(newset.getSafeSymbol()+"=SimpleHashimageSet("+rd.getSafeSymbol()+hash+keyvd.getSafeSymbol()+");");
+ writer.outputline("SimpleHashaddAll("+dest.getSafeSymbol()+", "+ newset.getSafeSymbol()+");");
+ writer.outputline("freeSimpleHash("+newset.getSafeSymbol()+");");
+ writer.outputline("}");
+ writer.outputline("freeSimpleHash("+iseset.getSafeSymbol()+");");
+ }
}
public void prettyPrint(PrettyPrinter pp) {
- pp.output(vd.toString());
+ if (!isimageset)
+ pp.output(vd.toString());
+ else
+ ise.prettyPrint(pp);
pp.output(".");
if (inverse) {
pp.output("~");
public TypeDescriptor typecheck(SemanticAnalyzer sa) {
throw new IRException("not supported");
}
-
}