/* Build Object */ ClassStatement* buildObject() { FeatureList* methods = new FeatureList(); methods->add(new FeatureOption(new FormalDeclare(new Id(new string("vtable")), new Type(new string("Int64"))))); methods->add(new FeatureOption(new Feature(new Id(new string("abort")), new ListFormalDeclare(), new Type(new string("Object")), new ExprList()))); methods->add(new FeatureOption(new Feature(new Id(new string("type_name")), new ListFormalDeclare(), new Type(new string("SELF_TYPE")), new ExprList()))); methods->add(new FeatureOption(new Feature(new Id(new string("copy")), new ListFormalDeclare(), new Type(new string("SELF_TYPE")), new ExprList()))); return new ClassStatement(new Type(new string("Object")), nullptr, methods); }
ClassStatement* buildIO() { FeatureList* methods = new FeatureList(); ListFormalDeclare* outStringList = new ListFormalDeclare(); ListFormalDeclare* outIntList = new ListFormalDeclare(); outStringList->add(new FormalDeclare(new Id(new string("x")), new Type(new string("String")), nullptr)); outIntList->add(new FormalDeclare(new Id(new string("x")), new Type(new string("Int")), nullptr)); methods->add(new FeatureOption(new Feature(new Id(new string("out_string")), outStringList, new Type(new string("SELF_TYPE")), new ExprList()))); methods->add(new FeatureOption(new Feature(new Id(new string("out_int")),outIntList, new Type(new string("SELF_TYPE")), new ExprList()))); methods->add(new FeatureOption(new Feature(new Id(new string("in_string")), new ListFormalDeclare(), new Type(new string("String")), new ExprList()))); methods->add(new FeatureOption(new Feature(new Id(new string("in_int")), new ListFormalDeclare(), new Type(new string("Int")), new ExprList()))); return new ClassStatement(new Type(new string("IO")), new Type(new string("Object")), methods); }
ClassStatement* buildString() { FeatureList* methods = new FeatureList(); ListFormalDeclare* concatParam = new ListFormalDeclare(); ListFormalDeclare* substrParam = new ListFormalDeclare(); concatParam->add(new FormalDeclare(new Id(new string("s")), new Type(new string("String")), nullptr)); substrParam->add(new FormalDeclare(new Id(new string("i")), new Type(new string("Int")), nullptr)); substrParam->add(new FormalDeclare(new Id(new string("l")), new Type(new string("Int")), nullptr)); methods->add(new FeatureOption(new FormalDeclare(new Id(new string("theString")), new Type(new string("Bool"))))); methods->add(new FeatureOption(new Feature(new Id(new string("length")), new ListFormalDeclare(), new Type(new string("Int")), new ExprList()))); methods->add(new FeatureOption(new Feature(new Id(new string("concat")), concatParam, new Type(new string("String")), new ExprList()))); methods->add(new FeatureOption(new Feature(new Id(new string("substr")), substrParam, new Type(new string("String")), new ExprList()))); return new ClassStatement(new Type(new string("String")), new Type(new string("Object")), methods, true); }
ClassStatement* buildConvert() { FeatureList* methods = new FeatureList(); const char * const types[] = { "Int", "Int64", "Int32", "Int8", "Float" }; for(string type : types) { methods->add(buildConvertFunc(type)); } return new ClassStatement(new Type(new string("Convert")), new Type(new string("Object")), methods, true); }