From e3673e17d396ab3b34618a0161e15d9ea97d7b15 Mon Sep 17 00:00:00 2001 From: ridethepig Date: Fri, 24 Mar 2023 11:56:17 +0000 Subject: [PATCH] disable inheritance from int bool str --- assignments/PA4/bad_inherit.cl | 8 ++++++++ assignments/PA4/mysemant | 2 +- assignments/PA4/semant.cc | 27 ++++++++++++++++++++------- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/assignments/PA4/bad_inherit.cl b/assignments/PA4/bad_inherit.cl index 7b631e0..7d28689 100644 --- a/assignments/PA4/bad_inherit.cl +++ b/assignments/PA4/bad_inherit.cl @@ -27,6 +27,14 @@ class Ok2_2 inherits Ok1 {}; class Ok3 inherits Ok2_1 {}; class Ok4 inherits Ok2_2 {}; +(* Cool has restrictions on inheriting from basic classes *) + +class Err1 inherits Int {}; +class Err3 inherits String {}; +class Err3 inherits Bool {}; +class Err4 inherits Err3 {}; +class Err4 inherits NOEXIST {}; + class Main inherits IO { main(): Object { diff --git a/assignments/PA4/mysemant b/assignments/PA4/mysemant index f6cb010..c1e21a8 100755 --- a/assignments/PA4/mysemant +++ b/assignments/PA4/mysemant @@ -1,2 +1,2 @@ -#!/bin/csh -f +#!/bin/bash ./lexer $* | ./parser $* | ./semant $* diff --git a/assignments/PA4/semant.cc b/assignments/PA4/semant.cc index 429ffae..56cf5ac 100644 --- a/assignments/PA4/semant.cc +++ b/assignments/PA4/semant.cc @@ -5,6 +5,7 @@ #include #include #include +#include #include "cool-tree.h" #include "semant.h" #include "utilities.h" @@ -88,25 +89,37 @@ static void initialize_constants(void) ClassTable::ClassTable(Classes classes) : semant_errors(0) , error_stream(cerr) { install_basic_classes(); + std::vector class_vec; for (auto i = classes->first(); classes->more(i); i = classes->next(i)) { auto class_i = static_cast(classes->nth(i)); if (name_to_node.find(class_i->get_name()) != name_to_node.end()) { - semant_error(class_i) << "Class `" << class_i->get_name() << "` was previously defined.\n"; + semant_error(class_i) << "Class " << class_i->get_name() << " was previously defined.\n"; } else { name_to_node[class_i->get_name()] = new ClassGraphNode(class_i, nullptr); // null means we have this class, but not yet build inheritence graph for it + class_vec.push_back(class_i); } } - for (auto i = classes->first(); classes->more(i); i = classes->next(i)) { - auto class_i = static_cast(classes->nth(i)); - if (name_to_node.find(class_i->get_parent()) == name_to_node.end()) { + + auto sym_Bool = idtable.lookup_string("Bool"); + auto sym_Int = idtable.lookup_string("Int"); + auto sym_String = idtable.lookup_string("String"); + + for (auto class_i : class_vec) { + auto sym_parent = class_i->get_parent(); + // Cool has restrictions on inheriting from the basic classes + if ( sym_parent == sym_Bool || sym_parent == sym_Int || sym_parent == sym_String) { + semant_error(class_i) << "Class " << class_i->get_name() + << " cannot inherit class " << sym_parent << ".\n"; + } + else if (name_to_node.find(sym_parent) == name_to_node.end()) { semant_error(class_i) << "Class `" << class_i->get_name() << "` inherits from an undefined class `" - << class_i->get_parent() << "`\n"; + << sym_parent << "`\n"; } else { - auto class_parent = name_to_node[class_i->get_parent()]; - assert(class_parent != nullptr); + auto class_parent = name_to_node[sym_parent]; + // assert(class_parent != nullptr); class_parent->append_child(name_to_node[class_i->get_name()]); } }