aboutsummaryrefslogtreecommitdiffstats
path: root/c_compiler
diff options
context:
space:
mode:
authorYann Herklotz <ymherklotz@gmail.com>2017-03-17 15:32:22 +0000
committerYann Herklotz <ymherklotz@gmail.com>2017-03-17 15:32:22 +0000
commit3d846f1ef6fa03a075e3b1f6cd2f021856d2846f (patch)
tree8710b643a58a782403a7b179b6d3abe2fb09c356 /c_compiler
parent3d77964b5739146a5285d10543df7b51e066c239 (diff)
downloadCompiler-3d846f1ef6fa03a075e3b1f6cd2f021856d2846f.tar.gz
Compiler-3d846f1ef6fa03a075e3b1f6cd2f021856d2846f.zip
Trying to fix segfault
Diffstat (limited to 'c_compiler')
-rw-r--r--c_compiler/include/bindings.hpp2
-rw-r--r--c_compiler/include/declaration.hpp2
-rw-r--r--c_compiler/include/expression.hpp54
-rw-r--r--c_compiler/include/function.hpp2
-rw-r--r--c_compiler/include/node.hpp2
-rw-r--r--c_compiler/include/statement.hpp12
-rw-r--r--c_compiler/include/translation_unit.hpp2
-rw-r--r--c_compiler/include/type.hpp2
-rw-r--r--c_compiler/src/c_lexer.flex4
-rw-r--r--c_compiler/src/c_parser.y34
-rw-r--r--c_compiler/src/compiler_main.cpp6
-rw-r--r--c_compiler/src/declaration.cpp8
-rw-r--r--c_compiler/src/expression.cpp97
-rw-r--r--c_compiler/src/function.cpp7
-rw-r--r--c_compiler/src/statement.cpp24
-rw-r--r--c_compiler/src/translation_unit.cpp4
-rw-r--r--c_compiler/src/type.cpp2
-rw-r--r--c_compiler/test/in/Add.c8
18 files changed, 143 insertions, 129 deletions
diff --git a/c_compiler/include/bindings.hpp b/c_compiler/include/bindings.hpp
index 7525707..1104bb8 100644
--- a/c_compiler/include/bindings.hpp
+++ b/c_compiler/include/bindings.hpp
@@ -25,7 +25,6 @@ private:
std::map<std::string, DeclarationData> bindings_;
int stack_counter_;
int expression_stack_;
- unsigned label_count;
public:
VariableStackBindings();
@@ -37,7 +36,6 @@ public:
int currentStackPosition() const;
int stackPosition(const std::string& id) const;
-
int currentExpressionStackPosition() const;
bool bindingExists(const std::string& id) const;
diff --git a/c_compiler/include/declaration.hpp b/c_compiler/include/declaration.hpp
index 8c4fc25..ce4faa7 100644
--- a/c_compiler/include/declaration.hpp
+++ b/c_compiler/include/declaration.hpp
@@ -25,7 +25,7 @@ public:
virtual void print() const;
virtual void printXml() const;
- virtual VariableStackBindings printAsm(VariableStackBindings bindings) const;
+ virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const;
void linkDeclaration(Declaration* next_declaration);
void linkListDeclaration(Declaration* next_list_declaration);
diff --git a/c_compiler/include/expression.hpp b/c_compiler/include/expression.hpp
index 0f14584..19d2c4f 100644
--- a/c_compiler/include/expression.hpp
+++ b/c_compiler/include/expression.hpp
@@ -20,7 +20,7 @@ private:
ExpressionPtr next_expression_;
public:
- virtual VariableStackBindings printAsm(VariableStackBindings bindings) const = 0;
+ virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const = 0;
virtual void print() const;
virtual void printXml() const;
@@ -44,7 +44,7 @@ protected:
public:
OperationExpression(Expression* lhs, Expression* rhs);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings) const = 0;
+ virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const = 0;
};
@@ -53,7 +53,7 @@ class PostfixExpression : public Expression
public:
PostfixExpression();
- virtual VariableStackBindings printAsm(VariableStackBindings bindings) const;
+ virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const;
};
@@ -62,7 +62,7 @@ class PostfixArrayElement : public Expression
public:
PostfixArrayElement();
- virtual VariableStackBindings printAsm(VariableStackBindings bindings) const;
+ virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const;
};
@@ -75,7 +75,7 @@ private:
public:
PostfixFunctionCall(Expression* argument_expression_list = nullptr);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings) const;
+ virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const;
virtual void countArguments(unsigned& argument_count) const;
void setPostfixExpression(Expression* postfix_expression);
@@ -87,7 +87,7 @@ class UnaryExpression : public Expression
public:
UnaryExpression();
- virtual VariableStackBindings printAsm(VariableStackBindings bindings) const;
+ virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const;
};
@@ -100,31 +100,31 @@ private:
public:
CastExpression(Type* type, Expression* expression);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings) const;
+ virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const;
};
class AdditiveExpression : public OperationExpression
{
private:
- std::string operation_;
+ std::string operator_;
public:
- AdditiveExpression(Expression* lhs, const std::string& operation, Expression* rhs);
+ AdditiveExpression(Expression* lhs, const std::string& _operator, Expression* rhs);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings) const;
+ virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const;
};
class MultiplicativeExpression : public OperationExpression
{
private:
- std::string operation_;
+ std::string operator_;
public:
- MultiplicativeExpression(Expression* lhs, const std::string& operation, Expression* rhs);
+ MultiplicativeExpression(Expression* lhs, const std::string& _operator, Expression* rhs);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings) const;
+ virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const;
};
@@ -133,7 +133,7 @@ class ShiftExpression : public OperationExpression
public:
ShiftExpression(Expression* lhs, Expression* rhs);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings) const;
+ virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const;
};
@@ -142,16 +142,18 @@ class RelationalExpression : public OperationExpression
public:
RelationalExpression(Expression* lhs, Expression* rhs);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings) const;
+ virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const;
};
class EqualityExpression : public OperationExpression
{
+private:
+ std::string operator_;
public:
- EqualityExpression(Expression* lhs, Expression* rhs);
+ EqualityExpression(Expression* lhs, const std::string& _operator, Expression* rhs);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings) const;
+ virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const;
};
@@ -160,7 +162,7 @@ class AndExpression : public OperationExpression
public:
AndExpression(Expression* lhs, Expression* rhs);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings) const;
+ virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const;
};
@@ -169,7 +171,7 @@ class ExclusiveOrExpression : public OperationExpression
public:
ExclusiveOrExpression(Expression* lhs, Expression* rhs);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings) const;
+ virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const;
};
@@ -178,7 +180,7 @@ class InclusiveOrExpression : public OperationExpression
public:
InclusiveOrExpression(Expression* lhs, Expression* rhs);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings) const;
+ virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const;
};
@@ -187,7 +189,7 @@ class LogicalAndExpression : public OperationExpression
public:
LogicalAndExpression(Expression* lhs, Expression* rhs);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings) const;
+ virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const;
};
@@ -196,7 +198,7 @@ class LogicalOrExpression : public OperationExpression
public:
LogicalOrExpression(Expression* lhs, Expression* rhs);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings) const;
+ virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const;
};
@@ -211,7 +213,7 @@ public:
ConditionalExpression(Expression* logical_or, Expression* expression,
Expression* conditional_expression);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings) const;
+ virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const;
};
@@ -220,7 +222,7 @@ class AssignmentExpression : public OperationExpression
public:
AssignmentExpression(Expression* lhs, Expression* rhs);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings) const;
+ virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const;
};
@@ -231,7 +233,7 @@ private:
public:
Identifier(const std::string& id);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings) const;
+ virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const;
virtual int postfixStackPosition(VariableStackBindings bindings) const;
virtual std::string id() const;
};
@@ -244,7 +246,7 @@ private:
public:
Constant(const int32_t& constant);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings) const;
+ virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const;
};
diff --git a/c_compiler/include/function.hpp b/c_compiler/include/function.hpp
index dbdbd11..38e1898 100644
--- a/c_compiler/include/function.hpp
+++ b/c_compiler/include/function.hpp
@@ -27,7 +27,7 @@ public:
virtual void print() const;
virtual void printXml() const;
- virtual VariableStackBindings printAsm(VariableStackBindings bindings) const;
+ virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const;
void printParameterAsm(VariableStackBindings& bindings, unsigned& stack_offset,
unsigned& frame_offset) const;
diff --git a/c_compiler/include/node.hpp b/c_compiler/include/node.hpp
index f27c804..c00fa8f 100644
--- a/c_compiler/include/node.hpp
+++ b/c_compiler/include/node.hpp
@@ -17,7 +17,7 @@ public:
virtual void print() const = 0;
virtual void printXml() const = 0;
- virtual VariableStackBindings printAsm(VariableStackBindings bindings) const = 0;
+ virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const = 0;
};
diff --git a/c_compiler/include/statement.hpp b/c_compiler/include/statement.hpp
index 4d2ffc4..fe0597c 100644
--- a/c_compiler/include/statement.hpp
+++ b/c_compiler/include/statement.hpp
@@ -22,7 +22,7 @@ public:
virtual void print() const = 0;
virtual void printXml() const = 0;
- virtual VariableStackBindings printAsm(VariableStackBindings bindings) const = 0;
+ virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const = 0;
virtual void countVariables(unsigned& var_count) const = 0;
virtual void countArguments(unsigned& argument_count) const = 0;
@@ -42,7 +42,7 @@ public:
virtual void print() const;
virtual void printXml() const;
- virtual VariableStackBindings printAsm(VariableStackBindings bindings) const;
+ virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const;
virtual void countVariables(unsigned& var_count) const;
virtual void countArguments(unsigned& argument_count) const;
@@ -58,7 +58,7 @@ public:
virtual void print() const;
virtual void printXml() const;
- virtual VariableStackBindings printAsm(VariableStackBindings bindings) const;
+ virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const;
virtual void countVariables(unsigned& var_count) const;
virtual void countArguments(unsigned& argument_count) const;
@@ -73,7 +73,7 @@ public:
virtual void print() const;
virtual void printXml() const;
- virtual VariableStackBindings printAsm(VariableStackBindings bindings) const;
+ virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const;
virtual void countVariables(unsigned& var_count) const;
virtual void countArguments(unsigned& argument_count) const;
@@ -88,7 +88,7 @@ public:
virtual void print() const;
virtual void printXml() const;
- virtual VariableStackBindings printAsm(VariableStackBindings bindings) const;
+ virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const;
virtual void countVariables(unsigned& var_count) const;
virtual void countArguments(unsigned& argument_count) const;
@@ -103,7 +103,7 @@ public:
virtual void print() const;
virtual void printXml() const;
- virtual VariableStackBindings printAsm(VariableStackBindings bindings) const;
+ virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const;
virtual void countVariables(unsigned& var_count) const;
virtual void countArguments(unsigned& argument_count) const;
diff --git a/c_compiler/include/translation_unit.hpp b/c_compiler/include/translation_unit.hpp
index 3e8197a..a23b735 100644
--- a/c_compiler/include/translation_unit.hpp
+++ b/c_compiler/include/translation_unit.hpp
@@ -19,7 +19,7 @@ public:
virtual void print() const;
virtual void printXml() const;
- virtual VariableStackBindings printAsm(VariableStackBindings bindings) const;
+ virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const;
void push(Node* external_declaration);
};
diff --git a/c_compiler/include/type.hpp b/c_compiler/include/type.hpp
index 9352674..9b9bbba 100644
--- a/c_compiler/include/type.hpp
+++ b/c_compiler/include/type.hpp
@@ -16,7 +16,7 @@ class Type : public Node {
public:
virtual void print() const;
virtual void printXml() const;
- virtual VariableStackBindings printAsm(VariableStackBindings bindings) const;
+ virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const;
virtual std::string getType() const = 0;
};
diff --git a/c_compiler/src/c_lexer.flex b/c_compiler/src/c_lexer.flex
index 716e1ac..6f0262e 100644
--- a/c_compiler/src/c_lexer.flex
+++ b/c_compiler/src/c_lexer.flex
@@ -55,8 +55,8 @@ ALL .
[|] { return T_OR; }
[\^] { return T_XOR; }
[&] { return T_AND; }
-[=][=] { return T_EQUALITY_OP; }
-[!][=] { return T_EQUALITY_OP; }
+[=][=] { yylval.string = new std::string(yytext); return T_EQUALITY_OP; }
+[!][=] { yylval.string = new std::string(yytext); return T_EQUALITY_OP; }
([<>][=])|[<>] { return T_REL_OP; }
[<>][<>] { return T_SHIFT_OP; }
[*] { yylval.string = new std::string(yytext); return T_MULT; }
diff --git a/c_compiler/src/c_parser.y b/c_compiler/src/c_parser.y
index 1ee7966..3342f2a 100644
--- a/c_compiler/src/c_parser.y
+++ b/c_compiler/src/c_parser.y
@@ -71,7 +71,7 @@ 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 MultDivRemOP UnaryOperator
+ T_MULT T_DIV T_REM T_EQUALITY_OP MultDivRemOP UnaryOperator
%start ROOT
@@ -96,8 +96,8 @@ ExternalDeclaration:
// FUNCTION DEFINITION
FunctionDefinition:
- DeclarationSpec Declarator CompoundStatement {
- $$ = new Function($2->getId(), $3, $2->getNext()); }
+ DeclarationSpec Declarator CompoundStatement
+ { $$ = new Function($2->getId(), $3, $2->getNext()); }
;
ParameterList:
@@ -225,56 +225,60 @@ ASSIGN_OPER: T_ASSIGN_OPER { ; }
ConditionalExpression:
LogicalOrExpression { $$ = $1; }
- | LogicalOrExpression T_QU Expression T_COL ConditionalExpression { $$ = $1; }
+ | LogicalOrExpression T_QU Expression T_COL ConditionalExpression
+ { $$ = new ConditionalExpression($1, $3, $5); }
;
LogicalOrExpression:
LogicalAndExpression { $$ = $1; }
- | LogicalOrExpression T_LOG_OR LogicalAndExpression { $$ = $3; }
+ | LogicalOrExpression T_LOG_OR LogicalAndExpression { $$ = new LogicalOrExpression($1, $3); }
;
LogicalAndExpression:
InclusiveOrExpression { $$ = $1; }
- | LogicalAndExpression T_LOG_AND InclusiveOrExpression { $$ = $3; }
+ | LogicalAndExpression T_LOG_AND InclusiveOrExpression { $$ = new LogicalAndExpression($1, $3); }
;
InclusiveOrExpression:
ExclusiveOrExpression { $$ = $1; }
- | InclusiveOrExpression T_OR ExclusiveOrExpression { $$ = $3; }
+ | InclusiveOrExpression T_OR ExclusiveOrExpression { $$ = new InclusiveOrExpression($1, $3); }
;
ExclusiveOrExpression:
AndExpression { $$ = $1; }
- | ExclusiveOrExpression T_XOR AndExpression { $$ = $3; }
+ | ExclusiveOrExpression T_XOR AndExpression { $$ = new ExclusiveOrExpression($1, $3); }
;
AndExpression: EqualityExpression { $$ = $1; }
- | AndExpression T_AND EqualityExpression { $$ = $3; }
+ | AndExpression T_AND EqualityExpression { $$ = new AndExpression($1, $3); }
;
EqualityExpression:
RelationalExpression { $$ = $1; }
- | EqualityExpression T_EQUALITY_OP RelationalExpression { $$ = $3; }
+ | EqualityExpression T_EQUALITY_OP RelationalExpression
+ { $$ = new EqualityExpression($1, *$2, $3); delete $2; }
;
RelationalExpression:
ShiftExpression { $$ = $1; }
- | RelationalExpression T_REL_OP ShiftExpression { $$ = $3; }
+ | RelationalExpression T_REL_OP ShiftExpression { $$ = new RelationalExpression($1, $3); }
;
ShiftExpression:
AdditiveExpression { $$ = $1; }
- | ShiftExpression T_SHIFT_OP AdditiveExpression { $$ = $3; }
+ | ShiftExpression T_SHIFT_OP AdditiveExpression { $$ = new ShiftExpression($1, $3); }
;
AdditiveExpression:
MultiplicativeExpression { $$ = $1; }
- | AdditiveExpression T_ADDSUB_OP MultiplicativeExpression { $$ = new AdditiveExpression($1, *$2, $3); delete $2; }
+ | AdditiveExpression T_ADDSUB_OP MultiplicativeExpression
+ { $$ = new AdditiveExpression($1, *$2, $3); delete $2; }
;
MultiplicativeExpression:
CastExpression { $$ = $1; }
- | MultiplicativeExpression MultDivRemOP CastExpression { $$ = new MultiplicativeExpression($1, *$2, $3); delete $2; }
+ | MultiplicativeExpression MultDivRemOP CastExpression
+ { $$ = new MultiplicativeExpression($1, *$2, $3); delete $2; }
;
MultDivRemOP: T_MULT { $$ = $1; }
@@ -283,7 +287,7 @@ MultDivRemOP: T_MULT { $$ = $1; }
;
CastExpression: UnaryExpression { $$ = $1; }
- | T_LRB DeclarationSpec T_RRB CastExpression { $$ = $4; }
+ | T_LRB DeclarationSpec T_RRB CastExpression { $$ = new CastExpression($2, $4); }
;
UnaryExpression:
diff --git a/c_compiler/src/compiler_main.cpp b/c_compiler/src/compiler_main.cpp
index 0805de3..15276dd 100644
--- a/c_compiler/src/compiler_main.cpp
+++ b/c_compiler/src/compiler_main.cpp
@@ -7,11 +7,13 @@ Node* parseAST();
int main(int argc, char *argv[])
{
+ (void)argc, (void)argv;
std::unique_ptr<Node> ast(parseAST());
VariableStackBindings bindings;
+ unsigned label_count = 0;
- ast->printAsm(bindings);
-
+ ast->printAsm(bindings, label_count);
+
return 0;
}
diff --git a/c_compiler/src/declaration.cpp b/c_compiler/src/declaration.cpp
index 353b470..b25ece4 100644
--- a/c_compiler/src/declaration.cpp
+++ b/c_compiler/src/declaration.cpp
@@ -34,7 +34,7 @@ void Declaration::printXml() const
std::cout << "<Variable id=\""<< id_ << "\" />" << std::endl;
}
-VariableStackBindings Declaration::printAsm(VariableStackBindings bindings) const
+VariableStackBindings Declaration::printAsm(VariableStackBindings bindings, unsigned& label_count) const
{
// if(init == nullptr)
// std::cout << "\t.comm\t" << id << ",4,4" << std::endl;
@@ -46,14 +46,14 @@ VariableStackBindings Declaration::printAsm(VariableStackBindings bindings) cons
// return bindings;
if(next_declaration_ != nullptr)
- bindings = next_declaration_->printAsm(bindings);
+ bindings = next_declaration_->printAsm(bindings, label_count);
if(next_list_declaration_ != nullptr)
- bindings = next_list_declaration_->printAsm(bindings);
+ bindings = next_list_declaration_->printAsm(bindings, label_count);
if(id_ != "") {
if(initializer_ != nullptr)
- initializer_->printAsm(bindings);
+ initializer_->printAsm(bindings, label_count);
else
std::cout << "\tmove\t$2,$0" << std::endl;
diff --git a/c_compiler/src/expression.cpp b/c_compiler/src/expression.cpp
index 55ecb54..43230c6 100644
--- a/c_compiler/src/expression.cpp
+++ b/c_compiler/src/expression.cpp
@@ -62,9 +62,8 @@ OperationExpression::OperationExpression(Expression* lhs, Expression* rhs)
PostfixExpression::PostfixExpression()
{}
-VariableStackBindings PostfixExpression::printAsm(VariableStackBindings bindings) const
+VariableStackBindings PostfixExpression::printAsm(VariableStackBindings bindings, unsigned& label_count) const
{
-
return bindings;
}
@@ -74,7 +73,7 @@ VariableStackBindings PostfixExpression::printAsm(VariableStackBindings bindings
PostfixArrayElement::PostfixArrayElement()
{}
-VariableStackBindings PostfixArrayElement::printAsm(VariableStackBindings bindings) const
+VariableStackBindings PostfixArrayElement::printAsm(VariableStackBindings bindings, unsigned& label_count) const
{
return bindings;
}
@@ -86,7 +85,7 @@ PostfixFunctionCall::PostfixFunctionCall(Expression* argument_expression_list)
: argument_expression_list_(argument_expression_list)
{}
-VariableStackBindings PostfixFunctionCall::printAsm(VariableStackBindings bindings) const
+VariableStackBindings PostfixFunctionCall::printAsm(VariableStackBindings bindings, unsigned& label_count) const
{
std::vector<ExpressionPtr> argument_vector;
ExpressionPtr current_argument = argument_expression_list_;
@@ -98,7 +97,7 @@ VariableStackBindings PostfixFunctionCall::printAsm(VariableStackBindings bindin
}
for(auto itr = argument_vector.rbegin(); itr != argument_vector.rend(); ++itr) {
- (*itr)->printAsm(bindings);
+ (*itr)->printAsm(bindings, label_count);
if(argument_counter < 4)
std::cout << "\tmove\t$" << 4+argument_counter << ",$2\n";
@@ -137,7 +136,7 @@ void PostfixFunctionCall::setPostfixExpression(Expression* postfix_expression)
UnaryExpression::UnaryExpression()
{}
-VariableStackBindings UnaryExpression::printAsm(VariableStackBindings bindings) const
+VariableStackBindings UnaryExpression::printAsm(VariableStackBindings bindings, unsigned& label_count) const
{
return bindings;
}
@@ -149,7 +148,7 @@ CastExpression::CastExpression(Type* type, Expression* expression)
: type_(type), expression_(expression)
{}
-VariableStackBindings CastExpression::printAsm(VariableStackBindings bindings) const
+VariableStackBindings CastExpression::printAsm(VariableStackBindings bindings, unsigned& label_count) const
{
return bindings;
}
@@ -157,21 +156,21 @@ VariableStackBindings CastExpression::printAsm(VariableStackBindings bindings) c
// Additive Expression definition
-AdditiveExpression::AdditiveExpression(Expression* lhs, const std::string& operation, Expression* rhs)
- : OperationExpression(lhs, rhs), operation_(operation)
+AdditiveExpression::AdditiveExpression(Expression* lhs, const std::string& _operator, Expression* rhs)
+ : OperationExpression(lhs, rhs), operator_(_operator)
{}
-VariableStackBindings AdditiveExpression::printAsm(VariableStackBindings bindings) const
+VariableStackBindings AdditiveExpression::printAsm(VariableStackBindings bindings, unsigned& label_count) const
{
// I can just evaluate the lhs with the same entry stack position
- lhs_->printAsm(bindings);
+ lhs_->printAsm(bindings, label_count);
// store this stack position
int lhs_stack_position = bindings.currentExpressionStackPosition();
// now have to increase the expression stack position for the rhs
bindings.nextExpressionStackPosition();
- rhs_->printAsm(bindings);
+ rhs_->printAsm(bindings, label_count);
// now I have them evaluated at two positions in the stack and can load both into registers
// $2 and $3
@@ -181,12 +180,12 @@ VariableStackBindings AdditiveExpression::printAsm(VariableStackBindings binding
// TODO currently using signed and sub because I only have signed numbers implemented
// must update this as I add more types
- if(operation_ == "+")
+ if(operator_ == "+")
std::cout << "\tadd\t$2,$2,$3" << std::endl;
- else if(operation_ == "-")
+ else if(operator_ == "-")
std::cout << "\tsub\t$2,$2,$3" << std::endl;
else
- std::cerr << "Don't recognize symbol: '" << operation_ << "'" << std::endl;
+ std::cerr << "Don't recognize symbol: '" << operator_ << "'" << std::endl;
// now I have to store it back into the original stack position
std::cout << "\tsw\t$2," << lhs_stack_position << "($fp)" << std::endl;
@@ -198,36 +197,36 @@ VariableStackBindings AdditiveExpression::printAsm(VariableStackBindings binding
// Multiplicative Expression definition
-MultiplicativeExpression::MultiplicativeExpression(Expression* lhs, const std::string& operation, Expression* rhs)
- : OperationExpression(lhs, rhs), operation_(operation)
+MultiplicativeExpression::MultiplicativeExpression(Expression* lhs, const std::string& _operator, Expression* rhs)
+ : OperationExpression(lhs, rhs), operator_(_operator)
{}
-VariableStackBindings MultiplicativeExpression::printAsm(VariableStackBindings bindings) const
+VariableStackBindings MultiplicativeExpression::printAsm(VariableStackBindings bindings, unsigned& label_count) const
{
// I can just evaluate lhs without increasing stack count
- lhs_->printAsm(bindings);
+ lhs_->printAsm(bindings, label_count);
// store current stack position
int lhs_stack_position = bindings.currentExpressionStackPosition();
// increase stack position to store next result in
bindings.nextExpressionStackPosition();
- rhs_->printAsm(bindings);
+ rhs_->printAsm(bindings, label_count);
std::cout << "\tlw\t$2," << lhs_stack_position << "($fp)" << std::endl;
std::cout << "\tlw\t$3," << bindings.currentExpressionStackPosition() << "($fp)" << std::endl;
// then perform the right operation
- if(operation_ == "*")
+ if(operator_ == "*")
std::cout << "\tmul\t$2,$2,$3" << std::endl;
- else if(operation_ == "/" || operation_ == "%") {
+ else if(operator_ == "/" || operator_ == "%") {
std::cout << "\tdiv\t$2,$3" << std::endl;
- if(operation_ == "/")
+ if(operator_ == "/")
std::cout << "\tmflo\t$2" << std::endl;
else
std::cout << "\tmfhi\t$2" << std::endl;
} else
- std::cerr << "Don't recognize symbol '" << operation_ << "'" << std::endl;
+ std::cerr << "Don't recognize symbol '" << operator_ << "'" << std::endl;
// finally store result back into the stack position
std::cout << "\tsw\t$2," << lhs_stack_position << "($fp)" << std::endl;
@@ -242,7 +241,7 @@ ShiftExpression::ShiftExpression(Expression* lhs, Expression* rhs)
: OperationExpression(lhs, rhs)
{}
-VariableStackBindings ShiftExpression::printAsm(VariableStackBindings bindings) const
+VariableStackBindings ShiftExpression::printAsm(VariableStackBindings bindings, unsigned& label_count) const
{
return bindings;
}
@@ -254,7 +253,7 @@ RelationalExpression::RelationalExpression(Expression* lhs, Expression* rhs)
: OperationExpression(lhs, rhs)
{}
-VariableStackBindings RelationalExpression::printAsm(VariableStackBindings bindings) const
+VariableStackBindings RelationalExpression::printAsm(VariableStackBindings bindings, unsigned& label_count) const
{
return bindings;
}
@@ -262,12 +261,26 @@ VariableStackBindings RelationalExpression::printAsm(VariableStackBindings bindi
// EqualityExpression definition
-EqualityExpression::EqualityExpression(Expression* lhs, Expression* rhs)
- : OperationExpression(lhs, rhs)
+EqualityExpression::EqualityExpression(Expression* lhs, const std::string& _operator, Expression* rhs)
+ : OperationExpression(lhs, rhs), operator_(_operator)
{}
-VariableStackBindings EqualityExpression::printAsm(VariableStackBindings bindings) const
+VariableStackBindings EqualityExpression::printAsm(VariableStackBindings bindings, unsigned& label_count) const
{
+ (void)label_count;
+
+ // I can just evaluate lhs without increasing stack count
+ lhs_->printAsm(bindings, label_count);
+
+ // store current stack position
+ int lhs_stack_position = bindings.currentExpressionStackPosition();
+
+ // increase stack position to store next result in
+ bindings.nextExpressionStackPosition();
+ rhs_->printAsm(bindings, label_count);
+
+ std::cout << "\txor\t$2,$2,$3\n";
+
return bindings;
}
@@ -278,7 +291,7 @@ AndExpression::AndExpression(Expression* lhs, Expression* rhs)
: OperationExpression(lhs, rhs)
{}
-VariableStackBindings AndExpression::printAsm(VariableStackBindings bindings) const
+VariableStackBindings AndExpression::printAsm(VariableStackBindings bindings, unsigned& label_count) const
{
return bindings;
}
@@ -290,7 +303,7 @@ ExclusiveOrExpression::ExclusiveOrExpression(Expression* lhs, Expression* rhs)
: OperationExpression(lhs, rhs)
{}
-VariableStackBindings ExclusiveOrExpression::printAsm(VariableStackBindings bindings) const
+VariableStackBindings ExclusiveOrExpression::printAsm(VariableStackBindings bindings, unsigned& label_count) const
{
return bindings;
}
@@ -302,7 +315,7 @@ InclusiveOrExpression::InclusiveOrExpression(Expression* lhs, Expression* rhs)
: OperationExpression(lhs, rhs)
{}
-VariableStackBindings InclusiveOrExpression::printAsm(VariableStackBindings bindings) const
+VariableStackBindings InclusiveOrExpression::printAsm(VariableStackBindings bindings, unsigned& label_count) const
{
return bindings;
}
@@ -314,7 +327,7 @@ LogicalAndExpression::LogicalAndExpression(Expression* lhs, Expression* rhs)
: OperationExpression(lhs, rhs)
{}
-VariableStackBindings LogicalAndExpression::printAsm(VariableStackBindings bindings) const
+VariableStackBindings LogicalAndExpression::printAsm(VariableStackBindings bindings, unsigned& label_count) const
{
return bindings;
}
@@ -326,7 +339,7 @@ LogicalOrExpression::LogicalOrExpression(Expression* lhs, Expression* rhs)
: OperationExpression(lhs, rhs)
{}
-VariableStackBindings LogicalOrExpression::printAsm(VariableStackBindings bindings) const
+VariableStackBindings LogicalOrExpression::printAsm(VariableStackBindings bindings, unsigned& label_count) const
{
return bindings;
}
@@ -341,7 +354,7 @@ ConditionalExpression::ConditionalExpression(Expression* logical_or,
conditional_expression_(conditional_expression)
{}
-VariableStackBindings ConditionalExpression::printAsm(VariableStackBindings bindings) const
+VariableStackBindings ConditionalExpression::printAsm(VariableStackBindings bindings, unsigned& label_count) const
{
return bindings;
}
@@ -353,7 +366,7 @@ AssignmentExpression::AssignmentExpression(Expression* lhs, Expression* rhs)
: OperationExpression(lhs, rhs)
{}
-VariableStackBindings AssignmentExpression::printAsm(VariableStackBindings bindings) const
+VariableStackBindings AssignmentExpression::printAsm(VariableStackBindings bindings, unsigned& label_count) const
{
// TODO add stack and store results in there, also for addition and multiplication.
@@ -365,7 +378,7 @@ VariableStackBindings AssignmentExpression::printAsm(VariableStackBindings bindi
// evaluate rhs and get the result back at the stack position I assigned
// don't have to change the stack position as there is no lhs to evaluate
- rhs_->printAsm(bindings);
+ rhs_->printAsm(bindings, label_count);
// now the result of the rhs will be in that stack position, so we can load it into $2
std::cout << "\tlw\t$2," << expression_stack_position << "($fp)" << std::endl;
@@ -382,11 +395,12 @@ Identifier::Identifier(const std::string& id)
: id_(id)
{}
-VariableStackBindings Identifier::printAsm(VariableStackBindings bindings) const
+VariableStackBindings Identifier::printAsm(VariableStackBindings bindings, unsigned& label_count) const
{
- if(bindings.bindingExists(id_))
+ (void)label_count;
+ if(bindings.bindingExists(id_)) {
std::cout << "\tlw\t$2," << bindings.stackPosition(id_) << "($fp)" << std::endl;
- else
+ } else
std::cerr << "Can't find identifier '" << id_ << "' in current scope binding" << std::endl;
std::cout << "\tsw\t$2," << bindings.currentExpressionStackPosition() << "($fp)" << std::endl;
@@ -415,8 +429,9 @@ Constant::Constant(const int32_t& constant)
: constant_(constant)
{}
-VariableStackBindings Constant::printAsm(VariableStackBindings bindings) const
+VariableStackBindings Constant::printAsm(VariableStackBindings bindings, unsigned& label_count) const
{
+ (void)label_count;
// constant only has to load to $2 because the other expression will take care of the rest
std::cout << "\tli\t$2," << constant_ << std::endl;
std::cout << "\tsw\t$2," << bindings.currentExpressionStackPosition() << "($fp)" << std::endl;
diff --git a/c_compiler/src/function.cpp b/c_compiler/src/function.cpp
index 6f5ba7d..c979277 100644
--- a/c_compiler/src/function.cpp
+++ b/c_compiler/src/function.cpp
@@ -29,8 +29,7 @@ void Function::printXml() const
std::vector<std::string> parameter_vec;
while(parameter != nullptr) {
- if(parameter->getId() != "")
- parameter_vec.push_back(parameter->getId());
+ parameter_vec.push_back(parameter->getId());
parameter = parameter->getNext();
}
@@ -46,7 +45,7 @@ void Function::printXml() const
std::cout << "</Function>" << std::endl;
}
-VariableStackBindings Function::printAsm(VariableStackBindings bindings) const
+VariableStackBindings Function::printAsm(VariableStackBindings bindings, unsigned& label_count) const
{
// Counting all the variables being declared in the function
unsigned variable_count = 0;
@@ -81,7 +80,7 @@ VariableStackBindings Function::printAsm(VariableStackBindings bindings) const
bindings.setStackPosition((max_argument_count+parameter_count)*4);
// Prints the asm for the compound statement in the function
- statement_->printAsm(bindings);
+ statement_->printAsm(bindings, label_count);
std::cout << "0:\n\tmove\t$sp,$fp\n\tlw\t$31," << memory_needed-4 << "($sp)\n\tlw\t$fp,"
<< memory_needed-8 << "($sp)\n\taddiu\t$sp,$sp," << memory_needed
diff --git a/c_compiler/src/statement.cpp b/c_compiler/src/statement.cpp
index 9c0db49..52803c1 100644
--- a/c_compiler/src/statement.cpp
+++ b/c_compiler/src/statement.cpp
@@ -51,18 +51,18 @@ void CompoundStatement::printXml() const
std::cout << "</Scope>" << std::endl;
}
-VariableStackBindings CompoundStatement::printAsm(VariableStackBindings bindings) const
+VariableStackBindings CompoundStatement::printAsm(VariableStackBindings bindings, unsigned& label_count) const
{
VariableStackBindings outer_scope_bindings = bindings;
if(next_statement_ != nullptr)
- next_statement_->printAsm(bindings);
+ next_statement_->printAsm(bindings, label_count);
if(declaration_ != nullptr)
- bindings = declaration_->printAsm(bindings);
+ bindings = declaration_->printAsm(bindings, label_count);
if(statement_ != nullptr)
- statement_->printAsm(bindings);
+ statement_->printAsm(bindings, label_count);
return outer_scope_bindings;
}
@@ -125,7 +125,7 @@ void SelectionStatement::printXml() const
else_->printXml();
}
-VariableStackBindings SelectionStatement::printAsm(VariableStackBindings bindings) const
+VariableStackBindings SelectionStatement::printAsm(VariableStackBindings bindings, unsigned& label_count) const
{
return bindings;
}
@@ -167,13 +167,13 @@ void ExpressionStatement::print() const
void ExpressionStatement::printXml() const
{}
-VariableStackBindings ExpressionStatement::printAsm(VariableStackBindings bindings) const
+VariableStackBindings ExpressionStatement::printAsm(VariableStackBindings bindings, unsigned& label_count) const
{
if(next_statement_ != nullptr)
- next_statement_->printAsm(bindings);
+ next_statement_->printAsm(bindings, label_count);
if(expression_ != nullptr)
- expression_->printAsm(bindings);
+ expression_->printAsm(bindings, label_count);
return bindings;
}
@@ -214,13 +214,13 @@ void JumpStatement::printXml() const
next_statement_->printXml();
}
-VariableStackBindings JumpStatement::printAsm(VariableStackBindings bindings) const
+VariableStackBindings JumpStatement::printAsm(VariableStackBindings bindings, unsigned& label_count) const
{
if(next_statement_ != nullptr)
- next_statement_->printAsm(bindings);
+ next_statement_->printAsm(bindings, label_count);
if(expression_ != nullptr)
- expression_->printAsm(bindings);
+ expression_->printAsm(bindings, label_count);
std::cout << "\tj\t0f\n";
@@ -266,7 +266,7 @@ void IterationStatement::printXml() const
statement_->printXml();
}
-VariableStackBindings IterationStatement::printAsm(VariableStackBindings bindings) const
+VariableStackBindings IterationStatement::printAsm(VariableStackBindings bindings, unsigned& label_count) const
{
return bindings;
}
diff --git a/c_compiler/src/translation_unit.cpp b/c_compiler/src/translation_unit.cpp
index a671851..cb581d3 100644
--- a/c_compiler/src/translation_unit.cpp
+++ b/c_compiler/src/translation_unit.cpp
@@ -25,10 +25,10 @@ void TranslationUnit::printXml() const
std::cout << "</Program>" << std::endl;
}
-VariableStackBindings TranslationUnit::printAsm(VariableStackBindings bindings) const
+VariableStackBindings TranslationUnit::printAsm(VariableStackBindings bindings, unsigned& label_count) const
{
for(auto& node : translation_unit_) {
- node->printAsm(bindings);
+ node->printAsm(bindings, label_count);
}
return bindings;
diff --git a/c_compiler/src/type.cpp b/c_compiler/src/type.cpp
index feda3a5..44c4ddb 100644
--- a/c_compiler/src/type.cpp
+++ b/c_compiler/src/type.cpp
@@ -13,7 +13,7 @@ void Type::print() const
void Type::printXml() const
{}
-VariableStackBindings Type::printAsm(VariableStackBindings bindings) const
+VariableStackBindings Type::printAsm(VariableStackBindings bindings, unsigned& label_count) const
{
return bindings;
}
diff --git a/c_compiler/test/in/Add.c b/c_compiler/test/in/Add.c
index b672efb..b3b1f05 100644
--- a/c_compiler/test/in/Add.c
+++ b/c_compiler/test/in/Add.c
@@ -3,13 +3,7 @@ int main() {
int y = 29;
int z = 84;
- {
- {
- z = x + y + x + y - x;
- }
- }
+ z = (9 + 2 + 3) / 2 + 3 / (2 + 1);
- z = 2 + z - 2;
-
return z;
}