diff options
author | Yann Herklotz <ymherklotz@gmail.com> | 2017-03-17 12:17:42 +0000 |
---|---|---|
committer | Yann Herklotz <ymherklotz@gmail.com> | 2017-03-17 12:17:42 +0000 |
commit | 3d77964b5739146a5285d10543df7b51e066c239 (patch) | |
tree | 06206f8ff72629ef637bec920657d7f21591f65b /c_compiler | |
parent | b23a8f1cedf222b583bc2fedf66b80d2e3c0d076 (diff) | |
download | Compiler-3d77964b5739146a5285d10543df7b51e066c239.tar.gz Compiler-3d77964b5739146a5285d10543df7b51e066c239.zip |
Working functions
Diffstat (limited to 'c_compiler')
-rw-r--r-- | c_compiler/include/bindings.hpp | 2 | ||||
-rw-r--r-- | c_compiler/src/bindings.cpp | 5 | ||||
-rw-r--r-- | c_compiler/src/function.cpp | 2 | ||||
-rw-r--r-- | c_compiler/src/statement.cpp | 9 | ||||
-rw-r--r-- | c_compiler/test/in/IfElse.c | 8 |
5 files changed, 13 insertions, 13 deletions
diff --git a/c_compiler/include/bindings.hpp b/c_compiler/include/bindings.hpp index 81cae69..7525707 100644 --- a/c_compiler/include/bindings.hpp +++ b/c_compiler/include/bindings.hpp @@ -25,6 +25,7 @@ private: std::map<std::string, DeclarationData> bindings_; int stack_counter_; int expression_stack_; + unsigned label_count; public: VariableStackBindings(); @@ -32,7 +33,6 @@ public: void insertBinding(std::string id, TypePtr type, int stack_position); void increaseStackPosition(); void setStackPosition(int stack_counter); - void resetExpressionStack(); void nextExpressionStackPosition(); int currentStackPosition() const; diff --git a/c_compiler/src/bindings.cpp b/c_compiler/src/bindings.cpp index dda2ddc..05bd288 100644 --- a/c_compiler/src/bindings.cpp +++ b/c_compiler/src/bindings.cpp @@ -28,11 +28,6 @@ void VariableStackBindings::setStackPosition(int stack_counter) stack_counter_ = stack_counter; } -void VariableStackBindings::resetExpressionStack() -{ - expression_stack_ = -4; -} - void VariableStackBindings::nextExpressionStackPosition() { expression_stack_ -= 4; diff --git a/c_compiler/src/function.cpp b/c_compiler/src/function.cpp index 4fb9d95..6f5ba7d 100644 --- a/c_compiler/src/function.cpp +++ b/c_compiler/src/function.cpp @@ -83,7 +83,7 @@ VariableStackBindings Function::printAsm(VariableStackBindings bindings) const // Prints the asm for the compound statement in the function statement_->printAsm(bindings); - std::cout << "\tmove\t$sp,$fp\n\tlw\t$31," << memory_needed-4 << "($sp)\n\tlw\t$fp," + 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 << "\n\tjr\t$31\n\tnop\n"; diff --git a/c_compiler/src/statement.cpp b/c_compiler/src/statement.cpp index e4b30ff..9c0db49 100644 --- a/c_compiler/src/statement.cpp +++ b/c_compiler/src/statement.cpp @@ -173,10 +173,7 @@ VariableStackBindings ExpressionStatement::printAsm(VariableStackBindings bindin next_statement_->printAsm(bindings); if(expression_ != nullptr) - { - bindings.resetExpressionStack(); expression_->printAsm(bindings); - } return bindings; } @@ -222,10 +219,10 @@ VariableStackBindings JumpStatement::printAsm(VariableStackBindings bindings) co if(next_statement_ != nullptr) next_statement_->printAsm(bindings); - if(expression_ != nullptr) { - bindings.resetExpressionStack(); + if(expression_ != nullptr) expression_->printAsm(bindings); - } + + std::cout << "\tj\t0f\n"; return bindings; } diff --git a/c_compiler/test/in/IfElse.c b/c_compiler/test/in/IfElse.c new file mode 100644 index 0000000..2d49e2c --- /dev/null +++ b/c_compiler/test/in/IfElse.c @@ -0,0 +1,8 @@ +int f(int a) +{ + if(a == 2) { + return 3; + } else { + return 2; + } +} |