From b2142969f87aa071ccfa30b4d9308214f16a574b Mon Sep 17 00:00:00 2001 From: ridethepig Date: Wed, 29 Mar 2023 02:03:47 +0000 Subject: [PATCH] read the doc and format skeleton code --- CS143体验报告.md | 28 + assignments/PA5/cgen.cc | 894 ++++++++++++--------------- assignments/PA5/cgen.h | 109 ++-- assignments/PA5/cgen_supp.cc | 52 +- assignments/PA5/cool-tree.h | 690 ++++++++++----------- assignments/PA5/cool-tree.handcode.h | 99 ++- assignments/PA5/example.cl | 22 +- handouts/cool-runtime.pdf | Bin 0 -> 92761 bytes 8 files changed, 909 insertions(+), 985 deletions(-) create mode 100644 handouts/cool-runtime.pdf diff --git a/CS143体验报告.md b/CS143体验报告.md index 9ea03b1..2bebfec 100644 --- a/CS143体验报告.md +++ b/CS143体验报告.md @@ -234,3 +234,31 @@ PA 2-5 正式写编译器。PA2 写词法分析器,首先读一遍 README 和 - 返回 Object 的情况:objectid 未定义、new 未定义类、函数调用中无法确定被调用函数的情况(类未定义、函数未定义、函数参数个数不对)、loop 返回值。 剩下的基本上能从手册的12章中比较清晰的看出来。 + + +### PA5 + +#### 读文档 + +最后一个 PA,那必然是要把剩下来的文档全部读完。需要预先看一遍带是 `cool-tour.pdf` 的第7章 Runtime System 和 PA5 handout,至于 `cool-manual.pdf` 的第13章语义部分倒是可以一边实现一边看。 + +先看 handout: +- 代码量巨大无比,竟然是 PA4 的2倍(悲 +- 文件简述:`cgen.{cc|hh}` 大部分需要写的代码,和 PA4 类似的结构,从 AST 的根节点开始进行 `cgen`;`cool-tree.h` 和 PA4 类似;`cgen_supp.cc` 定义辅助函数;`emit.h` 里面有一些 MIPS 汇编和符号宏定义;剩下的都是老熟人了。 +- 主要任务: + - 生成全局常量(prototype objects) + - 生成全局表,`class_nameTab` `class_objTab` 还有方法调用表 + - 生成每个类的初始化代码 + - 生成方法定义 + 推荐的实现方法还是分两部分,先生成对象布局,然后第二遍在生成每个表达式的代码。 +- 提醒注意:这次没有必要去“逆向”参考编译器了,因为它实现了一些高级功能比如寄存器分配优化,这个 PA5 并不要求这个。 +- 运行时错误处理:manual 规定了6种运行时错误,生成的代码需要检测三种:(static) dispatch on void, case on void, missing branch;除零可以交给模拟器;剩下两种由 Runtime 处理。 +- GC:有一个3个命令行开关控制垃圾回收系统相关的功能。默认情况下不打开 `-g` 开关,此时不启用 GC,也就是说这是一个选做功能;`-t` 迫使 GC 系统在每次分配对象的时候进行回收;`-T` 的功能交给实现,可能会用来实现一些其他的运行时检查。实现 GC 功能的时候,需要认真阅读 Runtime 手册相关内容。这里可以去看看 CS143 课程网站上的那个单独的 `cool-runtime.pdf`,似乎写的更加详细一些。 +- 测试工具:和 PA4 类似,提供了一个 `-c` 选项来设置全局变量 `cgen_debug`。同时提供了一个第三方实现的 `Coolaid` 工具对生成的 MIPS 汇编进行一些检查,说不定会有帮助。最后关于 `Spim` 的 warning 可能会有用。 + +然后看看 Runtime System: +- 首先是对象布局:GC Tag 设为-1;Object Size 也得填上;dispatch pointer 因为不会被 runtime 用到,所以需要自己设计 dispatch 表;对于属性,`Int` 只有一个32位整数、`Bool` 也是如此、`String` 有一个32位的长度+后面全部是 ASCII 字节(最后需要 word 对齐),然后还有空指针 void。 +- 然后是一个叫原型对象(Prototype Object)的东西:COOL 里面新建对象的方法是使用 `Object.copy()`,因此我们需要生成这些供其复制的东西,也就是 prototype object。生成的时候需要正确设置前面的头部,对于属性,三个基本类型有自己的规定,其余类型的属性随意设置。 +- 栈和寄存器约定:方法调用参数放在栈上、从左到右依次压栈,`a0` 寄存器里面放 `self` 对象指针。指定了一组 Scratch registers 供 runtime routine 存放临时数据,因此需要调用者保存;还有堆指针和堆界限两个寄存器,完全由 runtime 控制。其他的都可以用。 +- Label:生成的代码需要和 runtime 一起变成最后执行的机器码,因此有一些 label 是指定的,就类似于接口一样的东西。有些 label 是 runtime 提供给我们使用的,也有一些需要我们生成供 runtime 使用。有一句话 `There is no need for code that initializes an object of class Bool if the generated code contains definitions of both Bool objects in the static data area.` 没看懂 +- 执行初始化:需要生成一些代码来调用 main 方法。首先通过 Main prototype 生成一个 Main 类的对象并用 `Main_init` 初始化,该初始化方法依次执行 Main 的基类的初始化最后初始化 Main;然后调用 `Main.main`,在 `a0` 里面放上 `Main` 的指针并设置 `ra`;执行结束后,`Main.main` 返回,这里打印出提示信息并终止执行。 diff --git a/assignments/PA5/cgen.cc b/assignments/PA5/cgen.cc index 08b4220..45624d8 100644 --- a/assignments/PA5/cgen.cc +++ b/assignments/PA5/cgen.cc @@ -24,8 +24,9 @@ #include "cgen.h" #include "cgen_gc.h" +#include -extern void emit_string_constant(ostream& str, char *s); +extern void emit_string_constant(ostream &str, char *s); extern int cgen_debug; // @@ -43,73 +44,46 @@ extern int cgen_debug; // as fixed names used by the runtime system. // ////////////////////////////////////////////////////////////////////// -Symbol - arg, - arg2, - Bool, - concat, - cool_abort, - copy, - Int, - in_int, - in_string, - IO, - length, - Main, - main_meth, - No_class, - No_type, - Object, - out_int, - out_string, - prim_slot, - self, - SELF_TYPE, - Str, - str_field, - substr, - type_name, - val; +Symbol arg, arg2, Bool, concat, cool_abort, copy, Int, in_int, in_string, IO, + length, Main, main_meth, No_class, No_type, Object, out_int, out_string, + prim_slot, self, SELF_TYPE, Str, str_field, substr, type_name, val; // // Initializing the predefined symbols. // -static void initialize_constants(void) -{ - arg = idtable.add_string("arg"); - arg2 = idtable.add_string("arg2"); - Bool = idtable.add_string("Bool"); - concat = idtable.add_string("concat"); - cool_abort = idtable.add_string("abort"); - copy = idtable.add_string("copy"); - Int = idtable.add_string("Int"); - in_int = idtable.add_string("in_int"); - in_string = idtable.add_string("in_string"); - IO = idtable.add_string("IO"); - length = idtable.add_string("length"); - Main = idtable.add_string("Main"); - main_meth = idtable.add_string("main"); -// _no_class is a symbol that can't be the name of any -// user-defined class. - No_class = idtable.add_string("_no_class"); - No_type = idtable.add_string("_no_type"); - Object = idtable.add_string("Object"); - out_int = idtable.add_string("out_int"); - out_string = idtable.add_string("out_string"); - prim_slot = idtable.add_string("_prim_slot"); - self = idtable.add_string("self"); - SELF_TYPE = idtable.add_string("SELF_TYPE"); - Str = idtable.add_string("String"); - str_field = idtable.add_string("_str_field"); - substr = idtable.add_string("substr"); - type_name = idtable.add_string("type_name"); - val = idtable.add_string("_val"); +static void initialize_constants(void) { + arg = idtable.add_string("arg"); + arg2 = idtable.add_string("arg2"); + Bool = idtable.add_string("Bool"); + concat = idtable.add_string("concat"); + cool_abort = idtable.add_string("abort"); + copy = idtable.add_string("copy"); + Int = idtable.add_string("Int"); + in_int = idtable.add_string("in_int"); + in_string = idtable.add_string("in_string"); + IO = idtable.add_string("IO"); + length = idtable.add_string("length"); + Main = idtable.add_string("Main"); + main_meth = idtable.add_string("main"); + // _no_class is a symbol that can't be the name of any + // user-defined class. + No_class = idtable.add_string("_no_class"); + No_type = idtable.add_string("_no_type"); + Object = idtable.add_string("Object"); + out_int = idtable.add_string("out_int"); + out_string = idtable.add_string("out_string"); + prim_slot = idtable.add_string("_prim_slot"); + self = idtable.add_string("self"); + SELF_TYPE = idtable.add_string("SELF_TYPE"); + Str = idtable.add_string("String"); + str_field = idtable.add_string("_str_field"); + substr = idtable.add_string("substr"); + type_name = idtable.add_string("type_name"); + val = idtable.add_string("_val"); } -static char *gc_init_names[] = - { "_NoGC_Init", "_GenGC_Init", "_ScnGC_Init" }; -static char *gc_collect_names[] = - { "_NoGC_Collect", "_GenGC_Collect", "_ScnGC_Collect" }; - +static char *gc_init_names[] = {"_NoGC_Init", "_GenGC_Init", "_ScnGC_Init"}; +static char *gc_collect_names[] = {"_NoGC_Collect", "_GenGC_Collect", + "_ScnGC_Collect"}; // BoolConst is a class that implements code generation for operations // on the two booleans, which are given global names here. @@ -129,18 +103,16 @@ BoolConst truebool(TRUE); // //********************************************************* -void program_class::cgen(ostream &os) -{ +void program_class::cgen(ostream &os) { // spim wants comments to start with '#' os << "# start of generated code\n"; initialize_constants(); - CgenClassTable *codegen_classtable = new CgenClassTable(classes,os); + CgenClassTable *codegen_classtable = new CgenClassTable(classes, os); os << "\n# end of generated code\n"; } - ////////////////////////////////////////////////////////////////////////////// // // emit_* procedures @@ -155,171 +127,171 @@ void program_class::cgen(ostream &os) // ////////////////////////////////////////////////////////////////////////////// -static void emit_load(char *dest_reg, int offset, char *source_reg, ostream& s) -{ - s << LW << dest_reg << " " << offset * WORD_SIZE << "(" << source_reg << ")" +static void emit_load(char *dest_reg, int offset, char *source_reg, + ostream &s) { + s << LW << dest_reg << " " << offset * WORD_SIZE << "(" << source_reg << ")" << endl; } -static void emit_store(char *source_reg, int offset, char *dest_reg, ostream& s) -{ +static void emit_store(char *source_reg, int offset, char *dest_reg, + ostream &s) { s << SW << source_reg << " " << offset * WORD_SIZE << "(" << dest_reg << ")" - << endl; + << endl; } -static void emit_load_imm(char *dest_reg, int val, ostream& s) -{ s << LI << dest_reg << " " << val << endl; } +static void emit_load_imm(char *dest_reg, int val, ostream &s) { + s << LI << dest_reg << " " << val << endl; +} -static void emit_load_address(char *dest_reg, char *address, ostream& s) -{ s << LA << dest_reg << " " << address << endl; } +static void emit_load_address(char *dest_reg, char *address, ostream &s) { + s << LA << dest_reg << " " << address << endl; +} -static void emit_partial_load_address(char *dest_reg, ostream& s) -{ s << LA << dest_reg << " "; } +static void emit_partial_load_address(char *dest_reg, ostream &s) { + s << LA << dest_reg << " "; +} -static void emit_load_bool(char *dest, const BoolConst& b, ostream& s) -{ - emit_partial_load_address(dest,s); +static void emit_load_bool(char *dest, const BoolConst &b, ostream &s) { + emit_partial_load_address(dest, s); b.code_ref(s); s << endl; } -static void emit_load_string(char *dest, StringEntry *str, ostream& s) -{ - emit_partial_load_address(dest,s); +static void emit_load_string(char *dest, StringEntry *str, ostream &s) { + emit_partial_load_address(dest, s); str->code_ref(s); s << endl; } -static void emit_load_int(char *dest, IntEntry *i, ostream& s) -{ - emit_partial_load_address(dest,s); +static void emit_load_int(char *dest, IntEntry *i, ostream &s) { + emit_partial_load_address(dest, s); i->code_ref(s); s << endl; } -static void emit_move(char *dest_reg, char *source_reg, ostream& s) -{ s << MOVE << dest_reg << " " << source_reg << endl; } +static void emit_move(char *dest_reg, char *source_reg, ostream &s) { + s << MOVE << dest_reg << " " << source_reg << endl; +} -static void emit_neg(char *dest, char *src1, ostream& s) -{ s << NEG << dest << " " << src1 << endl; } +static void emit_neg(char *dest, char *src1, ostream &s) { + s << NEG << dest << " " << src1 << endl; +} -static void emit_add(char *dest, char *src1, char *src2, ostream& s) -{ s << ADD << dest << " " << src1 << " " << src2 << endl; } +static void emit_add(char *dest, char *src1, char *src2, ostream &s) { + s << ADD << dest << " " << src1 << " " << src2 << endl; +} -static void emit_addu(char *dest, char *src1, char *src2, ostream& s) -{ s << ADDU << dest << " " << src1 << " " << src2 << endl; } +static void emit_addu(char *dest, char *src1, char *src2, ostream &s) { + s << ADDU << dest << " " << src1 << " " << src2 << endl; +} -static void emit_addiu(char *dest, char *src1, int imm, ostream& s) -{ s << ADDIU << dest << " " << src1 << " " << imm << endl; } +static void emit_addiu(char *dest, char *src1, int imm, ostream &s) { + s << ADDIU << dest << " " << src1 << " " << imm << endl; +} -static void emit_div(char *dest, char *src1, char *src2, ostream& s) -{ s << DIV << dest << " " << src1 << " " << src2 << endl; } +static void emit_div(char *dest, char *src1, char *src2, ostream &s) { + s << DIV << dest << " " << src1 << " " << src2 << endl; +} -static void emit_mul(char *dest, char *src1, char *src2, ostream& s) -{ s << MUL << dest << " " << src1 << " " << src2 << endl; } +static void emit_mul(char *dest, char *src1, char *src2, ostream &s) { + s << MUL << dest << " " << src1 << " " << src2 << endl; +} -static void emit_sub(char *dest, char *src1, char *src2, ostream& s) -{ s << SUB << dest << " " << src1 << " " << src2 << endl; } +static void emit_sub(char *dest, char *src1, char *src2, ostream &s) { + s << SUB << dest << " " << src1 << " " << src2 << endl; +} -static void emit_sll(char *dest, char *src1, int num, ostream& s) -{ s << SLL << dest << " " << src1 << " " << num << endl; } +static void emit_sll(char *dest, char *src1, int num, ostream &s) { + s << SLL << dest << " " << src1 << " " << num << endl; +} -static void emit_jalr(char *dest, ostream& s) -{ s << JALR << "\t" << dest << endl; } +static void emit_jalr(char *dest, ostream &s) { + s << JALR << "\t" << dest << endl; +} -static void emit_jal(char *address,ostream &s) -{ s << JAL << address << endl; } +static void emit_jal(char *address, ostream &s) { s << JAL << address << endl; } -static void emit_return(ostream& s) -{ s << RET << endl; } +static void emit_return(ostream &s) { s << RET << endl; } -static void emit_gc_assign(ostream& s) -{ s << JAL << "_GenGC_Assign" << endl; } +static void emit_gc_assign(ostream &s) { s << JAL << "_GenGC_Assign" << endl; } -static void emit_disptable_ref(Symbol sym, ostream& s) -{ s << sym << DISPTAB_SUFFIX; } +static void emit_disptable_ref(Symbol sym, ostream &s) { + s << sym << DISPTAB_SUFFIX; +} -static void emit_init_ref(Symbol sym, ostream& s) -{ s << sym << CLASSINIT_SUFFIX; } +static void emit_init_ref(Symbol sym, ostream &s) { + s << sym << CLASSINIT_SUFFIX; +} -static void emit_label_ref(int l, ostream &s) -{ s << "label" << l; } +static void emit_label_ref(int l, ostream &s) { s << "label" << l; } -static void emit_protobj_ref(Symbol sym, ostream& s) -{ s << sym << PROTOBJ_SUFFIX; } +static void emit_protobj_ref(Symbol sym, ostream &s) { + s << sym << PROTOBJ_SUFFIX; +} -static void emit_method_ref(Symbol classname, Symbol methodname, ostream& s) -{ s << classname << METHOD_SEP << methodname; } +static void emit_method_ref(Symbol classname, Symbol methodname, ostream &s) { + s << classname << METHOD_SEP << methodname; +} -static void emit_label_def(int l, ostream &s) -{ - emit_label_ref(l,s); +static void emit_label_def(int l, ostream &s) { + emit_label_ref(l, s); s << ":" << endl; } -static void emit_beqz(char *source, int label, ostream &s) -{ +static void emit_beqz(char *source, int label, ostream &s) { s << BEQZ << source << " "; - emit_label_ref(label,s); + emit_label_ref(label, s); s << endl; } -static void emit_beq(char *src1, char *src2, int label, ostream &s) -{ +static void emit_beq(char *src1, char *src2, int label, ostream &s) { s << BEQ << src1 << " " << src2 << " "; - emit_label_ref(label,s); + emit_label_ref(label, s); s << endl; } -static void emit_bne(char *src1, char *src2, int label, ostream &s) -{ +static void emit_bne(char *src1, char *src2, int label, ostream &s) { s << BNE << src1 << " " << src2 << " "; - emit_label_ref(label,s); + emit_label_ref(label, s); s << endl; } -static void emit_bleq(char *src1, char *src2, int label, ostream &s) -{ +static void emit_bleq(char *src1, char *src2, int label, ostream &s) { s << BLEQ << src1 << " " << src2 << " "; - emit_label_ref(label,s); + emit_label_ref(label, s); s << endl; } -static void emit_blt(char *src1, char *src2, int label, ostream &s) -{ +static void emit_blt(char *src1, char *src2, int label, ostream &s) { s << BLT << src1 << " " << src2 << " "; - emit_label_ref(label,s); + emit_label_ref(label, s); s << endl; } -static void emit_blti(char *src1, int imm, int label, ostream &s) -{ +static void emit_blti(char *src1, int imm, int label, ostream &s) { s << BLT << src1 << " " << imm << " "; - emit_label_ref(label,s); + emit_label_ref(label, s); s << endl; } -static void emit_bgti(char *src1, int imm, int label, ostream &s) -{ +static void emit_bgti(char *src1, int imm, int label, ostream &s) { s << BGT << src1 << " " << imm << " "; - emit_label_ref(label,s); + emit_label_ref(label, s); s << endl; } -static void emit_branch(int l, ostream& s) -{ +static void emit_branch(int l, ostream &s) { s << BRANCH; - emit_label_ref(l,s); + emit_label_ref(l, s); s << endl; } // // Push a register on the stack. The stack grows towards smaller addresses. // -static void emit_push(char *reg, ostream& str) -{ - emit_store(reg,0,SP,str); - emit_addiu(SP,SP,-4,str); +static void emit_push(char *reg, ostream &str) { + emit_store(reg, 0, SP, str); + emit_addiu(SP, SP, -4, str); } // @@ -327,34 +299,33 @@ static void emit_push(char *reg, ostream& str) // Emits code to fetch the integer value of the Integer object pointed // to by register source into the register dest // -static void emit_fetch_int(char *dest, char *source, ostream& s) -{ emit_load(dest, DEFAULT_OBJFIELDS, source, s); } +static void emit_fetch_int(char *dest, char *source, ostream &s) { + emit_load(dest, DEFAULT_OBJFIELDS, source, s); +} // // Emits code to store the integer value contained in register source // into the Integer object pointed to by dest. // -static void emit_store_int(char *source, char *dest, ostream& s) -{ emit_store(source, DEFAULT_OBJFIELDS, dest, s); } +static void emit_store_int(char *source, char *dest, ostream &s) { + emit_store(source, DEFAULT_OBJFIELDS, dest, s); +} - -static void emit_test_collector(ostream &s) -{ +static void emit_test_collector(ostream &s) { emit_push(ACC, s); - emit_move(ACC, SP, s); // stack end + emit_move(ACC, SP, s); // stack end emit_move(A1, ZERO, s); // allocate nothing s << JAL << gc_collect_names[cgen_Memmgr] << endl; - emit_addiu(SP,SP,4,s); - emit_load(ACC,0,SP,s); + emit_addiu(SP, SP, 4, s); + emit_load(ACC, 0, SP, s); } -static void emit_gc_check(char *source, ostream &s) -{ - if (source != (char*)A1) emit_move(A1, source, s); +static void emit_gc_check(char *source, ostream &s) { + if (source != (char *)A1) + emit_move(A1, source, s); s << JAL << "_gc_check" << endl; } - /////////////////////////////////////////////////////////////////////////////// // // coding strings, ints, and booleans @@ -379,119 +350,108 @@ static void emit_gc_check(char *source, ostream &s) // // Strings // -void StringEntry::code_ref(ostream& s) -{ - s << STRCONST_PREFIX << index; -} +void StringEntry::code_ref(ostream &s) { s << STRCONST_PREFIX << index; } // // Emit code for a constant String. // You should fill in the code naming the dispatch table. // -void StringEntry::code_def(ostream& s, int stringclasstag) -{ +void StringEntry::code_def(ostream &s, int stringclasstag) { IntEntryP lensym = inttable.add_int(len); // Add -1 eye catcher s << WORD << "-1" << endl; - code_ref(s); s << LABEL // label - << WORD << stringclasstag << endl // tag - << WORD << (DEFAULT_OBJFIELDS + STRING_SLOTS + (len+4)/4) << endl // size - << WORD; + code_ref(s); + s << LABEL // label + << WORD << stringclasstag << endl // tag + << WORD << (DEFAULT_OBJFIELDS + STRING_SLOTS + (len + 4) / 4) + << endl // size + << WORD; + /***** Add dispatch information for class String ******/ - /***** Add dispatch information for class String ******/ - - s << endl; // dispatch table - s << WORD; lensym->code_ref(s); s << endl; // string length - emit_string_constant(s,str); // ascii string - s << ALIGN; // align to word + s << endl; // dispatch table + s << WORD; + lensym->code_ref(s); + s << endl; // string length + emit_string_constant(s, str); // ascii string + s << ALIGN; // align to word } // // StrTable::code_string -// Generate a string object definition for every string constant in the +// Generate a string object definition for every string constant in the // stringtable. // -void StrTable::code_string_table(ostream& s, int stringclasstag) -{ +void StrTable::code_string_table(ostream &s, int stringclasstag) { for (List *l = tbl; l; l = l->tl()) - l->hd()->code_def(s,stringclasstag); + l->hd()->code_def(s, stringclasstag); } // // Ints // -void IntEntry::code_ref(ostream &s) -{ - s << INTCONST_PREFIX << index; -} +void IntEntry::code_ref(ostream &s) { s << INTCONST_PREFIX << index; } // // Emit code for a constant Integer. // You should fill in the code naming the dispatch table. // -void IntEntry::code_def(ostream &s, int intclasstag) -{ +void IntEntry::code_def(ostream &s, int intclasstag) { // Add -1 eye catcher s << WORD << "-1" << endl; - code_ref(s); s << LABEL // label - << WORD << intclasstag << endl // class tag - << WORD << (DEFAULT_OBJFIELDS + INT_SLOTS) << endl // object size - << WORD; + code_ref(s); + s << LABEL // label + << WORD << intclasstag << endl // class tag + << WORD << (DEFAULT_OBJFIELDS + INT_SLOTS) << endl // object size + << WORD; - /***** Add dispatch information for class Int ******/ + /***** Add dispatch information for class Int ******/ - s << endl; // dispatch table - s << WORD << str << endl; // integer value + s << endl; // dispatch table + s << WORD << str << endl; // integer value } - // // IntTable::code_string_table // Generate an Int object definition for every Int constant in the // inttable. // -void IntTable::code_string_table(ostream &s, int intclasstag) -{ +void IntTable::code_string_table(ostream &s, int intclasstag) { for (List *l = tbl; l; l = l->tl()) - l->hd()->code_def(s,intclasstag); + l->hd()->code_def(s, intclasstag); } - // // Bools // BoolConst::BoolConst(int i) : val(i) { assert(i == 0 || i == 1); } -void BoolConst::code_ref(ostream& s) const -{ - s << BOOLCONST_PREFIX << val; -} - +void BoolConst::code_ref(ostream &s) const { s << BOOLCONST_PREFIX << val; } + // // Emit code for a constant Bool. // You should fill in the code naming the dispatch table. // -void BoolConst::code_def(ostream& s, int boolclasstag) -{ +void BoolConst::code_def(ostream &s, int boolclasstag) { // Add -1 eye catcher s << WORD << "-1" << endl; - code_ref(s); s << LABEL // label - << WORD << boolclasstag << endl // class tag - << WORD << (DEFAULT_OBJFIELDS + BOOL_SLOTS) << endl // object size - << WORD; + code_ref(s); + s << LABEL // label + << WORD << boolclasstag << endl // class tag + << WORD << (DEFAULT_OBJFIELDS + BOOL_SLOTS) << endl // object size + << WORD; - /***** Add dispatch information for class Bool ******/ + /***** Add dispatch information for class Bool ******/ - s << endl; // dispatch table - s << WORD << val << endl; // value (0 or 1) + s << endl; // dispatch table + s << WORD << val << endl; // value (0 or 1) } ////////////////////////////////////////////////////////////////////////////// @@ -507,23 +467,32 @@ void BoolConst::code_def(ostream& s, int boolclasstag) // //*************************************************** -void CgenClassTable::code_global_data() -{ - Symbol main = idtable.lookup_string(MAINNAME); - Symbol string = idtable.lookup_string(STRINGNAME); +void CgenClassTable::code_global_data() { + Symbol main = idtable.lookup_string(MAINNAME); + Symbol string = idtable.lookup_string(STRINGNAME); Symbol integer = idtable.lookup_string(INTNAME); - Symbol boolc = idtable.lookup_string(BOOLNAME); + Symbol boolc = idtable.lookup_string(BOOLNAME); str << "\t.data\n" << ALIGN; // // The following global names must be defined first. // str << GLOBAL << CLASSNAMETAB << endl; - str << GLOBAL; emit_protobj_ref(main,str); str << endl; - str << GLOBAL; emit_protobj_ref(integer,str); str << endl; - str << GLOBAL; emit_protobj_ref(string,str); str << endl; - str << GLOBAL; falsebool.code_ref(str); str << endl; - str << GLOBAL; truebool.code_ref(str); str << endl; + str << GLOBAL; + emit_protobj_ref(main, str); + str << endl; + str << GLOBAL; + emit_protobj_ref(integer, str); + str << endl; + str << GLOBAL; + emit_protobj_ref(string, str); + str << endl; + str << GLOBAL; + falsebool.code_ref(str); + str << endl; + str << GLOBAL; + truebool.code_ref(str); + str << endl; str << GLOBAL << INTTAG << endl; str << GLOBAL << BOOLTAG << endl; str << GLOBAL << STRINGTAG << endl; @@ -532,15 +501,11 @@ void CgenClassTable::code_global_data() // We also need to know the tag of the Int, String, and Bool classes // during code generation. // - str << INTTAG << LABEL - << WORD << intclasstag << endl; - str << BOOLTAG << LABEL - << WORD << boolclasstag << endl; - str << STRINGTAG << LABEL - << WORD << stringclasstag << endl; + str << INTTAG << LABEL << WORD << intclasstag << endl; + str << BOOLTAG << LABEL << WORD << boolclasstag << endl; + str << STRINGTAG << LABEL << WORD << stringclasstag << endl; } - //*************************************************** // // Emit code to start the .text segment and to @@ -548,33 +513,29 @@ void CgenClassTable::code_global_data() // //*************************************************** -void CgenClassTable::code_global_text() -{ +void CgenClassTable::code_global_text() { str << GLOBAL << HEAP_START << endl - << HEAP_START << LABEL - << WORD << 0 << endl + << HEAP_START << LABEL << WORD << 0 << endl << "\t.text" << endl << GLOBAL; emit_init_ref(idtable.add_string("Main"), str); str << endl << GLOBAL; - emit_init_ref(idtable.add_string("Int"),str); + emit_init_ref(idtable.add_string("Int"), str); str << endl << GLOBAL; - emit_init_ref(idtable.add_string("String"),str); + emit_init_ref(idtable.add_string("String"), str); str << endl << GLOBAL; - emit_init_ref(idtable.add_string("Bool"),str); + emit_init_ref(idtable.add_string("Bool"), str); str << endl << GLOBAL; emit_method_ref(idtable.add_string("Main"), idtable.add_string("main"), str); str << endl; } -void CgenClassTable::code_bools(int boolclasstag) -{ - falsebool.code_def(str,boolclasstag); - truebool.code_def(str,boolclasstag); +void CgenClassTable::code_bools(int boolclasstag) { + falsebool.code_def(str, boolclasstag); + truebool.code_def(str, boolclasstag); } -void CgenClassTable::code_select_gc() -{ +void CgenClassTable::code_select_gc() { // // Generate GC choice constants (pointers to GC functions) // @@ -589,7 +550,6 @@ void CgenClassTable::code_select_gc() str << WORD << (cgen_Memmgr_Test == GC_TEST) << endl; } - //******************************************************** // // Emit code to reserve space for and initialize all of @@ -603,156 +563,153 @@ void CgenClassTable::code_select_gc() // //******************************************************** -void CgenClassTable::code_constants() -{ +void CgenClassTable::code_constants() { // // Add constants that are required by the code generator. // stringtable.add_string(""); inttable.add_string("0"); - stringtable.code_string_table(str,stringclasstag); - inttable.code_string_table(str,intclasstag); + stringtable.code_string_table(str, stringclasstag); + inttable.code_string_table(str, intclasstag); code_bools(boolclasstag); } +CgenClassTable::CgenClassTable(Classes classes, ostream &s) + : nds(NULL), str(s) { + stringclasstag = 1 /* Change to your String class tag here */; + intclasstag = 2 /* Change to your Int class tag here */; + boolclasstag = 3 /* Change to your Bool class tag here */; -CgenClassTable::CgenClassTable(Classes classes, ostream& s) : nds(NULL) , str(s) -{ - stringclasstag = 0 /* Change to your String class tag here */; - intclasstag = 0 /* Change to your Int class tag here */; - boolclasstag = 0 /* Change to your Bool class tag here */; - - enterscope(); - if (cgen_debug) cout << "Building CgenClassTable" << endl; - install_basic_classes(); - install_classes(classes); - build_inheritance_tree(); - - code(); - exitscope(); + enterscope(); + if (cgen_debug) + cout << "Building CgenClassTable" << endl; + install_basic_classes(); + install_classes(classes); + build_inheritance_tree(); + if (cgen_debug) + dump_inheritance_tree(); + code(); + exitscope(); } -void CgenClassTable::install_basic_classes() -{ +void CgenClassTable::install_basic_classes() { -// The tree package uses these globals to annotate the classes built below. - //curr_lineno = 0; + // The tree package uses these globals to annotate the classes built below. + // curr_lineno = 0; Symbol filename = stringtable.add_string(""); -// -// A few special class names are installed in the lookup table but not -// the class list. Thus, these classes exist, but are not part of the -// inheritance hierarchy. -// No_class serves as the parent of Object and the other special classes. -// SELF_TYPE is the self class; it cannot be redefined or inherited. -// prim_slot is a class known to the code generator. -// + // + // A few special class names are installed in the lookup table but not + // the class list. Thus, these classes exist, but are not part of the + // inheritance hierarchy. + // No_class serves as the parent of Object and the other special classes. + // SELF_TYPE is the self class; it cannot be redefined or inherited. + // prim_slot is a class known to the code generator. + // addid(No_class, - new CgenNode(class_(No_class,No_class,nil_Features(),filename), - Basic,this)); + new CgenNode(class_(No_class, No_class, nil_Features(), filename), + Basic, this)); addid(SELF_TYPE, - new CgenNode(class_(SELF_TYPE,No_class,nil_Features(),filename), - Basic,this)); + new CgenNode(class_(SELF_TYPE, No_class, nil_Features(), filename), + Basic, this)); addid(prim_slot, - new CgenNode(class_(prim_slot,No_class,nil_Features(),filename), - Basic,this)); + new CgenNode(class_(prim_slot, No_class, nil_Features(), filename), + Basic, this)); -// -// The Object class has no parent class. Its methods are -// cool_abort() : Object aborts the program -// type_name() : Str returns a string representation of class name -// copy() : SELF_TYPE returns a copy of the object -// -// There is no need for method bodies in the basic classes---these -// are already built in to the runtime system. -// - install_class( - new CgenNode( - class_(Object, - No_class, - append_Features( - append_Features( - single_Features(method(cool_abort, nil_Formals(), Object, no_expr())), - single_Features(method(type_name, nil_Formals(), Str, no_expr()))), - single_Features(method(copy, nil_Formals(), SELF_TYPE, no_expr()))), - filename), - Basic,this)); + // + // The Object class has no parent class. Its methods are + // cool_abort() : Object aborts the program + // type_name() : Str returns a string representation of class + // name copy() : SELF_TYPE returns a copy of the object + // + // There is no need for method bodies in the basic classes---these + // are already built in to the runtime system. + // + install_class(new CgenNode( + class_( + Object, No_class, + append_Features( + append_Features(single_Features(method(cool_abort, nil_Formals(), + Object, no_expr())), + single_Features(method(type_name, nil_Formals(), + Str, no_expr()))), + single_Features( + method(copy, nil_Formals(), SELF_TYPE, no_expr()))), + filename), + Basic, this)); -// -// The IO class inherits from Object. Its methods are -// out_string(Str) : SELF_TYPE writes a string to the output -// out_int(Int) : SELF_TYPE " an int " " " -// in_string() : Str reads a string from the input -// in_int() : Int " an int " " " -// - install_class( - new CgenNode( - class_(IO, - Object, - append_Features( - append_Features( - append_Features( - single_Features(method(out_string, single_Formals(formal(arg, Str)), - SELF_TYPE, no_expr())), - single_Features(method(out_int, single_Formals(formal(arg, Int)), - SELF_TYPE, no_expr()))), - single_Features(method(in_string, nil_Formals(), Str, no_expr()))), - single_Features(method(in_int, nil_Formals(), Int, no_expr()))), - filename), - Basic,this)); + // + // The IO class inherits from Object. Its methods are + // out_string(Str) : SELF_TYPE writes a string to the output + // out_int(Int) : SELF_TYPE " an int " " " + // in_string() : Str reads a string from the input + // in_int() : Int " an int " " " + // + install_class(new CgenNode( + class_( + IO, Object, + append_Features( + append_Features( + append_Features( + single_Features(method(out_string, + single_Formals(formal(arg, Str)), + SELF_TYPE, no_expr())), + single_Features(method(out_int, + single_Formals(formal(arg, Int)), + SELF_TYPE, no_expr()))), + single_Features( + method(in_string, nil_Formals(), Str, no_expr()))), + single_Features(method(in_int, nil_Formals(), Int, no_expr()))), + filename), + Basic, this)); -// -// The Int class has no methods and only a single attribute, the -// "val" for the integer. -// - install_class( - new CgenNode( - class_(Int, - Object, - single_Features(attr(val, prim_slot, no_expr())), - filename), - Basic,this)); + // + // The Int class has no methods and only a single attribute, the + // "val" for the integer. + // + install_class(new CgenNode( + class_(Int, Object, single_Features(attr(val, prim_slot, no_expr())), + filename), + Basic, this)); -// -// Bool also has only the "val" slot. -// - install_class( - new CgenNode( - class_(Bool, Object, single_Features(attr(val, prim_slot, no_expr())),filename), - Basic,this)); + // + // Bool also has only the "val" slot. + // + install_class(new CgenNode( + class_(Bool, Object, single_Features(attr(val, prim_slot, no_expr())), + filename), + Basic, this)); -// -// The class Str has a number of slots and operations: -// val ??? -// str_field the string itself -// length() : Int length of the string -// concat(arg: Str) : Str string concatenation -// substr(arg: Int, arg2: Int): Str substring -// - install_class( - new CgenNode( - class_(Str, - Object, + // + // The class Str has a number of slots and operations: + // val ??? + // str_field the string itself + // length() : Int length of the string + // concat(arg: Str) : Str string concatenation + // substr(arg: Int, arg2: Int): Str substring + // + install_class(new CgenNode( + class_(Str, Object, append_Features( - append_Features( - append_Features( - append_Features( - single_Features(attr(val, Int, no_expr())), - single_Features(attr(str_field, prim_slot, no_expr()))), - single_Features(method(length, nil_Formals(), Int, no_expr()))), - single_Features(method(concat, - single_Formals(formal(arg, Str)), - Str, - no_expr()))), - single_Features(method(substr, - append_Formals(single_Formals(formal(arg, Int)), - single_Formals(formal(arg2, Int))), - Str, - no_expr()))), - filename), - Basic,this)); - + append_Features( + append_Features( + append_Features( + single_Features(attr(val, Int, no_expr())), + single_Features( + attr(str_field, prim_slot, no_expr()))), + single_Features( + method(length, nil_Formals(), Int, no_expr()))), + single_Features(method(concat, + single_Formals(formal(arg, Str)), + Str, no_expr()))), + single_Features( + method(substr, + append_Formals(single_Formals(formal(arg, Int)), + single_Formals(formal(arg2, Int))), + Str, no_expr()))), + filename), + Basic, this)); } // CgenClassTable::install_class @@ -760,34 +717,30 @@ void CgenClassTable::install_basic_classes() // // install_classes enters a list of classes in the symbol table. // -void CgenClassTable::install_class(CgenNodeP nd) -{ +void CgenClassTable::install_class(CgenNodeP nd) { Symbol name = nd->get_name(); - if (probe(name)) - { - return; - } + if (probe(name)) { + return; + } // The class name is legal, so add it to the list of classes // and the symbol table. - nds = new List(nd,nds); - addid(name,nd); + nds = new List(nd, nds); + addid(name, nd); } -void CgenClassTable::install_classes(Classes cs) -{ - for(int i = cs->first(); cs->more(i); i = cs->next(i)) - install_class(new CgenNode(cs->nth(i),NotBasic,this)); +void CgenClassTable::install_classes(Classes cs) { + for (int i = cs->first(); cs->more(i); i = cs->next(i)) + install_class(new CgenNode(cs->nth(i), NotBasic, this)); } // // CgenClassTable::build_inheritance_tree // -void CgenClassTable::build_inheritance_tree() -{ - for(List *l = nds; l; l = l->tl()) - set_relations(l->hd()); +void CgenClassTable::build_inheritance_tree() { + for (List *l = nds; l; l = l->tl()) + set_relations(l->hd()); } // @@ -796,60 +749,65 @@ void CgenClassTable::build_inheritance_tree() // Takes a CgenNode and locates its, and its parent's, inheritance nodes // via the class table. Parent and child pointers are added as appropriate. // -void CgenClassTable::set_relations(CgenNodeP nd) -{ +void CgenClassTable::set_relations(CgenNodeP nd) { CgenNode *parent_node = probe(nd->get_parent()); nd->set_parentnd(parent_node); parent_node->add_child(nd); } -void CgenNode::add_child(CgenNodeP n) -{ - children = new List(n,children); +void CgenNode::add_child(CgenNodeP n) { + children = new List(n, children); } -void CgenNode::set_parentnd(CgenNodeP p) -{ +void CgenNode::set_parentnd(CgenNodeP p) { assert(parentnd == NULL); assert(p != NULL); parentnd = p; } +void CgenClassTable::dump_inheritance_tree() { + CgenNode *object_node = nullptr; + for (auto l = nds; l; l = l->tl()) { + auto cur_node = l->hd(); + if (cur_node->name == Object) { + object_node = cur_node; + break; + } + } + object_node->traverse_dump(0); +} -void CgenClassTable::code() -{ - if (cgen_debug) cout << "coding global data" << endl; +void CgenClassTable::code() { + if (cgen_debug) + cout << "coding global data" << endl; code_global_data(); - if (cgen_debug) cout << "choosing gc" << endl; + if (cgen_debug) + cout << "choosing gc" << endl; code_select_gc(); - if (cgen_debug) cout << "coding constants" << endl; + if (cgen_debug) + cout << "coding constants" << endl; code_constants(); -// Add your code to emit -// - prototype objects -// - class_nameTab -// - dispatch tables -// + // Add your code to emit + // - prototype objects + // - class_nameTab + // - dispatch tables + // - if (cgen_debug) cout << "coding global text" << endl; + if (cgen_debug) + cout << "coding global text" << endl; code_global_text(); -// Add your code to emit -// - object initializer -// - the class methods -// - etc... - -} - - -CgenNodeP CgenClassTable::root() -{ - return probe(Object); + // Add your code to emit + // - object initializer + // - the class methods + // - etc... } +CgenNodeP CgenClassTable::root() { return probe(Object); } /////////////////////////////////////////////////////////////////////// // @@ -857,16 +815,12 @@ CgenNodeP CgenClassTable::root() // /////////////////////////////////////////////////////////////////////// -CgenNode::CgenNode(Class_ nd, Basicness bstatus, CgenClassTableP ct) : - class__class((const class__class &) *nd), - parentnd(NULL), - children(NULL), - basic_status(bstatus) -{ - stringtable.add_string(name->get_string()); // Add class name to string table +CgenNode::CgenNode(Class_ nd, Basicness bstatus, CgenClassTableP ct) + : class__class((const class__class &)*nd), parentnd(NULL), children(NULL), + basic_status(bstatus) { + stringtable.add_string(name->get_string()); // Add class name to string table } - //****************************************************************** // // Fill in the following methods to produce code for the @@ -877,85 +831,59 @@ CgenNode::CgenNode(Class_ nd, Basicness bstatus, CgenClassTableP ct) : // //***************************************************************** -void assign_class::code(ostream &s) { -} +void assign_class::code(ostream &s) {} -void static_dispatch_class::code(ostream &s) { -} +void static_dispatch_class::code(ostream &s) {} -void dispatch_class::code(ostream &s) { -} +void dispatch_class::code(ostream &s) {} -void cond_class::code(ostream &s) { -} +void cond_class::code(ostream &s) {} -void loop_class::code(ostream &s) { -} +void loop_class::code(ostream &s) {} -void typcase_class::code(ostream &s) { -} +void typcase_class::code(ostream &s) {} -void block_class::code(ostream &s) { -} +void block_class::code(ostream &s) {} -void let_class::code(ostream &s) { -} +void let_class::code(ostream &s) {} -void plus_class::code(ostream &s) { -} +void plus_class::code(ostream &s) {} -void sub_class::code(ostream &s) { -} +void sub_class::code(ostream &s) {} -void mul_class::code(ostream &s) { -} +void mul_class::code(ostream &s) {} -void divide_class::code(ostream &s) { -} +void divide_class::code(ostream &s) {} -void neg_class::code(ostream &s) { -} +void neg_class::code(ostream &s) {} -void lt_class::code(ostream &s) { -} +void lt_class::code(ostream &s) {} -void eq_class::code(ostream &s) { -} +void eq_class::code(ostream &s) {} -void leq_class::code(ostream &s) { -} +void leq_class::code(ostream &s) {} -void comp_class::code(ostream &s) { -} +void comp_class::code(ostream &s) {} -void int_const_class::code(ostream& s) -{ +void int_const_class::code(ostream &s) { // // Need to be sure we have an IntEntry *, not an arbitrary Symbol // - emit_load_int(ACC,inttable.lookup_string(token->get_string()),s); + emit_load_int(ACC, inttable.lookup_string(token->get_string()), s); } -void string_const_class::code(ostream& s) -{ - emit_load_string(ACC,stringtable.lookup_string(token->get_string()),s); +void string_const_class::code(ostream &s) { + emit_load_string(ACC, stringtable.lookup_string(token->get_string()), s); } -void bool_const_class::code(ostream& s) -{ +void bool_const_class::code(ostream &s) { emit_load_bool(ACC, BoolConst(val), s); } -void new__class::code(ostream &s) { -} +void new__class::code(ostream &s) {} -void isvoid_class::code(ostream &s) { -} - -void no_expr_class::code(ostream &s) { -} - -void object_class::code(ostream &s) { -} +void isvoid_class::code(ostream &s) {} +void no_expr_class::code(ostream &s) {} +void object_class::code(ostream &s) {} diff --git a/assignments/PA5/cgen.h b/assignments/PA5/cgen.h index 899a283..923c121 100644 --- a/assignments/PA5/cgen.h +++ b/assignments/PA5/cgen.h @@ -1,10 +1,11 @@ -#include -#include -#include "emit.h" #include "cool-tree.h" +#include "emit.h" #include "symtab.h" +#include +#include +#include -enum Basicness {Basic, NotBasic}; +enum Basicness { Basic, NotBasic }; #define TRUE 1 #define FALSE 0 @@ -14,67 +15,73 @@ typedef CgenClassTable *CgenClassTableP; class CgenNode; typedef CgenNode *CgenNodeP; -class CgenClassTable : public SymbolTable { +class CgenClassTable : public SymbolTable { private: - List *nds; - ostream& str; - int stringclasstag; - int intclasstag; - int boolclasstag; + List *nds; + ostream &str; + int stringclasstag; + int intclasstag; + int boolclasstag; + // The following methods emit code for + // constants and global declarations. -// The following methods emit code for -// constants and global declarations. + void code_global_data(); + void code_global_text(); + void code_bools(int); + void code_select_gc(); + void code_constants(); - void code_global_data(); - void code_global_text(); - void code_bools(int); - void code_select_gc(); - void code_constants(); + // The following creates an inheritance graph from + // a list of classes. The graph is implemented as + // a tree of `CgenNode', and class names are placed + // in the base class symbol table. -// The following creates an inheritance graph from -// a list of classes. The graph is implemented as -// a tree of `CgenNode', and class names are placed -// in the base class symbol table. + void install_basic_classes(); + void install_class(CgenNodeP nd); + void install_classes(Classes cs); + void build_inheritance_tree(); + void set_relations(CgenNodeP nd); + //* New Methods + void dump_inheritance_tree(); - void install_basic_classes(); - void install_class(CgenNodeP nd); - void install_classes(Classes cs); - void build_inheritance_tree(); - void set_relations(CgenNodeP nd); public: - CgenClassTable(Classes, ostream& str); - void code(); - CgenNodeP root(); + CgenClassTable(Classes, ostream &str); + void code(); + CgenNodeP root(); }; - class CgenNode : public class__class { -private: - CgenNodeP parentnd; // Parent of class - List *children; // Children of class - Basicness basic_status; // `Basic' if class is basic - // `NotBasic' otherwise +private: + CgenNodeP parentnd; // Parent of class + List *children; // Children of class + Basicness basic_status; // `Basic' if class is basic + // `NotBasic' otherwise public: - CgenNode(Class_ c, - Basicness bstatus, - CgenClassTableP class_table); + CgenNode(Class_ c, Basicness bstatus, CgenClassTableP class_table); - void add_child(CgenNodeP child); - List *get_children() { return children; } - void set_parentnd(CgenNodeP p); - CgenNodeP get_parentnd() { return parentnd; } - int basic() { return (basic_status == Basic); } + void add_child(CgenNodeP child); + List *get_children() { return children; } + void set_parentnd(CgenNodeP p); + CgenNodeP get_parentnd() { return parentnd; } + int basic() { return (basic_status == Basic); } + void traverse_dump(int pad) { + for (int i = 0; i < pad; ++i) + std::cerr << " "; + std::cerr << this->name << "\n"; + for (auto l = children; l; l = l->tl()) { + l->hd()->traverse_dump(pad + 2); + } + } }; -class BoolConst -{ - private: +class BoolConst { +private: int val; - public: - BoolConst(int); - void code_def(ostream&, int boolclasstag); - void code_ref(ostream&) const; -}; +public: + BoolConst(int); + void code_def(ostream &, int boolclasstag); + void code_ref(ostream &) const; +}; diff --git a/assignments/PA5/cgen_supp.cc b/assignments/PA5/cgen_supp.cc index d9fa8cb..f1ff253 100644 --- a/assignments/PA5/cgen_supp.cc +++ b/assignments/PA5/cgen_supp.cc @@ -1,30 +1,25 @@ +#include "stringtab.h" #include #include #include -#include "stringtab.h" static int ascii = 0; -void ascii_mode(ostream& str) -{ - if (!ascii) - { - str << "\t.ascii\t\""; - ascii = 1; - } +void ascii_mode(ostream &str) { + if (!ascii) { + str << "\t.ascii\t\""; + ascii = 1; + } } -void byte_mode(ostream& str) -{ - if (ascii) - { - str << "\"\n"; - ascii = 0; - } +void byte_mode(ostream &str) { + if (ascii) { + str << "\"\n"; + ascii = 0; + } } -void emit_string_constant(ostream& str, char* s) -{ +void emit_string_constant(ostream &str, char *s) { ascii = 0; while (*s) { @@ -39,23 +34,20 @@ void emit_string_constant(ostream& str, char* s) break; case '\\': byte_mode(str); - str << "\t.byte\t" << (int) ((unsigned char) '\\') << endl; + str << "\t.byte\t" << (int)((unsigned char)'\\') << endl; break; - case '"' : + case '"': ascii_mode(str); str << "\\\""; break; default: - if (*s >= ' ' && ((unsigned char) *s) < 128) - { - ascii_mode(str); - str << *s; - } - else - { - byte_mode(str); - str << "\t.byte\t" << (int) ((unsigned char) *s) << endl; - } + if (*s >= ' ' && ((unsigned char)*s) < 128) { + ascii_mode(str); + str << *s; + } else { + byte_mode(str); + str << "\t.byte\t" << (int)((unsigned char)*s) << endl; + } break; } s++; @@ -63,5 +55,3 @@ void emit_string_constant(ostream& str, char* s) byte_mode(str); str << "\t.byte\t0\t" << endl; } - - diff --git a/assignments/PA5/cool-tree.h b/assignments/PA5/cool-tree.h index a36a353..a662905 100644 --- a/assignments/PA5/cool-tree.h +++ b/assignments/PA5/cool-tree.h @@ -8,10 +8,8 @@ // ////////////////////////////////////////////////////////// - -#include "tree.h" #include "cool-tree.handcode.h" - +#include "tree.h" // define the class for phylum // define simple phylum - Program @@ -19,772 +17,739 @@ typedef class Program_class *Program; class Program_class : public tree_node { public: - tree_node *copy() { return copy_Program(); } - virtual Program copy_Program() = 0; + tree_node *copy() { return copy_Program(); } + virtual Program copy_Program() = 0; #ifdef Program_EXTRAS - Program_EXTRAS + Program_EXTRAS #endif }; - // define simple phylum - Class_ typedef class Class__class *Class_; class Class__class : public tree_node { public: - tree_node *copy() { return copy_Class_(); } - virtual Class_ copy_Class_() = 0; + tree_node *copy() { return copy_Class_(); } + virtual Class_ copy_Class_() = 0; #ifdef Class__EXTRAS - Class__EXTRAS + Class__EXTRAS #endif }; - // define simple phylum - Feature typedef class Feature_class *Feature; class Feature_class : public tree_node { public: - tree_node *copy() { return copy_Feature(); } - virtual Feature copy_Feature() = 0; + tree_node *copy() { return copy_Feature(); } + virtual Feature copy_Feature() = 0; #ifdef Feature_EXTRAS - Feature_EXTRAS + Feature_EXTRAS #endif }; - // define simple phylum - Formal typedef class Formal_class *Formal; class Formal_class : public tree_node { public: - tree_node *copy() { return copy_Formal(); } - virtual Formal copy_Formal() = 0; + tree_node *copy() { return copy_Formal(); } + virtual Formal copy_Formal() = 0; #ifdef Formal_EXTRAS - Formal_EXTRAS + Formal_EXTRAS #endif }; - // define simple phylum - Expression typedef class Expression_class *Expression; class Expression_class : public tree_node { public: - tree_node *copy() { return copy_Expression(); } - virtual Expression copy_Expression() = 0; + tree_node *copy() { return copy_Expression(); } + virtual Expression copy_Expression() = 0; #ifdef Expression_EXTRAS - Expression_EXTRAS + Expression_EXTRAS #endif }; - // define simple phylum - Case typedef class Case_class *Case; class Case_class : public tree_node { public: - tree_node *copy() { return copy_Case(); } - virtual Case copy_Case() = 0; + tree_node *copy() { return copy_Case(); } + virtual Case copy_Case() = 0; #ifdef Case_EXTRAS - Case_EXTRAS + Case_EXTRAS #endif }; - // define the class for phylum - LIST // define list phlyum - Classes typedef list_node Classes_class; typedef Classes_class *Classes; - // define list phlyum - Features typedef list_node Features_class; typedef Features_class *Features; - // define list phlyum - Formals typedef list_node Formals_class; typedef Formals_class *Formals; - // define list phlyum - Expressions typedef list_node Expressions_class; typedef Expressions_class *Expressions; - // define list phlyum - Cases typedef list_node Cases_class; typedef Cases_class *Cases; - // define the class for constructors // define constructor - program class program_class : public Program_class { public: - Classes classes; + Classes classes; + public: - program_class(Classes a1) { - classes = a1; - } - Program copy_Program(); - void dump(ostream& stream, int n); + program_class(Classes a1) { classes = a1; } + Program copy_Program(); + void dump(ostream &stream, int n); #ifdef Program_SHARED_EXTRAS - Program_SHARED_EXTRAS + Program_SHARED_EXTRAS #endif #ifdef program_EXTRAS - program_EXTRAS + program_EXTRAS #endif }; - // define constructor - class_ class class__class : public Class__class { public: - Symbol name; - Symbol parent; - Features features; - Symbol filename; + Symbol name; + Symbol parent; + Features features; + Symbol filename; + public: - class__class(Symbol a1, Symbol a2, Features a3, Symbol a4) { - name = a1; - parent = a2; - features = a3; - filename = a4; - } - Class_ copy_Class_(); - void dump(ostream& stream, int n); + class__class(Symbol a1, Symbol a2, Features a3, Symbol a4) { + name = a1; + parent = a2; + features = a3; + filename = a4; + } + Class_ copy_Class_(); + void dump(ostream &stream, int n); #ifdef Class__SHARED_EXTRAS - Class__SHARED_EXTRAS + Class__SHARED_EXTRAS #endif #ifdef class__EXTRAS - class__EXTRAS + class__EXTRAS #endif }; - // define constructor - method class method_class : public Feature_class { public: - Symbol name; - Formals formals; - Symbol return_type; - Expression expr; + Symbol name; + Formals formals; + Symbol return_type; + Expression expr; + public: - method_class(Symbol a1, Formals a2, Symbol a3, Expression a4) { - name = a1; - formals = a2; - return_type = a3; - expr = a4; - } - Feature copy_Feature(); - void dump(ostream& stream, int n); + method_class(Symbol a1, Formals a2, Symbol a3, Expression a4) { + name = a1; + formals = a2; + return_type = a3; + expr = a4; + } + Feature copy_Feature(); + void dump(ostream &stream, int n); #ifdef Feature_SHARED_EXTRAS - Feature_SHARED_EXTRAS + Feature_SHARED_EXTRAS #endif #ifdef method_EXTRAS - method_EXTRAS + method_EXTRAS #endif }; - // define constructor - attr class attr_class : public Feature_class { public: - Symbol name; - Symbol type_decl; - Expression init; + Symbol name; + Symbol type_decl; + Expression init; + public: - attr_class(Symbol a1, Symbol a2, Expression a3) { - name = a1; - type_decl = a2; - init = a3; - } - Feature copy_Feature(); - void dump(ostream& stream, int n); + attr_class(Symbol a1, Symbol a2, Expression a3) { + name = a1; + type_decl = a2; + init = a3; + } + Feature copy_Feature(); + void dump(ostream &stream, int n); #ifdef Feature_SHARED_EXTRAS - Feature_SHARED_EXTRAS + Feature_SHARED_EXTRAS #endif #ifdef attr_EXTRAS - attr_EXTRAS + attr_EXTRAS #endif }; - // define constructor - formal class formal_class : public Formal_class { public: - Symbol name; - Symbol type_decl; + Symbol name; + Symbol type_decl; + public: - formal_class(Symbol a1, Symbol a2) { - name = a1; - type_decl = a2; - } - Formal copy_Formal(); - void dump(ostream& stream, int n); + formal_class(Symbol a1, Symbol a2) { + name = a1; + type_decl = a2; + } + Formal copy_Formal(); + void dump(ostream &stream, int n); #ifdef Formal_SHARED_EXTRAS - Formal_SHARED_EXTRAS + Formal_SHARED_EXTRAS #endif #ifdef formal_EXTRAS - formal_EXTRAS + formal_EXTRAS #endif }; - // define constructor - branch class branch_class : public Case_class { public: - Symbol name; - Symbol type_decl; - Expression expr; + Symbol name; + Symbol type_decl; + Expression expr; + public: - branch_class(Symbol a1, Symbol a2, Expression a3) { - name = a1; - type_decl = a2; - expr = a3; - } - Case copy_Case(); - void dump(ostream& stream, int n); + branch_class(Symbol a1, Symbol a2, Expression a3) { + name = a1; + type_decl = a2; + expr = a3; + } + Case copy_Case(); + void dump(ostream &stream, int n); #ifdef Case_SHARED_EXTRAS - Case_SHARED_EXTRAS + Case_SHARED_EXTRAS #endif #ifdef branch_EXTRAS - branch_EXTRAS + branch_EXTRAS #endif }; - // define constructor - assign class assign_class : public Expression_class { public: - Symbol name; - Expression expr; + Symbol name; + Expression expr; + public: - assign_class(Symbol a1, Expression a2) { - name = a1; - expr = a2; - } - Expression copy_Expression(); - void dump(ostream& stream, int n); + assign_class(Symbol a1, Expression a2) { + name = a1; + expr = a2; + } + Expression copy_Expression(); + void dump(ostream &stream, int n); #ifdef Expression_SHARED_EXTRAS - Expression_SHARED_EXTRAS + Expression_SHARED_EXTRAS #endif #ifdef assign_EXTRAS - assign_EXTRAS + assign_EXTRAS #endif }; - // define constructor - static_dispatch class static_dispatch_class : public Expression_class { public: - Expression expr; - Symbol type_name; - Symbol name; - Expressions actual; + Expression expr; + Symbol type_name; + Symbol name; + Expressions actual; + public: - static_dispatch_class(Expression a1, Symbol a2, Symbol a3, Expressions a4) { - expr = a1; - type_name = a2; - name = a3; - actual = a4; - } - Expression copy_Expression(); - void dump(ostream& stream, int n); + static_dispatch_class(Expression a1, Symbol a2, Symbol a3, Expressions a4) { + expr = a1; + type_name = a2; + name = a3; + actual = a4; + } + Expression copy_Expression(); + void dump(ostream &stream, int n); #ifdef Expression_SHARED_EXTRAS - Expression_SHARED_EXTRAS + Expression_SHARED_EXTRAS #endif #ifdef static_dispatch_EXTRAS - static_dispatch_EXTRAS + static_dispatch_EXTRAS #endif }; - // define constructor - dispatch class dispatch_class : public Expression_class { public: - Expression expr; - Symbol name; - Expressions actual; + Expression expr; + Symbol name; + Expressions actual; + public: - dispatch_class(Expression a1, Symbol a2, Expressions a3) { - expr = a1; - name = a2; - actual = a3; - } - Expression copy_Expression(); - void dump(ostream& stream, int n); + dispatch_class(Expression a1, Symbol a2, Expressions a3) { + expr = a1; + name = a2; + actual = a3; + } + Expression copy_Expression(); + void dump(ostream &stream, int n); #ifdef Expression_SHARED_EXTRAS - Expression_SHARED_EXTRAS + Expression_SHARED_EXTRAS #endif #ifdef dispatch_EXTRAS - dispatch_EXTRAS + dispatch_EXTRAS #endif }; - // define constructor - cond class cond_class : public Expression_class { public: - Expression pred; - Expression then_exp; - Expression else_exp; + Expression pred; + Expression then_exp; + Expression else_exp; + public: - cond_class(Expression a1, Expression a2, Expression a3) { - pred = a1; - then_exp = a2; - else_exp = a3; - } - Expression copy_Expression(); - void dump(ostream& stream, int n); + cond_class(Expression a1, Expression a2, Expression a3) { + pred = a1; + then_exp = a2; + else_exp = a3; + } + Expression copy_Expression(); + void dump(ostream &stream, int n); #ifdef Expression_SHARED_EXTRAS - Expression_SHARED_EXTRAS + Expression_SHARED_EXTRAS #endif #ifdef cond_EXTRAS - cond_EXTRAS + cond_EXTRAS #endif }; - // define constructor - loop class loop_class : public Expression_class { public: - Expression pred; - Expression body; + Expression pred; + Expression body; + public: - loop_class(Expression a1, Expression a2) { - pred = a1; - body = a2; - } - Expression copy_Expression(); - void dump(ostream& stream, int n); + loop_class(Expression a1, Expression a2) { + pred = a1; + body = a2; + } + Expression copy_Expression(); + void dump(ostream &stream, int n); #ifdef Expression_SHARED_EXTRAS - Expression_SHARED_EXTRAS + Expression_SHARED_EXTRAS #endif #ifdef loop_EXTRAS - loop_EXTRAS + loop_EXTRAS #endif }; - // define constructor - typcase class typcase_class : public Expression_class { public: - Expression expr; - Cases cases; + Expression expr; + Cases cases; + public: - typcase_class(Expression a1, Cases a2) { - expr = a1; - cases = a2; - } - Expression copy_Expression(); - void dump(ostream& stream, int n); + typcase_class(Expression a1, Cases a2) { + expr = a1; + cases = a2; + } + Expression copy_Expression(); + void dump(ostream &stream, int n); #ifdef Expression_SHARED_EXTRAS - Expression_SHARED_EXTRAS + Expression_SHARED_EXTRAS #endif #ifdef typcase_EXTRAS - typcase_EXTRAS + typcase_EXTRAS #endif }; - // define constructor - block class block_class : public Expression_class { public: - Expressions body; + Expressions body; + public: - block_class(Expressions a1) { - body = a1; - } - Expression copy_Expression(); - void dump(ostream& stream, int n); + block_class(Expressions a1) { body = a1; } + Expression copy_Expression(); + void dump(ostream &stream, int n); #ifdef Expression_SHARED_EXTRAS - Expression_SHARED_EXTRAS + Expression_SHARED_EXTRAS #endif #ifdef block_EXTRAS - block_EXTRAS + block_EXTRAS #endif }; - // define constructor - let class let_class : public Expression_class { public: - Symbol identifier; - Symbol type_decl; - Expression init; - Expression body; + Symbol identifier; + Symbol type_decl; + Expression init; + Expression body; + public: - let_class(Symbol a1, Symbol a2, Expression a3, Expression a4) { - identifier = a1; - type_decl = a2; - init = a3; - body = a4; - } - Expression copy_Expression(); - void dump(ostream& stream, int n); + let_class(Symbol a1, Symbol a2, Expression a3, Expression a4) { + identifier = a1; + type_decl = a2; + init = a3; + body = a4; + } + Expression copy_Expression(); + void dump(ostream &stream, int n); #ifdef Expression_SHARED_EXTRAS - Expression_SHARED_EXTRAS + Expression_SHARED_EXTRAS #endif #ifdef let_EXTRAS - let_EXTRAS + let_EXTRAS #endif }; - // define constructor - plus class plus_class : public Expression_class { public: - Expression e1; - Expression e2; + Expression e1; + Expression e2; + public: - plus_class(Expression a1, Expression a2) { - e1 = a1; - e2 = a2; - } - Expression copy_Expression(); - void dump(ostream& stream, int n); + plus_class(Expression a1, Expression a2) { + e1 = a1; + e2 = a2; + } + Expression copy_Expression(); + void dump(ostream &stream, int n); #ifdef Expression_SHARED_EXTRAS - Expression_SHARED_EXTRAS + Expression_SHARED_EXTRAS #endif #ifdef plus_EXTRAS - plus_EXTRAS + plus_EXTRAS #endif }; - // define constructor - sub class sub_class : public Expression_class { public: - Expression e1; - Expression e2; + Expression e1; + Expression e2; + public: - sub_class(Expression a1, Expression a2) { - e1 = a1; - e2 = a2; - } - Expression copy_Expression(); - void dump(ostream& stream, int n); + sub_class(Expression a1, Expression a2) { + e1 = a1; + e2 = a2; + } + Expression copy_Expression(); + void dump(ostream &stream, int n); #ifdef Expression_SHARED_EXTRAS - Expression_SHARED_EXTRAS + Expression_SHARED_EXTRAS #endif #ifdef sub_EXTRAS - sub_EXTRAS + sub_EXTRAS #endif }; - // define constructor - mul class mul_class : public Expression_class { public: - Expression e1; - Expression e2; + Expression e1; + Expression e2; + public: - mul_class(Expression a1, Expression a2) { - e1 = a1; - e2 = a2; - } - Expression copy_Expression(); - void dump(ostream& stream, int n); + mul_class(Expression a1, Expression a2) { + e1 = a1; + e2 = a2; + } + Expression copy_Expression(); + void dump(ostream &stream, int n); #ifdef Expression_SHARED_EXTRAS - Expression_SHARED_EXTRAS + Expression_SHARED_EXTRAS #endif #ifdef mul_EXTRAS - mul_EXTRAS + mul_EXTRAS #endif }; - // define constructor - divide class divide_class : public Expression_class { public: - Expression e1; - Expression e2; + Expression e1; + Expression e2; + public: - divide_class(Expression a1, Expression a2) { - e1 = a1; - e2 = a2; - } - Expression copy_Expression(); - void dump(ostream& stream, int n); + divide_class(Expression a1, Expression a2) { + e1 = a1; + e2 = a2; + } + Expression copy_Expression(); + void dump(ostream &stream, int n); #ifdef Expression_SHARED_EXTRAS - Expression_SHARED_EXTRAS + Expression_SHARED_EXTRAS #endif #ifdef divide_EXTRAS - divide_EXTRAS + divide_EXTRAS #endif }; - // define constructor - neg class neg_class : public Expression_class { public: - Expression e1; + Expression e1; + public: - neg_class(Expression a1) { - e1 = a1; - } - Expression copy_Expression(); - void dump(ostream& stream, int n); + neg_class(Expression a1) { e1 = a1; } + Expression copy_Expression(); + void dump(ostream &stream, int n); #ifdef Expression_SHARED_EXTRAS - Expression_SHARED_EXTRAS + Expression_SHARED_EXTRAS #endif #ifdef neg_EXTRAS - neg_EXTRAS + neg_EXTRAS #endif }; - // define constructor - lt class lt_class : public Expression_class { public: - Expression e1; - Expression e2; + Expression e1; + Expression e2; + public: - lt_class(Expression a1, Expression a2) { - e1 = a1; - e2 = a2; - } - Expression copy_Expression(); - void dump(ostream& stream, int n); + lt_class(Expression a1, Expression a2) { + e1 = a1; + e2 = a2; + } + Expression copy_Expression(); + void dump(ostream &stream, int n); #ifdef Expression_SHARED_EXTRAS - Expression_SHARED_EXTRAS + Expression_SHARED_EXTRAS #endif #ifdef lt_EXTRAS - lt_EXTRAS + lt_EXTRAS #endif }; - // define constructor - eq class eq_class : public Expression_class { public: - Expression e1; - Expression e2; + Expression e1; + Expression e2; + public: - eq_class(Expression a1, Expression a2) { - e1 = a1; - e2 = a2; - } - Expression copy_Expression(); - void dump(ostream& stream, int n); + eq_class(Expression a1, Expression a2) { + e1 = a1; + e2 = a2; + } + Expression copy_Expression(); + void dump(ostream &stream, int n); #ifdef Expression_SHARED_EXTRAS - Expression_SHARED_EXTRAS + Expression_SHARED_EXTRAS #endif #ifdef eq_EXTRAS - eq_EXTRAS + eq_EXTRAS #endif }; - // define constructor - leq class leq_class : public Expression_class { public: - Expression e1; - Expression e2; + Expression e1; + Expression e2; + public: - leq_class(Expression a1, Expression a2) { - e1 = a1; - e2 = a2; - } - Expression copy_Expression(); - void dump(ostream& stream, int n); + leq_class(Expression a1, Expression a2) { + e1 = a1; + e2 = a2; + } + Expression copy_Expression(); + void dump(ostream &stream, int n); #ifdef Expression_SHARED_EXTRAS - Expression_SHARED_EXTRAS + Expression_SHARED_EXTRAS #endif #ifdef leq_EXTRAS - leq_EXTRAS + leq_EXTRAS #endif }; - // define constructor - comp class comp_class : public Expression_class { public: - Expression e1; + Expression e1; + public: - comp_class(Expression a1) { - e1 = a1; - } - Expression copy_Expression(); - void dump(ostream& stream, int n); + comp_class(Expression a1) { e1 = a1; } + Expression copy_Expression(); + void dump(ostream &stream, int n); #ifdef Expression_SHARED_EXTRAS - Expression_SHARED_EXTRAS + Expression_SHARED_EXTRAS #endif #ifdef comp_EXTRAS - comp_EXTRAS + comp_EXTRAS #endif }; - // define constructor - int_const class int_const_class : public Expression_class { public: - Symbol token; + Symbol token; + public: - int_const_class(Symbol a1) { - token = a1; - } - Expression copy_Expression(); - void dump(ostream& stream, int n); + int_const_class(Symbol a1) { token = a1; } + Expression copy_Expression(); + void dump(ostream &stream, int n); #ifdef Expression_SHARED_EXTRAS - Expression_SHARED_EXTRAS + Expression_SHARED_EXTRAS #endif #ifdef int_const_EXTRAS - int_const_EXTRAS + int_const_EXTRAS #endif }; - // define constructor - bool_const class bool_const_class : public Expression_class { public: - Boolean val; + Boolean val; + public: - bool_const_class(Boolean a1) { - val = a1; - } - Expression copy_Expression(); - void dump(ostream& stream, int n); + bool_const_class(Boolean a1) { val = a1; } + Expression copy_Expression(); + void dump(ostream &stream, int n); #ifdef Expression_SHARED_EXTRAS - Expression_SHARED_EXTRAS + Expression_SHARED_EXTRAS #endif #ifdef bool_const_EXTRAS - bool_const_EXTRAS + bool_const_EXTRAS #endif }; - // define constructor - string_const class string_const_class : public Expression_class { public: - Symbol token; + Symbol token; + public: - string_const_class(Symbol a1) { - token = a1; - } - Expression copy_Expression(); - void dump(ostream& stream, int n); + string_const_class(Symbol a1) { token = a1; } + Expression copy_Expression(); + void dump(ostream &stream, int n); #ifdef Expression_SHARED_EXTRAS - Expression_SHARED_EXTRAS + Expression_SHARED_EXTRAS #endif #ifdef string_const_EXTRAS - string_const_EXTRAS + string_const_EXTRAS #endif }; - // define constructor - new_ class new__class : public Expression_class { public: - Symbol type_name; + Symbol type_name; + public: - new__class(Symbol a1) { - type_name = a1; - } - Expression copy_Expression(); - void dump(ostream& stream, int n); + new__class(Symbol a1) { type_name = a1; } + Expression copy_Expression(); + void dump(ostream &stream, int n); #ifdef Expression_SHARED_EXTRAS - Expression_SHARED_EXTRAS + Expression_SHARED_EXTRAS #endif #ifdef new__EXTRAS - new__EXTRAS + new__EXTRAS #endif }; - // define constructor - isvoid class isvoid_class : public Expression_class { public: - Expression e1; + Expression e1; + public: - isvoid_class(Expression a1) { - e1 = a1; - } - Expression copy_Expression(); - void dump(ostream& stream, int n); + isvoid_class(Expression a1) { e1 = a1; } + Expression copy_Expression(); + void dump(ostream &stream, int n); #ifdef Expression_SHARED_EXTRAS - Expression_SHARED_EXTRAS + Expression_SHARED_EXTRAS #endif #ifdef isvoid_EXTRAS - isvoid_EXTRAS + isvoid_EXTRAS #endif }; - // define constructor - no_expr class no_expr_class : public Expression_class { public: public: - no_expr_class() { - } - Expression copy_Expression(); - void dump(ostream& stream, int n); + no_expr_class() {} + Expression copy_Expression(); + void dump(ostream &stream, int n); #ifdef Expression_SHARED_EXTRAS - Expression_SHARED_EXTRAS + Expression_SHARED_EXTRAS #endif #ifdef no_expr_EXTRAS - no_expr_EXTRAS + no_expr_EXTRAS #endif }; - // define constructor - object class object_class : public Expression_class { public: - Symbol name; + Symbol name; + public: - object_class(Symbol a1) { - name = a1; - } - Expression copy_Expression(); - void dump(ostream& stream, int n); + object_class(Symbol a1) { name = a1; } + Expression copy_Expression(); + void dump(ostream &stream, int n); #ifdef Expression_SHARED_EXTRAS - Expression_SHARED_EXTRAS + Expression_SHARED_EXTRAS #endif #ifdef object_EXTRAS - object_EXTRAS + object_EXTRAS #endif }; - // define the prototypes of the interface Classes nil_Classes(); Classes single_Classes(Class_); @@ -832,5 +797,4 @@ Expression isvoid(Expression); Expression no_expr(); Expression object(Symbol); - #endif diff --git a/assignments/PA5/cool-tree.handcode.h b/assignments/PA5/cool-tree.handcode.h index 2a6c076..e68e60f 100644 --- a/assignments/PA5/cool-tree.handcode.h +++ b/assignments/PA5/cool-tree.handcode.h @@ -4,19 +4,20 @@ #ifndef COOL_TREE_HANDCODE_H #define COOL_TREE_HANDCODE_H -#include -#include "tree.h" #include "cool.h" #include "stringtab.h" +#include "tree.h" +#include #define yylineno curr_lineno; extern int yylineno; -inline Boolean copy_Boolean(Boolean b) {return b; } +inline Boolean copy_Boolean(Boolean b) { return b; } inline void assert_Boolean(Boolean) {} -inline void dump_Boolean(ostream& stream, int padding, Boolean b) - { stream << pad(padding) << (int) b << "\n"; } +inline void dump_Boolean(ostream &stream, int padding, Boolean b) { + stream << pad(padding) << (int)b << "\n"; +} -void dump_Symbol(ostream& stream, int padding, Symbol b); +void dump_Symbol(ostream &stream, int padding, Symbol b); void assert_Symbol(Symbol b); Symbol copy_Symbol(Symbol b); @@ -44,66 +45,52 @@ typedef Expressions_class *Expressions; typedef list_node Cases_class; typedef Cases_class *Cases; -#define Program_EXTRAS \ -virtual void cgen(ostream&) = 0; \ -virtual void dump_with_types(ostream&, int) = 0; +#define Program_EXTRAS \ + virtual void cgen(ostream &) = 0; \ + virtual void dump_with_types(ostream &, int) = 0; +#define program_EXTRAS \ + void cgen(ostream &); \ + void dump_with_types(ostream &, int); +#define Class__EXTRAS \ + virtual Symbol get_name() = 0; \ + virtual Symbol get_parent() = 0; \ + virtual Symbol get_filename() = 0; \ + virtual void dump_with_types(ostream &, int) = 0; -#define program_EXTRAS \ -void cgen(ostream&); \ -void dump_with_types(ostream&, int); +#define class__EXTRAS \ + Symbol get_name() { return name; } \ + Symbol get_parent() { return parent; } \ + Symbol get_filename() { return filename; } \ + void dump_with_types(ostream &, int); -#define Class__EXTRAS \ -virtual Symbol get_name() = 0; \ -virtual Symbol get_parent() = 0; \ -virtual Symbol get_filename() = 0; \ -virtual void dump_with_types(ostream&,int) = 0; +#define Feature_EXTRAS virtual void dump_with_types(ostream &, int) = 0; +#define Feature_SHARED_EXTRAS void dump_with_types(ostream &, int); -#define class__EXTRAS \ -Symbol get_name() { return name; } \ -Symbol get_parent() { return parent; } \ -Symbol get_filename() { return filename; } \ -void dump_with_types(ostream&,int); +#define Formal_EXTRAS virtual void dump_with_types(ostream &, int) = 0; +#define formal_EXTRAS void dump_with_types(ostream &, int); -#define Feature_EXTRAS \ -virtual void dump_with_types(ostream&,int) = 0; +#define Case_EXTRAS virtual void dump_with_types(ostream &, int) = 0; +#define branch_EXTRAS void dump_with_types(ostream &, int); -#define Feature_SHARED_EXTRAS \ -void dump_with_types(ostream&,int); - - -#define Formal_EXTRAS \ -virtual void dump_with_types(ostream&,int) = 0; - - -#define formal_EXTRAS \ -void dump_with_types(ostream&,int); - - -#define Case_EXTRAS \ -virtual void dump_with_types(ostream& ,int) = 0; - - -#define branch_EXTRAS \ -void dump_with_types(ostream& ,int); - - -#define Expression_EXTRAS \ -Symbol type; \ -Symbol get_type() { return type; } \ -Expression set_type(Symbol s) { type = s; return this; } \ -virtual void code(ostream&) = 0; \ -virtual void dump_with_types(ostream&,int) = 0; \ -void dump_type(ostream&, int); \ -Expression_class() { type = (Symbol) NULL; } - -#define Expression_SHARED_EXTRAS \ -void code(ostream&); \ -void dump_with_types(ostream&,int); +#define Expression_EXTRAS \ + Symbol type; \ + Symbol get_type() { return type; } \ + Expression set_type(Symbol s) { \ + type = s; \ + return this; \ + } \ + virtual void code(ostream &) = 0; \ + virtual void dump_with_types(ostream &, int) = 0; \ + void dump_type(ostream &, int); \ + Expression_class() { type = (Symbol)NULL; } +#define Expression_SHARED_EXTRAS \ + void code(ostream &); \ + void dump_with_types(ostream &, int); #endif diff --git a/assignments/PA5/example.cl b/assignments/PA5/example.cl index d26ffba..89fd448 100644 --- a/assignments/PA5/example.cl +++ b/assignments/PA5/example.cl @@ -3,7 +3,27 @@ as possible. *) -class Main { +class A inherits IO { + attr_A_1 : Int <- 10; + attr_A_2 : Bool <- false; + attr_A_3 : A <- self; + method_common(x1: Int) : SELF_TYPE { + self + }; +}; + +class B inherits A { + +}; + +class C inherits A { + attr_C_1 : String <- "This is C\n"; + method_common(x1: Int) : SELF_TYPE { + self + }; +}; + +class Main inherits IO { main():Int { 0 }; }; diff --git a/handouts/cool-runtime.pdf b/handouts/cool-runtime.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e7aaf48008cef4a6af6f157eccc0b3f28fde827a GIT binary patch literal 92761 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