prepare for expr typing
This commit is contained in:
parent
cde6479576
commit
1b3f14ab34
@ -90,4 +90,9 @@ class Err5 {
|
|||||||
hello(): NOEXIST { new Object };
|
hello(): NOEXIST { new Object };
|
||||||
bye(): Bool { 10 };
|
bye(): Bool { 10 };
|
||||||
-- ala: Int <- 20;
|
-- ala: Int <- 20;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Err7 {
|
||||||
|
ala: Bool <- lal;
|
||||||
|
lal: NOEXIST <- 10;
|
||||||
};
|
};
|
||||||
@ -80,7 +80,7 @@ class Expression_class : public tree_node {
|
|||||||
public:
|
public:
|
||||||
tree_node *copy() { return copy_Expression(); }
|
tree_node *copy() { return copy_Expression(); }
|
||||||
virtual Expression copy_Expression() = 0;
|
virtual Expression copy_Expression() = 0;
|
||||||
|
virtual Symbol semant(Class_, ClassTable*) = 0;
|
||||||
#ifdef Expression_EXTRAS
|
#ifdef Expression_EXTRAS
|
||||||
Expression_EXTRAS
|
Expression_EXTRAS
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -100,6 +100,7 @@ void dump_type(ostream&, int); \
|
|||||||
Expression_class() { type = (Symbol) NULL; }
|
Expression_class() { type = (Symbol) NULL; }
|
||||||
|
|
||||||
#define Expression_SHARED_EXTRAS \
|
#define Expression_SHARED_EXTRAS \
|
||||||
void dump_with_types(ostream&,int);
|
void dump_with_types(ostream&,int); \
|
||||||
|
Symbol semant(Class_, ClassTable*);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -9,6 +9,7 @@
|
|||||||
#include <queue>
|
#include <queue>
|
||||||
#include <memory.h>
|
#include <memory.h>
|
||||||
#include "cool-tree.h"
|
#include "cool-tree.h"
|
||||||
|
#include "cool-tree.handcode.h"
|
||||||
#include "semant.h"
|
#include "semant.h"
|
||||||
#include "utilities.h"
|
#include "utilities.h"
|
||||||
|
|
||||||
@ -546,26 +547,157 @@ void class__class::semant(ClassTable * classtable)
|
|||||||
|
|
||||||
void attr_class::semant(Class_ cur_class, ClassTable * classtable)
|
void attr_class::semant(Class_ cur_class, ClassTable * classtable)
|
||||||
{
|
{
|
||||||
if (typeid(*init) == typeid(no_expr_class)) {
|
/*
|
||||||
/*
|
* Attr-No-Init:
|
||||||
* Attr-No-Init:
|
* Check if Declared Type is defined, if so, do nothing because already
|
||||||
* Check if Declared Type is defined, if so, do nothing because already
|
* in AST; else, error report and set its type to Object
|
||||||
* in AST; else, error report and set its type to Object
|
*/
|
||||||
*/
|
if (!classtable->class_exist(type_decl)) {
|
||||||
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)
|
classtable->semant_error(cur_class->get_filename(), this)
|
||||||
<< "Class " << type_decl
|
<< "Inferred type " << rhs_type
|
||||||
<< " of attribute " << name
|
<< " of initialization of attribute " << name
|
||||||
<< " is undefined.\n";
|
<< " does not conform to declared type " << type_decl
|
||||||
|
<< " .\n";
|
||||||
this->type_decl = Object;
|
this->type_decl = Object;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
// Attr-Init
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void method_class::semant(Class_ cur_class, ClassTable * classtable)
|
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