prepare for expr typing

This commit is contained in:
ridethepig 2023-03-25 16:15:53 +00:00
parent cde6479576
commit 1b3f14ab34
4 changed files with 154 additions and 16 deletions

View File

@ -90,4 +90,9 @@ class Err5 {
hello(): NOEXIST { new Object };
bye(): Bool { 10 };
-- ala: Int <- 20;
};
class Err7 {
ala: Bool <- lal;
lal: NOEXIST <- 10;
};

View File

@ -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

View File

@ -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

View File

@ -9,6 +9,7 @@
#include <queue>
#include <memory.h>
#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)
{
}
}
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;
}