662 lines
12 KiB
C++
662 lines
12 KiB
C++
//////////////////////////////////////////////////////////
|
|
//
|
|
// file: cool-tree.cc
|
|
//
|
|
// This file defines the functions of each class
|
|
//
|
|
//////////////////////////////////////////////////////////
|
|
|
|
|
|
#include "tree.h"
|
|
#include "cool-tree.handcode.h"
|
|
#include "cool-tree.h"
|
|
|
|
|
|
// constructors' functions
|
|
Program program_class::copy_Program()
|
|
{
|
|
return new program_class(classes->copy_list());
|
|
}
|
|
|
|
|
|
void program_class::dump(ostream& stream, int n)
|
|
{
|
|
stream << pad(n) << "program\n";
|
|
classes->dump(stream, n+2);
|
|
}
|
|
|
|
|
|
Class_ class__class::copy_Class_()
|
|
{
|
|
return new class__class(copy_Symbol(name), copy_Symbol(parent), features->copy_list(), copy_Symbol(filename));
|
|
}
|
|
|
|
|
|
void class__class::dump(ostream& stream, int n)
|
|
{
|
|
stream << pad(n) << "class_\n";
|
|
dump_Symbol(stream, n+2, name);
|
|
dump_Symbol(stream, n+2, parent);
|
|
features->dump(stream, n+2);
|
|
dump_Symbol(stream, n+2, filename);
|
|
}
|
|
|
|
|
|
Feature method_class::copy_Feature()
|
|
{
|
|
return new method_class(copy_Symbol(name), formals->copy_list(), copy_Symbol(return_type), expr->copy_Expression());
|
|
}
|
|
|
|
|
|
void method_class::dump(ostream& stream, int n)
|
|
{
|
|
stream << pad(n) << "method\n";
|
|
dump_Symbol(stream, n+2, name);
|
|
formals->dump(stream, n+2);
|
|
dump_Symbol(stream, n+2, return_type);
|
|
expr->dump(stream, n+2);
|
|
}
|
|
|
|
|
|
Feature attr_class::copy_Feature()
|
|
{
|
|
return new attr_class(copy_Symbol(name), copy_Symbol(type_decl), init->copy_Expression());
|
|
}
|
|
|
|
|
|
void attr_class::dump(ostream& stream, int n)
|
|
{
|
|
stream << pad(n) << "attr\n";
|
|
dump_Symbol(stream, n+2, name);
|
|
dump_Symbol(stream, n+2, type_decl);
|
|
init->dump(stream, n+2);
|
|
}
|
|
|
|
|
|
Formal formal_class::copy_Formal()
|
|
{
|
|
return new formal_class(copy_Symbol(name), copy_Symbol(type_decl));
|
|
}
|
|
|
|
|
|
void formal_class::dump(ostream& stream, int n)
|
|
{
|
|
stream << pad(n) << "formal\n";
|
|
dump_Symbol(stream, n+2, name);
|
|
dump_Symbol(stream, n+2, type_decl);
|
|
}
|
|
|
|
|
|
Case branch_class::copy_Case()
|
|
{
|
|
return new branch_class(copy_Symbol(name), copy_Symbol(type_decl), expr->copy_Expression());
|
|
}
|
|
|
|
|
|
void branch_class::dump(ostream& stream, int n)
|
|
{
|
|
stream << pad(n) << "branch\n";
|
|
dump_Symbol(stream, n+2, name);
|
|
dump_Symbol(stream, n+2, type_decl);
|
|
expr->dump(stream, n+2);
|
|
}
|
|
|
|
|
|
Expression assign_class::copy_Expression()
|
|
{
|
|
return new assign_class(copy_Symbol(name), expr->copy_Expression());
|
|
}
|
|
|
|
|
|
void assign_class::dump(ostream& stream, int n)
|
|
{
|
|
stream << pad(n) << "assign\n";
|
|
dump_Symbol(stream, n+2, name);
|
|
expr->dump(stream, n+2);
|
|
}
|
|
|
|
|
|
Expression static_dispatch_class::copy_Expression()
|
|
{
|
|
return new static_dispatch_class(expr->copy_Expression(), copy_Symbol(type_name), copy_Symbol(name), actual->copy_list());
|
|
}
|
|
|
|
|
|
void static_dispatch_class::dump(ostream& stream, int n)
|
|
{
|
|
stream << pad(n) << "static_dispatch\n";
|
|
expr->dump(stream, n+2);
|
|
dump_Symbol(stream, n+2, type_name);
|
|
dump_Symbol(stream, n+2, name);
|
|
actual->dump(stream, n+2);
|
|
}
|
|
|
|
|
|
Expression dispatch_class::copy_Expression()
|
|
{
|
|
return new dispatch_class(expr->copy_Expression(), copy_Symbol(name), actual->copy_list());
|
|
}
|
|
|
|
|
|
void dispatch_class::dump(ostream& stream, int n)
|
|
{
|
|
stream << pad(n) << "dispatch\n";
|
|
expr->dump(stream, n+2);
|
|
dump_Symbol(stream, n+2, name);
|
|
actual->dump(stream, n+2);
|
|
}
|
|
|
|
|
|
Expression cond_class::copy_Expression()
|
|
{
|
|
return new cond_class(pred->copy_Expression(), then_exp->copy_Expression(), else_exp->copy_Expression());
|
|
}
|
|
|
|
|
|
void cond_class::dump(ostream& stream, int n)
|
|
{
|
|
stream << pad(n) << "cond\n";
|
|
pred->dump(stream, n+2);
|
|
then_exp->dump(stream, n+2);
|
|
else_exp->dump(stream, n+2);
|
|
}
|
|
|
|
|
|
Expression loop_class::copy_Expression()
|
|
{
|
|
return new loop_class(pred->copy_Expression(), body->copy_Expression());
|
|
}
|
|
|
|
|
|
void loop_class::dump(ostream& stream, int n)
|
|
{
|
|
stream << pad(n) << "loop\n";
|
|
pred->dump(stream, n+2);
|
|
body->dump(stream, n+2);
|
|
}
|
|
|
|
|
|
Expression typcase_class::copy_Expression()
|
|
{
|
|
return new typcase_class(expr->copy_Expression(), cases->copy_list());
|
|
}
|
|
|
|
|
|
void typcase_class::dump(ostream& stream, int n)
|
|
{
|
|
stream << pad(n) << "typcase\n";
|
|
expr->dump(stream, n+2);
|
|
cases->dump(stream, n+2);
|
|
}
|
|
|
|
|
|
Expression block_class::copy_Expression()
|
|
{
|
|
return new block_class(body->copy_list());
|
|
}
|
|
|
|
|
|
void block_class::dump(ostream& stream, int n)
|
|
{
|
|
stream << pad(n) << "block\n";
|
|
body->dump(stream, n+2);
|
|
}
|
|
|
|
|
|
Expression let_class::copy_Expression()
|
|
{
|
|
return new let_class(copy_Symbol(identifier), copy_Symbol(type_decl), init->copy_Expression(), body->copy_Expression());
|
|
}
|
|
|
|
|
|
void let_class::dump(ostream& stream, int n)
|
|
{
|
|
stream << pad(n) << "let\n";
|
|
dump_Symbol(stream, n+2, identifier);
|
|
dump_Symbol(stream, n+2, type_decl);
|
|
init->dump(stream, n+2);
|
|
body->dump(stream, n+2);
|
|
}
|
|
|
|
|
|
Expression plus_class::copy_Expression()
|
|
{
|
|
return new plus_class(e1->copy_Expression(), e2->copy_Expression());
|
|
}
|
|
|
|
|
|
void plus_class::dump(ostream& stream, int n)
|
|
{
|
|
stream << pad(n) << "plus\n";
|
|
e1->dump(stream, n+2);
|
|
e2->dump(stream, n+2);
|
|
}
|
|
|
|
|
|
Expression sub_class::copy_Expression()
|
|
{
|
|
return new sub_class(e1->copy_Expression(), e2->copy_Expression());
|
|
}
|
|
|
|
|
|
void sub_class::dump(ostream& stream, int n)
|
|
{
|
|
stream << pad(n) << "sub\n";
|
|
e1->dump(stream, n+2);
|
|
e2->dump(stream, n+2);
|
|
}
|
|
|
|
|
|
Expression mul_class::copy_Expression()
|
|
{
|
|
return new mul_class(e1->copy_Expression(), e2->copy_Expression());
|
|
}
|
|
|
|
|
|
void mul_class::dump(ostream& stream, int n)
|
|
{
|
|
stream << pad(n) << "mul\n";
|
|
e1->dump(stream, n+2);
|
|
e2->dump(stream, n+2);
|
|
}
|
|
|
|
|
|
Expression divide_class::copy_Expression()
|
|
{
|
|
return new divide_class(e1->copy_Expression(), e2->copy_Expression());
|
|
}
|
|
|
|
|
|
void divide_class::dump(ostream& stream, int n)
|
|
{
|
|
stream << pad(n) << "divide\n";
|
|
e1->dump(stream, n+2);
|
|
e2->dump(stream, n+2);
|
|
}
|
|
|
|
|
|
Expression neg_class::copy_Expression()
|
|
{
|
|
return new neg_class(e1->copy_Expression());
|
|
}
|
|
|
|
|
|
void neg_class::dump(ostream& stream, int n)
|
|
{
|
|
stream << pad(n) << "neg\n";
|
|
e1->dump(stream, n+2);
|
|
}
|
|
|
|
|
|
Expression lt_class::copy_Expression()
|
|
{
|
|
return new lt_class(e1->copy_Expression(), e2->copy_Expression());
|
|
}
|
|
|
|
|
|
void lt_class::dump(ostream& stream, int n)
|
|
{
|
|
stream << pad(n) << "lt\n";
|
|
e1->dump(stream, n+2);
|
|
e2->dump(stream, n+2);
|
|
}
|
|
|
|
|
|
Expression eq_class::copy_Expression()
|
|
{
|
|
return new eq_class(e1->copy_Expression(), e2->copy_Expression());
|
|
}
|
|
|
|
|
|
void eq_class::dump(ostream& stream, int n)
|
|
{
|
|
stream << pad(n) << "eq\n";
|
|
e1->dump(stream, n+2);
|
|
e2->dump(stream, n+2);
|
|
}
|
|
|
|
|
|
Expression leq_class::copy_Expression()
|
|
{
|
|
return new leq_class(e1->copy_Expression(), e2->copy_Expression());
|
|
}
|
|
|
|
|
|
void leq_class::dump(ostream& stream, int n)
|
|
{
|
|
stream << pad(n) << "leq\n";
|
|
e1->dump(stream, n+2);
|
|
e2->dump(stream, n+2);
|
|
}
|
|
|
|
|
|
Expression comp_class::copy_Expression()
|
|
{
|
|
return new comp_class(e1->copy_Expression());
|
|
}
|
|
|
|
|
|
void comp_class::dump(ostream& stream, int n)
|
|
{
|
|
stream << pad(n) << "comp\n";
|
|
e1->dump(stream, n+2);
|
|
}
|
|
|
|
|
|
Expression int_const_class::copy_Expression()
|
|
{
|
|
return new int_const_class(copy_Symbol(token));
|
|
}
|
|
|
|
|
|
void int_const_class::dump(ostream& stream, int n)
|
|
{
|
|
stream << pad(n) << "int_const\n";
|
|
dump_Symbol(stream, n+2, token);
|
|
}
|
|
|
|
|
|
Expression bool_const_class::copy_Expression()
|
|
{
|
|
return new bool_const_class(copy_Boolean(val));
|
|
}
|
|
|
|
|
|
void bool_const_class::dump(ostream& stream, int n)
|
|
{
|
|
stream << pad(n) << "bool_const\n";
|
|
dump_Boolean(stream, n+2, val);
|
|
}
|
|
|
|
|
|
Expression string_const_class::copy_Expression()
|
|
{
|
|
return new string_const_class(copy_Symbol(token));
|
|
}
|
|
|
|
|
|
void string_const_class::dump(ostream& stream, int n)
|
|
{
|
|
stream << pad(n) << "string_const\n";
|
|
dump_Symbol(stream, n+2, token);
|
|
}
|
|
|
|
|
|
Expression new__class::copy_Expression()
|
|
{
|
|
return new new__class(copy_Symbol(type_name));
|
|
}
|
|
|
|
|
|
void new__class::dump(ostream& stream, int n)
|
|
{
|
|
stream << pad(n) << "new_\n";
|
|
dump_Symbol(stream, n+2, type_name);
|
|
}
|
|
|
|
|
|
Expression isvoid_class::copy_Expression()
|
|
{
|
|
return new isvoid_class(e1->copy_Expression());
|
|
}
|
|
|
|
|
|
void isvoid_class::dump(ostream& stream, int n)
|
|
{
|
|
stream << pad(n) << "isvoid\n";
|
|
e1->dump(stream, n+2);
|
|
}
|
|
|
|
|
|
Expression no_expr_class::copy_Expression()
|
|
{
|
|
return new no_expr_class();
|
|
}
|
|
|
|
|
|
void no_expr_class::dump(ostream& stream, int n)
|
|
{
|
|
stream << pad(n) << "no_expr\n";
|
|
}
|
|
|
|
|
|
Expression object_class::copy_Expression()
|
|
{
|
|
return new object_class(copy_Symbol(name));
|
|
}
|
|
|
|
|
|
void object_class::dump(ostream& stream, int n)
|
|
{
|
|
stream << pad(n) << "object\n";
|
|
dump_Symbol(stream, n+2, name);
|
|
}
|
|
|
|
|
|
// interfaces used by Bison
|
|
Classes nil_Classes()
|
|
{
|
|
return new nil_node<Class_>();
|
|
}
|
|
|
|
Classes single_Classes(Class_ e)
|
|
{
|
|
return new single_list_node<Class_>(e);
|
|
}
|
|
|
|
Classes append_Classes(Classes p1, Classes p2)
|
|
{
|
|
return new append_node<Class_>(p1, p2);
|
|
}
|
|
|
|
Features nil_Features()
|
|
{
|
|
return new nil_node<Feature>();
|
|
}
|
|
|
|
Features single_Features(Feature e)
|
|
{
|
|
return new single_list_node<Feature>(e);
|
|
}
|
|
|
|
Features append_Features(Features p1, Features p2)
|
|
{
|
|
return new append_node<Feature>(p1, p2);
|
|
}
|
|
|
|
Formals nil_Formals()
|
|
{
|
|
return new nil_node<Formal>();
|
|
}
|
|
|
|
Formals single_Formals(Formal e)
|
|
{
|
|
return new single_list_node<Formal>(e);
|
|
}
|
|
|
|
Formals append_Formals(Formals p1, Formals p2)
|
|
{
|
|
return new append_node<Formal>(p1, p2);
|
|
}
|
|
|
|
Expressions nil_Expressions()
|
|
{
|
|
return new nil_node<Expression>();
|
|
}
|
|
|
|
Expressions single_Expressions(Expression e)
|
|
{
|
|
return new single_list_node<Expression>(e);
|
|
}
|
|
|
|
Expressions append_Expressions(Expressions p1, Expressions p2)
|
|
{
|
|
return new append_node<Expression>(p1, p2);
|
|
}
|
|
|
|
Cases nil_Cases()
|
|
{
|
|
return new nil_node<Case>();
|
|
}
|
|
|
|
Cases single_Cases(Case e)
|
|
{
|
|
return new single_list_node<Case>(e);
|
|
}
|
|
|
|
Cases append_Cases(Cases p1, Cases p2)
|
|
{
|
|
return new append_node<Case>(p1, p2);
|
|
}
|
|
|
|
Program program(Classes classes)
|
|
{
|
|
return new program_class(classes);
|
|
}
|
|
|
|
Class_ class_(Symbol name, Symbol parent, Features features, Symbol filename)
|
|
{
|
|
return new class__class(name, parent, features, filename);
|
|
}
|
|
|
|
Feature method(Symbol name, Formals formals, Symbol return_type, Expression expr)
|
|
{
|
|
return new method_class(name, formals, return_type, expr);
|
|
}
|
|
|
|
Feature attr(Symbol name, Symbol type_decl, Expression init)
|
|
{
|
|
return new attr_class(name, type_decl, init);
|
|
}
|
|
|
|
Formal formal(Symbol name, Symbol type_decl)
|
|
{
|
|
return new formal_class(name, type_decl);
|
|
}
|
|
|
|
Case branch(Symbol name, Symbol type_decl, Expression expr)
|
|
{
|
|
return new branch_class(name, type_decl, expr);
|
|
}
|
|
|
|
Expression assign(Symbol name, Expression expr)
|
|
{
|
|
return new assign_class(name, expr);
|
|
}
|
|
|
|
Expression static_dispatch(Expression expr, Symbol type_name, Symbol name, Expressions actual)
|
|
{
|
|
return new static_dispatch_class(expr, type_name, name, actual);
|
|
}
|
|
|
|
Expression dispatch(Expression expr, Symbol name, Expressions actual)
|
|
{
|
|
return new dispatch_class(expr, name, actual);
|
|
}
|
|
|
|
Expression cond(Expression pred, Expression then_exp, Expression else_exp)
|
|
{
|
|
return new cond_class(pred, then_exp, else_exp);
|
|
}
|
|
|
|
Expression loop(Expression pred, Expression body)
|
|
{
|
|
return new loop_class(pred, body);
|
|
}
|
|
|
|
Expression typcase(Expression expr, Cases cases)
|
|
{
|
|
return new typcase_class(expr, cases);
|
|
}
|
|
|
|
Expression block(Expressions body)
|
|
{
|
|
return new block_class(body);
|
|
}
|
|
|
|
Expression let(Symbol identifier, Symbol type_decl, Expression init, Expression body)
|
|
{
|
|
return new let_class(identifier, type_decl, init, body);
|
|
}
|
|
|
|
Expression plus(Expression e1, Expression e2)
|
|
{
|
|
return new plus_class(e1, e2);
|
|
}
|
|
|
|
Expression sub(Expression e1, Expression e2)
|
|
{
|
|
return new sub_class(e1, e2);
|
|
}
|
|
|
|
Expression mul(Expression e1, Expression e2)
|
|
{
|
|
return new mul_class(e1, e2);
|
|
}
|
|
|
|
Expression divide(Expression e1, Expression e2)
|
|
{
|
|
return new divide_class(e1, e2);
|
|
}
|
|
|
|
Expression neg(Expression e1)
|
|
{
|
|
return new neg_class(e1);
|
|
}
|
|
|
|
Expression lt(Expression e1, Expression e2)
|
|
{
|
|
return new lt_class(e1, e2);
|
|
}
|
|
|
|
Expression eq(Expression e1, Expression e2)
|
|
{
|
|
return new eq_class(e1, e2);
|
|
}
|
|
|
|
Expression leq(Expression e1, Expression e2)
|
|
{
|
|
return new leq_class(e1, e2);
|
|
}
|
|
|
|
Expression comp(Expression e1)
|
|
{
|
|
return new comp_class(e1);
|
|
}
|
|
|
|
Expression int_const(Symbol token)
|
|
{
|
|
return new int_const_class(token);
|
|
}
|
|
|
|
Expression bool_const(Boolean val)
|
|
{
|
|
return new bool_const_class(val);
|
|
}
|
|
|
|
Expression string_const(Symbol token)
|
|
{
|
|
return new string_const_class(token);
|
|
}
|
|
|
|
Expression new_(Symbol type_name)
|
|
{
|
|
return new new__class(type_name);
|
|
}
|
|
|
|
Expression isvoid(Expression e1)
|
|
{
|
|
return new isvoid_class(e1);
|
|
}
|
|
|
|
Expression no_expr()
|
|
{
|
|
return new no_expr_class();
|
|
}
|
|
|
|
Expression object(Symbol name)
|
|
{
|
|
return new object_class(name);
|
|
}
|
|
|