prepare for expr typing
This commit is contained in:
parent
cde6479576
commit
1b3f14ab34
@ -90,4 +90,9 @@ class Err5 {
|
||||
hello(): NOEXIST { new Object };
|
||||
bye(): Bool { 10 };
|
||||
-- ala: Int <- 20;
|
||||
};
|
||||
|
||||
class Err7 {
|
||||
ala: Bool <- lal;
|
||||
lal: NOEXIST <- 10;
|
||||
};
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user