diff --git a/assignments/PA4/bad_inherit.cl b/assignments/PA4/bad_inherit.cl index a2ee04b..f6b6d46 100644 --- a/assignments/PA4/bad_inherit.cl +++ b/assignments/PA4/bad_inherit.cl @@ -90,4 +90,9 @@ class Err5 { hello(): NOEXIST { new Object }; bye(): Bool { 10 }; -- ala: Int <- 20; +}; + +class Err7 { + ala: Bool <- lal; + lal: NOEXIST <- 10; }; \ No newline at end of file diff --git a/assignments/PA4/cool-tree.h b/assignments/PA4/cool-tree.h index 679d727..8fad60d 100644 --- a/assignments/PA4/cool-tree.h +++ b/assignments/PA4/cool-tree.h @@ -80,7 +80,7 @@ class Expression_class : public tree_node { public: tree_node *copy() { return copy_Expression(); } virtual Expression copy_Expression() = 0; - + virtual Symbol semant(Class_, ClassTable*) = 0; #ifdef Expression_EXTRAS Expression_EXTRAS #endif diff --git a/assignments/PA4/cool-tree.handcode.h b/assignments/PA4/cool-tree.handcode.h index 9f7abcf..2abc2e2 100644 --- a/assignments/PA4/cool-tree.handcode.h +++ b/assignments/PA4/cool-tree.handcode.h @@ -100,6 +100,7 @@ void dump_type(ostream&, int); \ Expression_class() { type = (Symbol) NULL; } #define Expression_SHARED_EXTRAS \ -void dump_with_types(ostream&,int); +void dump_with_types(ostream&,int); \ +Symbol semant(Class_, ClassTable*); #endif diff --git a/assignments/PA4/semant.cc b/assignments/PA4/semant.cc index 53dd47a..c391a10 100644 --- a/assignments/PA4/semant.cc +++ b/assignments/PA4/semant.cc @@ -9,6 +9,7 @@ #include #include #include "cool-tree.h" +#include "cool-tree.handcode.h" #include "semant.h" #include "utilities.h" @@ -546,26 +547,157 @@ void class__class::semant(ClassTable * classtable) void attr_class::semant(Class_ cur_class, ClassTable * classtable) { - if (typeid(*init) == typeid(no_expr_class)) { - /* - * Attr-No-Init: - * Check if Declared Type is defined, if so, do nothing because already - * in AST; else, error report and set its type to Object - */ - if (!classtable->class_exist(type_decl)) { + /* + * Attr-No-Init: + * Check if Declared Type is defined, if so, do nothing because already + * in AST; else, error report and set its type to Object + */ + if (!classtable->class_exist(type_decl)) { + classtable->semant_error(cur_class->get_filename(), this) + << "Class " << type_decl + << " of attribute " << name + << " is undefined.\n"; + this->type_decl = Object; + } + /* + * Attr-Init: + * Except checking existence of type_decl, type the init expression and + * check rhs's type conformance with type_decl + */ + if (typeid(*init) != typeid(no_expr_class)) { + auto rhs_type = init->semant(cur_class, classtable); + if (!classtable->conform(rhs_type, type_decl)) { classtable->semant_error(cur_class->get_filename(), this) - << "Class " << type_decl - << " of attribute " << name - << " is undefined.\n"; + << "Inferred type " << rhs_type + << " of initialization of attribute " << name + << " does not conform to declared type " << type_decl + << " .\n"; this->type_decl = Object; } } - else { - // Attr-Init - } } void method_class::semant(Class_ cur_class, ClassTable * classtable) { -} \ No newline at end of file +} + +Symbol assign_class::semant(Class_ cur_class, ClassTable* classtable) +{ + return Object; +} + +Symbol static_dispatch_class::semant(Class_ cur_class, ClassTable* classtable) +{ + return Object; +} + +Symbol dispatch_class::semant(Class_ cur_class, ClassTable* classtable) +{ + return Object; +} + +Symbol cond_class::semant(Class_ cur_class, ClassTable* classtable) +{ + return Object; +} + +Symbol loop_class::semant(Class_ cur_class, ClassTable* classtable) +{ + return Object; +} + +Symbol typcase_class::semant(Class_ cur_class, ClassTable* classtable) +{ + return Object; +} + +Symbol block_class::semant(Class_ cur_class, ClassTable* classtable) +{ + return Object; +} + +Symbol let_class::semant(Class_ cur_class, ClassTable* classtable) +{ + return Object; +} + +Symbol plus_class::semant(Class_ cur_class, ClassTable* classtable) +{ + return Object; +} + +Symbol sub_class::semant(Class_ cur_class, ClassTable* classtable) +{ + return Object; +} + +Symbol mul_class::semant(Class_ cur_class, ClassTable* classtable) +{ + return Object; +} + +Symbol divide_class::semant(Class_ cur_class, ClassTable* classtable) +{ + return Object; +} + +Symbol neg_class::semant(Class_ cur_class, ClassTable* classtable) +{ + return Object; +} + +Symbol lt_class::semant(Class_ cur_class, ClassTable* classtable) +{ + return Object; +} + +Symbol eq_class::semant(Class_ cur_class, ClassTable* classtable) +{ + return Object; +} + +Symbol leq_class::semant(Class_ cur_class, ClassTable* classtable) +{ + return Object; +} + +Symbol comp_class::semant(Class_ cur_class, ClassTable* classtable) +{ + return Object; +} + +Symbol int_const_class::semant(Class_ cur_class, ClassTable* classtable) +{ + return Object; +} + +Symbol bool_const_class::semant(Class_ cur_class, ClassTable* classtable) +{ + return Object; +} + +Symbol string_const_class::semant(Class_ cur_class, ClassTable* classtable) +{ + return Object; +} + +Symbol new__class::semant(Class_ cur_class, ClassTable* classtable) +{ + return Object; +} + +Symbol isvoid_class::semant(Class_ cur_class, ClassTable* classtable) +{ + return Object; +} + +Symbol no_expr_class::semant(Class_ cur_class, ClassTable* classtable) +{ + return Object; +} + +Symbol object_class::semant(Class_ cur_class, ClassTable* classtable) +{ + return Object; +}