aboutsummaryrefslogtreecommitdiffstats
path: root/c_compiler/src
diff options
context:
space:
mode:
Diffstat (limited to 'c_compiler/src')
-rw-r--r--c_compiler/src/bindings.cpp49
-rw-r--r--c_compiler/src/c_lexer.flex13
-rw-r--r--c_compiler/src/c_parser.y8
-rw-r--r--c_compiler/src/compiler_main.cpp2
-rw-r--r--c_compiler/src/declaration.cpp8
-rw-r--r--c_compiler/src/expression.cpp138
-rw-r--r--c_compiler/src/function.cpp22
-rw-r--r--c_compiler/src/statement.cpp30
-rw-r--r--c_compiler/src/translation_unit.cpp2
-rw-r--r--c_compiler/src/type.cpp32
10 files changed, 194 insertions, 110 deletions
diff --git a/c_compiler/src/bindings.cpp b/c_compiler/src/bindings.cpp
index 24e1745..e91d408 100644
--- a/c_compiler/src/bindings.cpp
+++ b/c_compiler/src/bindings.cpp
@@ -1,13 +1,14 @@
#include "bindings.hpp"
+std::vector<std::string> Bindings::string_literals;
-// VariableStackBindings definition
+// Bindings definition
-VariableStackBindings::VariableStackBindings()
+Bindings::Bindings()
: break_label_(""), continue_label_(""), stack_counter_(0), expression_stack_(16)
{}
-void VariableStackBindings::insertBinding(const std::string &id, TypePtr type, const int &stack_position)
+void Bindings::insertBinding(const std::string &id, TypePtr type, const int &stack_position)
{
auto binding = bindings_.find(id);
@@ -16,7 +17,7 @@ void VariableStackBindings::insertBinding(const std::string &id, TypePtr type, c
DeclarationData decl_data;
decl_data.type = type;
decl_data.stack_position = stack_position;
- bindings_.insert(std::pair<std::string, DeclarationData>(id, decl_data));
+ bindings_.insert(std::make_pair(id, decl_data));
}
else
{
@@ -25,65 +26,71 @@ void VariableStackBindings::insertBinding(const std::string &id, TypePtr type, c
}
}
-void VariableStackBindings::increaseStackPosition()
+int Bindings::insertStringLiteral(const std::string &string_literal)
+{
+ string_literals.push_back(string_literal);
+ return (int)string_literals.size()-1;
+}
+
+void Bindings::increaseStackPosition()
{
stack_counter_ += 4;
}
-void VariableStackBindings::increaseStackPosition(const int &position)
+void Bindings::increaseStackPosition(const int &position)
{
stack_counter_ += position;
}
-void VariableStackBindings::setStackPosition(const int &stack_counter)
+void Bindings::setStackPosition(const int &stack_counter)
{
stack_counter_ = stack_counter;
}
-void VariableStackBindings::nextExpressionStackPosition()
+void Bindings::nextExpressionStackPosition()
{
expression_stack_ += 4;
}
-void VariableStackBindings::setExpressionStackPosition(const int &stack_counter)
+void Bindings::setExpressionStackPosition(const int &stack_counter)
{
expression_stack_ = stack_counter;
}
-TypePtr VariableStackBindings::getType(const std::string &id) const
+TypePtr Bindings::getType(const std::string &id) const
{
auto binding = bindings_.find(id);
return (*binding).second.type;
}
-std::string VariableStackBindings::breakLabel()
+std::string Bindings::breakLabel()
{
return break_label_;
}
-std::string VariableStackBindings::breakLabel(const std::string &label)
+std::string Bindings::breakLabel(const std::string &label)
{
break_label_ = label;
return break_label_;
}
-std::string VariableStackBindings::continueLabel()
+std::string Bindings::continueLabel()
{
return continue_label_;
}
-std::string VariableStackBindings::continueLabel(const std::string &label)
+std::string Bindings::continueLabel(const std::string &label)
{
continue_label_ = label;
return continue_label_;
}
-int VariableStackBindings::currentStackPosition() const
+int Bindings::currentStackPosition() const
{
return stack_counter_;
}
-int VariableStackBindings::stackPosition(const std::string &id) const
+int Bindings::stackPosition(const std::string &id) const
{
auto binding = bindings_.find(id);
@@ -93,12 +100,18 @@ int VariableStackBindings::stackPosition(const std::string &id) const
else return 0;
}
-int VariableStackBindings::currentExpressionStackPosition() const
+int Bindings::currentExpressionStackPosition() const
{
return expression_stack_;
}
-bool VariableStackBindings::bindingExists(const std::string &id) const
+std::pair<std::vector<std::string>::const_iterator, std::vector<std::string>::const_iterator>
+Bindings::getStringLiteralIterator() const
+{
+ return std::make_pair(string_literals.begin(), string_literals.end());
+}
+
+bool Bindings::bindingExists(const std::string &id) const
{
auto binding = bindings_.find(id);
diff --git a/c_compiler/src/c_lexer.flex b/c_compiler/src/c_lexer.flex
index 8dcef35..8365a5b 100644
--- a/c_compiler/src/c_lexer.flex
+++ b/c_compiler/src/c_lexer.flex
@@ -16,9 +16,9 @@ DECIMALCONSTANT ([1-9][0-9]*)
OCTALCONSTANT ([0][0-7]*)
HEXCONSTANT ([0][xX][0-9A-Fa-f]+)
-CHARCONSTANT ('(([\\]['])|([^']))+')
+CHARCONSTANT (['](([\\]['])|([^']))*['])
-STRINGLITERAL ["](([\\]["])|([^"]))*["]
+STRINGLITERAL (["](([\\]["])|([^"]))*["])
WHITESPACE [ \t\r\n]+
@@ -54,6 +54,15 @@ ALL .
(default) { return T_DEFAULT; }
(switch) { return T_SWITCH; }
+{STRINGLITERAL} { std::string tmp(yytext); yylval.string = new std::string(tmp.substr(1, yyleng-2));
+ return T_STRINGLITERAL; }
+L{STRINGLITERAL} { std::string tmp(yytext); yylval.string = new std::string(tmp.substr(2, yyleng-3));
+ return T_STRINGLITERAL;}
+
+{CHARCONSTANT} { yylval.number = yytext[1]; return T_INT_CONST; }
+L{CHARCONSTANT} { yylval.number = yytext[2]; return T_INT_CONST; }
+
+
[.][.][.] { return T_ELLIPSIS; }
[;] { return T_SC; }
[,] { return T_CMA; }
diff --git a/c_compiler/src/c_parser.y b/c_compiler/src/c_parser.y
index 2c5d215..81293ba 100644
--- a/c_compiler/src/c_parser.y
+++ b/c_compiler/src/c_parser.y
@@ -41,7 +41,7 @@ void yyerror(const char *);
T_VOID T_CHAR T_SHORT T_INT T_LONG T_FLOAT T_DOUBLE T_SIGNED T_UNSIGNED
T_TYPEDEF T_EXTERN T_STATIC T_AUTO T_REGISTER
T_CONST T_VOLATILE T_GOTO T_BREAK T_CONTINUE
- T_CASE T_DEFAULT T_SWITCH T_ELLIPSIS
+ T_CASE T_DEFAULT T_SWITCH T_ELLIPSIS T_STRINGLITERAL
%nonassoc T_RRB
%nonassoc T_ELSE
@@ -74,8 +74,9 @@ void yyerror(const char *);
%type <number> T_INT_CONST
%type <string> T_IDENTIFIER ASSIGN_OPER T_ASSIGN_OPER T_EQ T_AND T_ADDSUB_OP T_TILDE T_NOT
- T_MULT T_DIV T_REM T_EQUALITY_OP T_REL_OP T_SHIFT_OP T_INCDEC MultDivRemOP
- UnaryOperator DeclarationSpecifier TypeQualifier TypeQualifierList
+ T_MULT T_DIV T_REM T_EQUALITY_OP T_REL_OP T_SHIFT_OP T_INCDEC T_STRINGLITERAL
+ MultDivRemOP UnaryOperator DeclarationSpecifier TypeQualifier
+ TypeQualifierList
%start ROOT
@@ -467,6 +468,7 @@ ArgumentExpressionList:
PrimaryExpression:
T_IDENTIFIER { $$ = new Identifier(*$1); delete $1; }
| Constant { $$ = $1; }
+ | T_STRINGLITERAL { $$ = new StringLiteral(*$1); delete $1; }
| T_LRB Expression T_RRB { $$ = $2; }
;
diff --git a/c_compiler/src/compiler_main.cpp b/c_compiler/src/compiler_main.cpp
index dc2fc17..4ed3bff 100644
--- a/c_compiler/src/compiler_main.cpp
+++ b/c_compiler/src/compiler_main.cpp
@@ -11,7 +11,7 @@ int main(int, char**)
try
{
std::unique_ptr<Node> ast(parseAST());
- VariableStackBindings bindings;
+ Bindings bindings;
int label_count = 0;
ast->printAsm(bindings, label_count);
}
diff --git a/c_compiler/src/declaration.cpp b/c_compiler/src/declaration.cpp
index a3ee5d3..594c91b 100644
--- a/c_compiler/src/declaration.cpp
+++ b/c_compiler/src/declaration.cpp
@@ -38,7 +38,7 @@ void Declaration::printXml() const
printf("<Variable id=\"%s\" />", id_.c_str());
}
-VariableStackBindings Declaration::printAsm(VariableStackBindings bindings, int& label_count) const
+Bindings Declaration::printAsm(Bindings bindings, int& label_count) const
{
(void)label_count;
if(!extern_declaration_)
@@ -54,7 +54,7 @@ VariableStackBindings Declaration::printAsm(VariableStackBindings bindings, int&
return bindings;
}
-VariableStackBindings Declaration::localAsm(VariableStackBindings bindings, int& label_count) const
+Bindings Declaration::localAsm(Bindings bindings, int& label_count) const
{
if(next_declaration_ != nullptr)
bindings = next_declaration_->localAsm(bindings, label_count);
@@ -148,12 +148,12 @@ ArrayDeclaration::ArrayDeclaration(const std::string &id, ExpressionPtr initiali
: Declaration(id, initializer), size_(size)
{}
-VariableStackBindings ArrayDeclaration::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings ArrayDeclaration::printAsm(Bindings bindings, int &label_count) const
{
return bindings;
}
-VariableStackBindings ArrayDeclaration::localAsm(VariableStackBindings bindings, int &label_count) const
+Bindings ArrayDeclaration::localAsm(Bindings bindings, int &label_count) const
{
if(next_declaration_ != nullptr)
bindings = next_declaration_->localAsm(bindings, label_count);
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>();
}
diff --git a/c_compiler/src/function.cpp b/c_compiler/src/function.cpp
index 8ce3be0..5cdb33d 100644
--- a/c_compiler/src/function.cpp
+++ b/c_compiler/src/function.cpp
@@ -47,9 +47,9 @@ void Function::printXml() const
printf("</Function>\n");
}
-VariableStackBindings Function::printAsm(VariableStackBindings bindings, int& label_count) const
+Bindings Function::printAsm(Bindings bindings, int& label_count) const
{
- VariableStackBindings original_bindings = bindings;
+ Bindings original_bindings = bindings;
// Counting all the variables being declared in the function
int variable_count = 0;
if(statement_ != nullptr)
@@ -71,11 +71,7 @@ VariableStackBindings Function::printAsm(VariableStackBindings bindings, int& la
// This adds 2 to store the frame pointer and the return address
int memory_needed = 4*(variable_count+max_argument_count+max_depth+2);
- // make frame double word aligned
- if(memory_needed % 8 != 0)
- memory_needed += 4;
-
- printf("\t.text\n\t.globl\t%s\n%s:\n\taddiu\t$sp,$sp,-%d\n\tsw\t",
+ printf("\t.text\n\t.align\t2\n\t.globl\t%s\n%s:\n\taddiu\t$sp,$sp,-%d\n\tsw\t",
id_.c_str(), id_.c_str(), memory_needed);
printf("$31,%d($sp)\n\tsw\t$fp,%d($sp)\n\tmove\t$fp,$sp\n", memory_needed-4, memory_needed-8);
@@ -91,10 +87,20 @@ VariableStackBindings Function::printAsm(VariableStackBindings bindings, int& la
printf("\tmove\t$2,$0\n0:\n\tmove\t$sp,$fp\n\tlw\t$31,%d($sp)\n\tlw\t$fp,%d", memory_needed-4, memory_needed-8);
printf("($sp)\n\taddiu\t$sp,$sp,%d\n\tjr\t$31\n\tnop\n", memory_needed);
+ auto string_lit_iterator = bindings.getStringLiteralIterator();
+ if(string_lit_iterator.first != string_lit_iterator.second)
+ {
+ printf("\n\t.rdata\n\t.align\t2\n");
+ for(auto itr = string_lit_iterator.first; itr != string_lit_iterator.second; ++itr)
+ {
+ printf("$%d_string:\n\t.ascii\t\"%s\\000\"", int(itr-string_lit_iterator.first), (*itr).c_str());
+ }
+ }
+
return original_bindings;
}
-void Function::printParameterAsm(VariableStackBindings& bindings, int& frame_offset) const
+void Function::printParameterAsm(Bindings& bindings, int& frame_offset) const
{
std::vector<DeclarationPtr> parameter_vector;
DeclarationPtr parameter_list = parameter_list_;
diff --git a/c_compiler/src/statement.cpp b/c_compiler/src/statement.cpp
index 0b871e8..309e2d8 100644
--- a/c_compiler/src/statement.cpp
+++ b/c_compiler/src/statement.cpp
@@ -58,7 +58,7 @@ void LabelStatement::printXml() const
next_statement_->printXml();
}
-VariableStackBindings LabelStatement::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings LabelStatement::printAsm(Bindings bindings, int &label_count) const
{
if(next_statement_ != nullptr)
next_statement_->printAsm(bindings, label_count);
@@ -123,7 +123,7 @@ void CaseStatement::printXml() const
next_statement_->printXml();
}
-VariableStackBindings CaseStatement::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings CaseStatement::printAsm(Bindings bindings, int &label_count) const
{
if(next_statement_ != nullptr)
next_statement_->printAsm(bindings, label_count);
@@ -216,9 +216,9 @@ void CompoundStatement::printXml() const
printf("</Scope>\n");
}
-VariableStackBindings CompoundStatement::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings CompoundStatement::printAsm(Bindings bindings, int &label_count) const
{
- VariableStackBindings outer_scope_bindings = bindings;
+ Bindings outer_scope_bindings = bindings;
if(next_statement_ != nullptr)
next_statement_->printAsm(bindings, label_count);
@@ -303,7 +303,7 @@ void IfElseStatement::printXml() const
else_->printXml();
}
-VariableStackBindings IfElseStatement::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings IfElseStatement::printAsm(Bindings bindings, int &label_count) const
{
if(next_statement_ != nullptr)
next_statement_->printAsm(bindings, label_count);
@@ -406,7 +406,7 @@ void SwitchStatement::printXml() const
statement_->printXml();
}
-VariableStackBindings SwitchStatement::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings SwitchStatement::printAsm(Bindings bindings, int &label_count) const
{
int switch_count = label_count++;
std::shared_ptr<CompoundStatement> comp_statement;
@@ -533,7 +533,7 @@ void ExpressionStatement::printXml() const
next_statement_->printXml();
}
-VariableStackBindings ExpressionStatement::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings ExpressionStatement::printAsm(Bindings bindings, int &label_count) const
{
if(next_statement_ != nullptr)
next_statement_->printAsm(bindings, label_count);
@@ -622,7 +622,7 @@ ReturnStatement::ReturnStatement(Expression *expression)
: expression_(expression)
{}
-VariableStackBindings ReturnStatement::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings ReturnStatement::printAsm(Bindings bindings, int &label_count) const
{
if(next_statement_ != nullptr)
next_statement_->printAsm(bindings, label_count);
@@ -682,7 +682,7 @@ void ReturnStatement::countExpressionDepth(int &depth_count) const
BreakStatement::BreakStatement()
{}
-VariableStackBindings BreakStatement::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings BreakStatement::printAsm(Bindings bindings, int &label_count) const
{
if(next_statement_ != nullptr)
next_statement_->printAsm(bindings, label_count);
@@ -697,7 +697,7 @@ VariableStackBindings BreakStatement::printAsm(VariableStackBindings bindings, i
ContinueStatement::ContinueStatement()
{}
-VariableStackBindings ContinueStatement::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings ContinueStatement::printAsm(Bindings bindings, int &label_count) const
{
if(next_statement_ != nullptr)
next_statement_->printAsm(bindings, label_count);
@@ -713,7 +713,7 @@ GotoStatement::GotoStatement(const std::string &label)
: label_(label)
{}
-VariableStackBindings GotoStatement::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings GotoStatement::printAsm(Bindings bindings, int &label_count) const
{
if(next_statement_ != nullptr)
next_statement_->printAsm(bindings, label_count);
@@ -789,12 +789,12 @@ WhileLoop::WhileLoop(Expression *condition, Statement *statement, const bool &is
: IterationStatement(condition, statement), is_while_(is_while)
{}
-VariableStackBindings WhileLoop::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings WhileLoop::printAsm(Bindings bindings, int &label_count) const
{
if(next_statement_ != nullptr)
next_statement_->printAsm(bindings, label_count);
- VariableStackBindings initial_bindings = bindings;
+ Bindings initial_bindings = bindings;
int while_label = label_count++;
@@ -816,12 +816,12 @@ ForLoop::ForLoop(Expression *initializer, Expression *condition, Expression *inc
: IterationStatement(condition, statement), initializer_(initializer), incrementer_(incrementer)
{}
-VariableStackBindings ForLoop::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings ForLoop::printAsm(Bindings bindings, int &label_count) const
{
if(next_statement_ != nullptr)
next_statement_->printAsm(bindings, label_count);
- VariableStackBindings initial_bindings = bindings;
+ Bindings initial_bindings = bindings;
int for_label = label_count++;
diff --git a/c_compiler/src/translation_unit.cpp b/c_compiler/src/translation_unit.cpp
index 41d1171..3dd8a7b 100644
--- a/c_compiler/src/translation_unit.cpp
+++ b/c_compiler/src/translation_unit.cpp
@@ -25,7 +25,7 @@ void TranslationUnit::printXml() const
printf("</Program>\n");
}
-VariableStackBindings TranslationUnit::printAsm(VariableStackBindings bindings, int& label_count) const
+Bindings TranslationUnit::printAsm(Bindings bindings, int& label_count) const
{
for(auto& node : translation_unit_) {
bindings = node->printAsm(bindings, label_count);
diff --git a/c_compiler/src/type.cpp b/c_compiler/src/type.cpp
index 251ebc5..675230c 100644
--- a/c_compiler/src/type.cpp
+++ b/c_compiler/src/type.cpp
@@ -46,7 +46,7 @@ void Array::print() const
void Array::printXml() const
{}
-VariableStackBindings Array::printAsm(VariableStackBindings bindings, int &) const
+Bindings Array::printAsm(Bindings bindings, int &) const
{
return bindings;
}
@@ -69,7 +69,7 @@ TypePtr Array::type(TypePtr type_ptr)
return type_;
}
-void Array::increaseStackPosition(VariableStackBindings &bindings) const
+void Array::increaseStackPosition(Bindings &bindings) const
{
for(int i = 0; i < size_; ++i)
{
@@ -121,7 +121,7 @@ void Pointer::print() const
void Pointer::printXml() const
{}
-VariableStackBindings Pointer::printAsm(VariableStackBindings bindings, int &) const
+Bindings Pointer::printAsm(Bindings bindings, int &) const
{
return bindings;
}
@@ -144,7 +144,7 @@ TypePtr Pointer::type(TypePtr type_ptr)
return type_;
}
-void Pointer::increaseStackPosition(VariableStackBindings &bindings) const
+void Pointer::increaseStackPosition(Bindings &bindings) const
{
bindings.increaseStackPosition(4);
}
@@ -221,7 +221,7 @@ void TypeContainer::print() const
void TypeContainer::printXml() const
{}
-VariableStackBindings TypeContainer::printAsm(VariableStackBindings bindings, int &) const
+Bindings TypeContainer::printAsm(Bindings bindings, int &) const
{
return bindings;
}
@@ -246,7 +246,7 @@ TypePtr TypeContainer::type(TypePtr type_ptr)
return type_;
}
-void TypeContainer::increaseStackPosition(VariableStackBindings &bindings) const
+void TypeContainer::increaseStackPosition(Bindings &bindings) const
{
type_->increaseStackPosition(bindings);
}
@@ -338,12 +338,12 @@ void Int::print() const
void Int::printXml() const
{}
-VariableStackBindings Int::printAsm(VariableStackBindings bindings, int &) const
+Bindings Int::printAsm(Bindings bindings, int &) const
{
return bindings;
}
-void Int::increaseStackPosition(VariableStackBindings &bindings) const
+void Int::increaseStackPosition(Bindings &bindings) const
{
bindings.increaseStackPosition(4);
}
@@ -392,12 +392,12 @@ void Void::print() const
void Void::printXml() const
{}
-VariableStackBindings Void::printAsm(VariableStackBindings bindings, int &) const
+Bindings Void::printAsm(Bindings bindings, int &) const
{
return bindings;
}
-void Void::increaseStackPosition(VariableStackBindings &) const
+void Void::increaseStackPosition(Bindings &) const
{}
void Void::load() const
@@ -434,12 +434,12 @@ void Short::print() const
void Short::printXml() const
{}
-VariableStackBindings Short::printAsm(VariableStackBindings bindings, int &) const
+Bindings Short::printAsm(Bindings bindings, int &) const
{
return bindings;
}
-void Short::increaseStackPosition(VariableStackBindings &bindings) const
+void Short::increaseStackPosition(Bindings &bindings) const
{
bindings.increaseStackPosition(2);
}
@@ -488,12 +488,12 @@ void Char::print() const
void Char::printXml() const
{}
-VariableStackBindings Char::printAsm(VariableStackBindings bindings, int &) const
+Bindings Char::printAsm(Bindings bindings, int &) const
{
return bindings;
}
-void Char::increaseStackPosition(VariableStackBindings &bindings) const
+void Char::increaseStackPosition(Bindings &bindings) const
{
bindings.increaseStackPosition(1);
}
@@ -542,12 +542,12 @@ void Float::print() const
void Float::printXml() const
{}
-VariableStackBindings Float::printAsm(VariableStackBindings bindings, int &) const
+Bindings Float::printAsm(Bindings bindings, int &) const
{
return bindings;
}
-void Float::increaseStackPosition(VariableStackBindings &bindings) const
+void Float::increaseStackPosition(Bindings &bindings) const
{
bindings.increaseStackPosition(4);
}