aboutsummaryrefslogtreecommitdiffstats
path: root/c_compiler/src/expression.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'c_compiler/src/expression.cpp')
-rw-r--r--c_compiler/src/expression.cpp138
1 files changed, 96 insertions, 42 deletions
diff --git a/c_compiler/src/expression.cpp b/c_compiler/src/expression.cpp
index 466d8f7..8d2e7cf 100644
--- a/c_compiler/src/expression.cpp
+++ b/c_compiler/src/expression.cpp
@@ -39,7 +39,7 @@ std::string Expression::id() const
return "";
}
-TypePtr Expression::getType(const VariableStackBindings &) const
+TypePtr Expression::getType(const Bindings &) const
{
// by default return largest size, which is 32 bits
return std::make_shared<Int>();
@@ -86,7 +86,7 @@ void OperationExpression::expressionDepth(int &depth_count) const
depth_count = rhs_depth_count;
}
-TypePtr OperationExpression::getType(const VariableStackBindings &bindings) const
+TypePtr OperationExpression::getType(const Bindings &bindings) const
{
return lhs_->getType(bindings);
}
@@ -101,7 +101,7 @@ ExpressionPtr OperationExpression::getRhs() const
return rhs_;
}
-void OperationExpression::evaluateExpression(VariableStackBindings bindings, int &label_count) const
+void OperationExpression::evaluateExpression(Bindings bindings, int &label_count) const
{
// I can just evaluate the lhs with the same entry stack position
lhs_->printAsm(bindings, label_count);
@@ -115,14 +115,24 @@ void OperationExpression::evaluateExpression(VariableStackBindings bindings, int
// now I have them evaluated at two positions in the stack and can load both into registers
// $2 and $3
- lhs_->getType(bindings)->load(2, lhs_stack_position);
+ printf("\tlw\t$2,%d($fp)\n", lhs_stack_position);
printf("\tlw\t$3,%d($fp)\n", bindings.currentExpressionStackPosition());
}
// Unary expression definition
-void UnaryExpression::stackPosition(VariableStackBindings, int &) const
+void UnaryExpression::expressionDepth(int &depth_count) const
+{
+ ++depth_count;
+}
+
+void UnaryExpression::pointerPosition(Bindings bindings) const
+{
+ throw std::runtime_error("Error : Cannot get pointer position");
+}
+
+void UnaryExpression::stackPosition(Bindings, int &) const
{
throw std::runtime_error("Error : Cannot get stack position of expression");
}
@@ -134,7 +144,7 @@ PostfixArrayElement::PostfixArrayElement(Expression *postfix_expression, Express
: postfix_expression_(postfix_expression), index_expression_(index_expression)
{}
-VariableStackBindings PostfixArrayElement::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings PostfixArrayElement::printAsm(Bindings bindings, int &label_count) const
{
stackPosition(bindings, label_count);
TypePtr type_ptr = postfix_expression_->getType(bindings);
@@ -148,7 +158,7 @@ VariableStackBindings PostfixArrayElement::printAsm(VariableStackBindings bindin
return bindings;
}
-void PostfixArrayElement::stackPosition(VariableStackBindings bindings, int &label_count) const
+void PostfixArrayElement::stackPosition(Bindings bindings, int &label_count) const
{
index_expression_->printAsm(bindings, label_count);
@@ -169,7 +179,7 @@ void PostfixArrayElement::expressionDepth(int &depth_count) const
index_expression_->expressionDepth(depth_count);
}
-TypePtr PostfixArrayElement::getType(const VariableStackBindings &bindings) const
+TypePtr PostfixArrayElement::getType(const Bindings &bindings) const
{
return postfix_expression_->getType(bindings);
}
@@ -181,7 +191,7 @@ PostfixFunctionCall::PostfixFunctionCall(Expression *argument_expression_list)
: argument_expression_list_(argument_expression_list)
{}
-VariableStackBindings PostfixFunctionCall::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings PostfixFunctionCall::printAsm(Bindings bindings, int &label_count) const
{
std::vector<ExpressionPtr> argument_vector;
ExpressionPtr current_argument = argument_expression_list_;
@@ -235,7 +245,7 @@ void PostfixFunctionCall::expressionDepth(int &depth_count) const
argument_expression_list_->expressionDepth(depth_count);
}
-TypePtr PostfixFunctionCall::getType(const VariableStackBindings &) const
+TypePtr PostfixFunctionCall::getType(const Bindings &) const
{
return std::make_shared<Int>();
}
@@ -247,7 +257,7 @@ PostfixPostIncDecExpression::PostfixPostIncDecExpression(const std::string &_ope
: operator_(_operator), postfix_expression_(postfix_expression)
{}
-VariableStackBindings PostfixPostIncDecExpression::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings PostfixPostIncDecExpression::printAsm(Bindings bindings, int &label_count) const
{
postfix_expression_->printAsm(bindings, label_count);
if(operator_ == "++")
@@ -279,7 +289,7 @@ VariableStackBindings PostfixPostIncDecExpression::printAsm(VariableStackBinding
return bindings;
}
-TypePtr PostfixPostIncDecExpression::getType(const VariableStackBindings &bindings) const
+TypePtr PostfixPostIncDecExpression::getType(const Bindings &bindings) const
{
return postfix_expression_->getType(bindings);
}
@@ -291,7 +301,7 @@ UnaryPreIncDecExpression::UnaryPreIncDecExpression(const std::string &_operator,
: operator_(_operator), unary_expression_(unary_expression)
{}
-VariableStackBindings UnaryPreIncDecExpression::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings UnaryPreIncDecExpression::printAsm(Bindings bindings, int &label_count) const
{
unary_expression_->printAsm(bindings, label_count);
if(operator_ == "++")
@@ -310,7 +320,7 @@ VariableStackBindings UnaryPreIncDecExpression::printAsm(VariableStackBindings b
return bindings;
}
-TypePtr UnaryPreIncDecExpression::getType(const VariableStackBindings &bindings) const
+TypePtr UnaryPreIncDecExpression::getType(const Bindings &bindings) const
{
return unary_expression_->getType(bindings);
}
@@ -322,7 +332,7 @@ OperatorUnaryExpression::OperatorUnaryExpression(const std::string &_operator, E
: operator_(_operator), cast_expression_(cast_expression)
{}
-VariableStackBindings OperatorUnaryExpression::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings OperatorUnaryExpression::printAsm(Bindings bindings, int &label_count) const
{
cast_expression_->printAsm(bindings, label_count);
if(operator_ == "!")
@@ -354,7 +364,7 @@ VariableStackBindings OperatorUnaryExpression::printAsm(VariableStackBindings bi
return bindings;
}
-void OperatorUnaryExpression::stackPosition(VariableStackBindings bindings, int &label_count) const
+void OperatorUnaryExpression::stackPosition(Bindings bindings, int &label_count) const
{
if(operator_ == "*")
{
@@ -364,7 +374,7 @@ void OperatorUnaryExpression::stackPosition(VariableStackBindings bindings, int
}
}
-TypePtr OperatorUnaryExpression::getType(const VariableStackBindings &bindings) const
+TypePtr OperatorUnaryExpression::getType(const Bindings &bindings) const
{
return cast_expression_->getType(bindings);
}
@@ -376,7 +386,7 @@ CastExpression::CastExpression(Type *type, Expression *expression)
: type_(type), expression_(expression)
{}
-VariableStackBindings CastExpression::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings CastExpression::printAsm(Bindings bindings, int &label_count) const
{
return bindings;
}
@@ -389,7 +399,7 @@ void CastExpression::expressionDepth(int &depth_count) const
expression_->expressionDepth(depth_count);
}
-TypePtr CastExpression::getType(const VariableStackBindings &) const
+TypePtr CastExpression::getType(const Bindings &) const
{
return type_;
}
@@ -401,7 +411,7 @@ AdditiveExpression::AdditiveExpression(Expression *lhs, const std::string &_oper
: OperationExpression(lhs, rhs), operator_(_operator)
{}
-VariableStackBindings AdditiveExpression::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings AdditiveExpression::printAsm(Bindings bindings, int &label_count) const
{
evaluateExpression(bindings, label_count);
@@ -435,7 +445,7 @@ MultiplicativeExpression::MultiplicativeExpression(Expression *lhs, const std::s
: OperationExpression(lhs, rhs), operator_(_operator)
{}
-VariableStackBindings MultiplicativeExpression::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings MultiplicativeExpression::printAsm(Bindings bindings, int &label_count) const
{
evaluateExpression(bindings, label_count);
@@ -480,7 +490,7 @@ ShiftExpression::ShiftExpression(Expression* lhs, const std::string &_operator,
: OperationExpression(lhs, rhs), operator_(_operator)
{}
-VariableStackBindings ShiftExpression::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings ShiftExpression::printAsm(Bindings bindings, int &label_count) const
{
evaluateExpression(bindings, label_count);
@@ -516,7 +526,7 @@ RelationalExpression::RelationalExpression(Expression* lhs, const std::string &_
: OperationExpression(lhs, rhs), operator_(_operator)
{}
-VariableStackBindings RelationalExpression::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings RelationalExpression::printAsm(Bindings bindings, int &label_count) const
{
evaluateExpression(bindings, label_count);
@@ -571,7 +581,7 @@ EqualityExpression::EqualityExpression(Expression *lhs, const std::string &_oper
: OperationExpression(lhs, rhs), operator_(_operator)
{}
-VariableStackBindings EqualityExpression::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings EqualityExpression::printAsm(Bindings bindings, int &label_count) const
{
evaluateExpression(bindings, label_count);
printf("\txor\t$2,$2,$3\n");
@@ -608,7 +618,7 @@ AndExpression::AndExpression(Expression *lhs, Expression *rhs)
: OperationExpression(lhs, rhs)
{}
-VariableStackBindings AndExpression::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings AndExpression::printAsm(Bindings bindings, int &label_count) const
{
evaluateExpression(bindings, label_count);
printf("\tand\t$2,$2,$3\n\tsw\t$2,%d($fp)\n", bindings.currentExpressionStackPosition());
@@ -627,7 +637,7 @@ ExclusiveOrExpression::ExclusiveOrExpression(Expression *lhs, Expression *rhs)
: OperationExpression(lhs, rhs)
{}
-VariableStackBindings ExclusiveOrExpression::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings ExclusiveOrExpression::printAsm(Bindings bindings, int &label_count) const
{
evaluateExpression(bindings, label_count);
printf("\txor\t$2,$2,$3\n\tsw\t$2,%d($fp)\n", bindings.currentExpressionStackPosition());
@@ -646,7 +656,7 @@ InclusiveOrExpression::InclusiveOrExpression(Expression *lhs, Expression *rhs)
: OperationExpression(lhs, rhs)
{}
-VariableStackBindings InclusiveOrExpression::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings InclusiveOrExpression::printAsm(Bindings bindings, int &label_count) const
{
evaluateExpression(bindings, label_count);
printf("\tor\t$2,$2,$3\n\tsw\t$2,%d($fp)\n", bindings.currentExpressionStackPosition());
@@ -665,7 +675,7 @@ LogicalAndExpression::LogicalAndExpression(Expression *lhs, Expression *rhs)
: OperationExpression(lhs, rhs)
{}
-VariableStackBindings LogicalAndExpression::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings LogicalAndExpression::printAsm(Bindings bindings, int &label_count) const
{
int log_and = label_count++;
lhs_->printAsm(bindings, label_count);
@@ -690,7 +700,7 @@ LogicalOrExpression::LogicalOrExpression(Expression *lhs, Expression *rhs)
: OperationExpression(lhs, rhs)
{}
-VariableStackBindings LogicalOrExpression::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings LogicalOrExpression::printAsm(Bindings bindings, int &label_count) const
{
int log_or = label_count++;
lhs_->printAsm(bindings, label_count);
@@ -718,12 +728,12 @@ ConditionalExpression::ConditionalExpression(Expression *logical_or,
conditional_expression_(conditional_expression)
{}
-VariableStackBindings ConditionalExpression::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings ConditionalExpression::printAsm(Bindings bindings, int &label_count) const
{
return bindings;
}
-TypePtr ConditionalExpression::getType(const VariableStackBindings &bindings) const
+TypePtr ConditionalExpression::getType(const Bindings &bindings) const
{
return std::make_shared<Int>();
}
@@ -739,7 +749,7 @@ AssignmentExpression::AssignmentExpression(ExpressionPtr lhs, Expression *rhs)
: OperationExpression(lhs, rhs)
{}
-VariableStackBindings AssignmentExpression::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings AssignmentExpression::printAsm(Bindings bindings, int &label_count) const
{
// TODO add stack and store results in there, also for addition and multiplication.
@@ -754,17 +764,28 @@ VariableStackBindings AssignmentExpression::printAsm(VariableStackBindings bindi
// don't have to change the stack position as there is no lhs to evaluate
rhs_->printAsm(bindings, label_count);
bindings.nextExpressionStackPosition();
-
+
+ std::shared_ptr<StringLiteral> rhs_tmp;
+ rhs_tmp = std::dynamic_pointer_cast<StringLiteral>(rhs_);
+
// we are assigning so we don't have to evaluate the lhs as it will be overwritten anyways
- lhs_postfix->stackPosition(bindings, label_count);
+ if(rhs_tmp != nullptr)
+ {
+ lhs_postfix->pointerPosition(bindings);
+ }
+ else
+ {
+ lhs_postfix->stackPosition(bindings, label_count);
+ }
// now the result of the rhs will be in that stack position, so we can load it into $2
+ printf("\tlw\t$2,%d($fp)\n", expression_stack_position);
+
TypePtr lhs_type = lhs_->getType(bindings);
- lhs_type->load(2, expression_stack_position);
-
// check if lhs is trying to access an array
std::shared_ptr<PostfixArrayElement> lhs_tmp;
lhs_tmp = std::dynamic_pointer_cast<PostfixArrayElement>(lhs_);
+
if(lhs_tmp != nullptr)
{
std::shared_ptr<Pointer> lhs_pointer_type;
@@ -793,7 +814,7 @@ Identifier::Identifier(const std::string &id)
: id_(id)
{}
-VariableStackBindings Identifier::printAsm(VariableStackBindings bindings, int &) const
+Bindings Identifier::printAsm(Bindings bindings, int &) const
{
if(bindings.bindingExists(id_))
{
@@ -824,12 +845,23 @@ VariableStackBindings Identifier::printAsm(VariableStackBindings bindings, int &
return bindings;
}
-void Identifier::stackPosition(VariableStackBindings bindings, int &) const
+void Identifier::pointerPosition(Bindings bindings) const
+{
+ if(bindings.bindingExists(id_))
+ {
+ printf("\taddiu\t$t0,$fp,%d\n", bindings.stackPosition(id_));
+ return;
+ }
+
+ throw std::runtime_error("Error : '"+id_+"' not yet declared");
+}
+
+void Identifier::stackPosition(Bindings bindings, int &) const
{
if(bindings.bindingExists(id_))
{
if(std::dynamic_pointer_cast<Pointer>(bindings.getType(id_)) != nullptr)
- printf("\tlw\t$3,%d($fp)\n\tmove\t$t0,$3\n", bindings.stackPosition(id_));
+ printf("\tlw\t$t0,%d($fp)\n", bindings.stackPosition(id_));
else
printf("\taddiu\t$t0,$fp,%d\n", bindings.stackPosition(id_));
return;
@@ -843,19 +875,41 @@ std::string Identifier::id() const
return id_;
}
-TypePtr Identifier::getType(const VariableStackBindings &bindings) const
+TypePtr Identifier::getType(const Bindings &bindings) const
{
return bindings.getType(id_);
}
+// String literal definition
+
+StringLiteral::StringLiteral(const std::string &string_content)
+ : string_content_(string_content)
+{}
+
+Bindings StringLiteral::printAsm(Bindings bindings, int &) const
+{
+ int label = bindings.insertStringLiteral(string_content_);
+ printf("\tlui\t$2,%%hi($%d_string)\n\taddiu\t$2,$2,%%lo($%d_string)\n", label, label);
+ printf("\tsw\t$2,%d($fp)\n", bindings.currentExpressionStackPosition());
+ return bindings;
+}
+
+TypePtr StringLiteral::getType(const Bindings &) const
+{
+ std::shared_ptr<Pointer> tmp_pointer_ptr;
+ tmp_pointer_ptr->type(std::make_shared<Char>());
+ return tmp_pointer_ptr;
+}
+
+
// Constant definition
Constant::Constant(const int32_t &constant)
: constant_(constant)
{}
-VariableStackBindings Constant::printAsm(VariableStackBindings bindings, int &) const
+Bindings Constant::printAsm(Bindings bindings, int &) const
{
// constant only has to load to $2 because the other expression will take care of the rest
printf("\tli\t$2,%d\n", constant_);
@@ -868,7 +922,7 @@ int Constant::constantFold() const
return constant_;
}
-TypePtr Constant::getType(const VariableStackBindings &) const
+TypePtr Constant::getType(const Bindings &) const
{
return std::make_shared<Int>();
}