diff options
author | Yann Herklotz <ymherklotz@gmail.com> | 2017-03-17 15:32:22 +0000 |
---|---|---|
committer | Yann Herklotz <ymherklotz@gmail.com> | 2017-03-17 15:32:22 +0000 |
commit | 3d846f1ef6fa03a075e3b1f6cd2f021856d2846f (patch) | |
tree | 8710b643a58a782403a7b179b6d3abe2fb09c356 | |
parent | 3d77964b5739146a5285d10543df7b51e066c239 (diff) | |
download | Compiler-3d846f1ef6fa03a075e3b1f6cd2f021856d2846f.tar.gz Compiler-3d846f1ef6fa03a075e3b1f6cd2f021856d2846f.zip |
Trying to fix segfault
-rw-r--r-- | Notes.org | 9 | ||||
-rw-r--r-- | c_compiler/include/bindings.hpp | 2 | ||||
-rw-r--r-- | c_compiler/include/declaration.hpp | 2 | ||||
-rw-r--r-- | c_compiler/include/expression.hpp | 54 | ||||
-rw-r--r-- | c_compiler/include/function.hpp | 2 | ||||
-rw-r--r-- | c_compiler/include/node.hpp | 2 | ||||
-rw-r--r-- | c_compiler/include/statement.hpp | 12 | ||||
-rw-r--r-- | c_compiler/include/translation_unit.hpp | 2 | ||||
-rw-r--r-- | c_compiler/include/type.hpp | 2 | ||||
-rw-r--r-- | c_compiler/src/c_lexer.flex | 4 | ||||
-rw-r--r-- | c_compiler/src/c_parser.y | 34 | ||||
-rw-r--r-- | c_compiler/src/compiler_main.cpp | 6 | ||||
-rw-r--r-- | c_compiler/src/declaration.cpp | 8 | ||||
-rw-r--r-- | c_compiler/src/expression.cpp | 97 | ||||
-rw-r--r-- | c_compiler/src/function.cpp | 7 | ||||
-rw-r--r-- | c_compiler/src/statement.cpp | 24 | ||||
-rw-r--r-- | c_compiler/src/translation_unit.cpp | 4 | ||||
-rw-r--r-- | c_compiler/src/type.cpp | 2 | ||||
-rw-r--r-- | c_compiler/test/in/Add.c | 8 | ||||
-rw-r--r-- | vgcore.8901 | bin | 0 -> 21749760 bytes |
20 files changed, 152 insertions, 129 deletions
@@ -127,4 +127,13 @@ - The declaration class should only be in charge of storing it in the right location in the stack and adding that to the bindings. +**** TODO Add more expressions + CLOCK: [2017-03-17 Fri 13:21] + + Expressions like > or < or == etc.. +**** TODO Add more statements + +***** If statement +***** For statement +***** While statement 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; } diff --git a/vgcore.8901 b/vgcore.8901 Binary files differnew file mode 100644 index 0000000..7785ee3 --- /dev/null +++ b/vgcore.8901 |