From a7c5f260391da944bd0779e8ac6efb2f0f6b5a6b Mon Sep 17 00:00:00 2001 From: Yann Herklotz Date: Mon, 27 Mar 2017 02:28:29 +0100 Subject: Working even more --- c_compiler/include/bindings.hpp | 18 +-- c_compiler/include/declaration.hpp | 8 +- c_compiler/include/expression.hpp | 90 ++++++++------ c_compiler/include/function.hpp | 4 +- c_compiler/include/node.hpp | 4 +- c_compiler/include/statement.hpp | 30 ++--- c_compiler/include/translation_unit.hpp | 2 +- c_compiler/include/type.hpp | 40 +++--- c_compiler/src/bindings.cpp | 49 +++++--- c_compiler/src/c_lexer.flex | 13 +- c_compiler/src/c_parser.y | 8 +- c_compiler/src/compiler_main.cpp | 2 +- c_compiler/src/declaration.cpp | 8 +- c_compiler/src/expression.cpp | 138 ++++++++++++++------- c_compiler/src/function.cpp | 22 ++-- c_compiler/src/statement.cpp | 30 ++--- c_compiler/src/translation_unit.cpp | 2 +- c_compiler/src/type.cpp | 32 ++--- run_test_deliverable.sh | 14 +-- test_deliverable/testcases/test_MAINPRINT0.c | 7 ++ .../testcases/test_MAINPRINT0_driver.c | 1 + test_deliverable/testcases/test_MAINPRINTF.c | 8 ++ .../testcases/test_MAINPRINTF_driver.c | 1 + test_deliverable/testcases/test_SHORTADD.c | 5 + test_deliverable/testcases/test_SHORTADD_driver.c | 6 + test_deliverable/testcases/test_STRINGLIT.c | 5 + test_deliverable/testcases/test_STRINGLIT_driver.c | 9 ++ 27 files changed, 350 insertions(+), 206 deletions(-) create mode 100644 test_deliverable/testcases/test_MAINPRINT0.c create mode 100644 test_deliverable/testcases/test_MAINPRINT0_driver.c create mode 100644 test_deliverable/testcases/test_MAINPRINTF.c create mode 100644 test_deliverable/testcases/test_MAINPRINTF_driver.c create mode 100644 test_deliverable/testcases/test_SHORTADD.c create mode 100644 test_deliverable/testcases/test_SHORTADD_driver.c create mode 100644 test_deliverable/testcases/test_STRINGLIT.c create mode 100644 test_deliverable/testcases/test_STRINGLIT_driver.c diff --git a/c_compiler/include/bindings.hpp b/c_compiler/include/bindings.hpp index 9383d5d..d99d97b 100644 --- a/c_compiler/include/bindings.hpp +++ b/c_compiler/include/bindings.hpp @@ -1,15 +1,15 @@ #ifndef BINDINGS_HPP #define BINDINGS_HPP -#include #include #include +#include +#include class Type; typedef std::shared_ptr TypePtr; - // struct containing information on the variable declaration struct DeclarationData { @@ -17,21 +17,22 @@ struct DeclarationData int stack_position; }; - // stores bindings for the current scope and where they are in the stack -class VariableStackBindings +class Bindings { private: - std::map bindings_; + static std::vector string_literals; + + std::unordered_map bindings_; std::string break_label_; std::string continue_label_; int stack_counter_; int expression_stack_; - public: - VariableStackBindings(); + Bindings(); void insertBinding(const std::string &id, TypePtr type, const int &stack_position); + int insertStringLiteral(const std::string &string_literal); void increaseStackPosition(); void increaseStackPosition(const int &position); void setStackPosition(const int &stack_counter); @@ -49,6 +50,9 @@ public: int stackPosition(const std::string &id) const; int currentExpressionStackPosition() const; + std::pair::const_iterator, std::vector::const_iterator> + getStringLiteralIterator() const; + bool bindingExists(const std::string &id) const; }; diff --git a/c_compiler/include/declaration.hpp b/c_compiler/include/declaration.hpp index 9080a47..5c8771b 100644 --- a/c_compiler/include/declaration.hpp +++ b/c_compiler/include/declaration.hpp @@ -26,8 +26,8 @@ public: virtual void print() const; virtual void printXml() const; - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; - virtual VariableStackBindings localAsm(VariableStackBindings bindings, int &label_count) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; + virtual Bindings localAsm(Bindings bindings, int &label_count) const; virtual void countDeclarations(int &declaration_count) const; void linkDeclaration(Declaration *next_declaration); @@ -51,8 +51,8 @@ private: public: ArrayDeclaration(const std::string &id = "", ExpressionPtr initializer = nullptr, const int &size = 0); - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; - virtual VariableStackBindings localAsm(VariableStackBindings bindings, int &label_count) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; + virtual Bindings localAsm(Bindings bindings, int &label_count) const; virtual void countDeclarations(int &declaration_count) const; }; diff --git a/c_compiler/include/expression.hpp b/c_compiler/include/expression.hpp index 69ff9e2..c784de7 100644 --- a/c_compiler/include/expression.hpp +++ b/c_compiler/include/expression.hpp @@ -18,7 +18,7 @@ private: ExpressionPtr next_expression_; public: - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int& label_count) const = 0; + virtual Bindings printAsm(Bindings bindings, int& label_count) const = 0; virtual int constantFold() const; virtual void print() const; @@ -26,7 +26,7 @@ public: virtual void countArguments(int &argument_count) const; virtual void expressionDepth(int &depth_count) const; virtual std::string id() const; - virtual TypePtr getType(const VariableStackBindings &bindings) const = 0; + virtual TypePtr getType(const Bindings &bindings) const = 0; void linkExpression(Expression* next_expression); ExpressionPtr nextExpression() const; @@ -41,22 +41,24 @@ public: OperationExpression(Expression *lhs, Expression *rhs); OperationExpression(ExpressionPtr lhs, Expression *rhs); - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const = 0; + virtual Bindings printAsm(Bindings bindings, int &label_count) const = 0; virtual int constantFold() const; virtual void expressionDepth(int &depth_count) const; - virtual TypePtr getType(const VariableStackBindings &bindings) const; + virtual TypePtr getType(const Bindings &bindings) const; ExpressionPtr getLhs() const; ExpressionPtr getRhs() const; - void evaluateExpression(VariableStackBindings bindings, int &label_count) const; + void evaluateExpression(Bindings bindings, int &label_count) const; }; class UnaryExpression : public Expression { public: - virtual void stackPosition(VariableStackBindings bindings, int &depth_count) const; + virtual void expressionDepth(int &depth_count) const; + virtual void pointerPosition(Bindings bindings) const; + virtual void stackPosition(Bindings bindings, int &depth_count) const; }; class PostfixArrayElement : public UnaryExpression @@ -68,10 +70,10 @@ private: public: PostfixArrayElement(Expression *postfix_expression, Expression *index_expression); - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; virtual void expressionDepth(int &depth_count) const; - virtual void stackPosition(VariableStackBindings bindings, int &depth_count) const; - virtual TypePtr getType(const VariableStackBindings &bindings) const; + virtual void stackPosition(Bindings bindings, int &depth_count) const; + virtual TypePtr getType(const Bindings &bindings) const; }; class PostfixFunctionCall : public UnaryExpression @@ -83,10 +85,10 @@ private: public: PostfixFunctionCall(Expression *argument_expression_list = nullptr); - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; virtual void countArguments(int &argument_count) const; virtual void expressionDepth(int &depth_count) const; - virtual TypePtr getType(const VariableStackBindings &bindings) const; + virtual TypePtr getType(const Bindings &bindings) const; void setPostfixExpression(Expression *postfix_expression); }; @@ -100,8 +102,8 @@ private: public: PostfixPostIncDecExpression(const std::string &_operator, Expression *postfix_expression); - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; - virtual TypePtr getType(const VariableStackBindings &bindings) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; + virtual TypePtr getType(const Bindings &bindings) const; }; @@ -114,8 +116,8 @@ private: public: UnaryPreIncDecExpression(const std::string &_operator, Expression *unary_expression); - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; - virtual TypePtr getType(const VariableStackBindings &bindings) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; + virtual TypePtr getType(const Bindings &bindings) const; }; class OperatorUnaryExpression : public UnaryExpression @@ -127,9 +129,9 @@ private: public: OperatorUnaryExpression(const std::string &_operator, Expression *cast_expression); - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; - virtual void stackPosition(VariableStackBindings bindings, int &depth_count) const; - virtual TypePtr getType(const VariableStackBindings &bindings) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; + virtual void stackPosition(Bindings bindings, int &depth_count) const; + virtual TypePtr getType(const Bindings &bindings) const; }; @@ -142,9 +144,9 @@ private: public: CastExpression(Type *type, Expression *expression); - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; virtual void expressionDepth(int &depth_count) const; - virtual TypePtr getType(const VariableStackBindings &bindings) const; + virtual TypePtr getType(const Bindings &bindings) const; }; class AdditiveExpression : public OperationExpression @@ -155,7 +157,7 @@ private: public: AdditiveExpression(Expression *lhs, const std::string &_operator, Expression *rhs); - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; virtual int constantFold() const; }; @@ -167,7 +169,7 @@ private: public: MultiplicativeExpression(Expression *lhs, const std::string &_operator, Expression *rhs); - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; virtual int constantFold() const; }; @@ -178,7 +180,7 @@ private: public: ShiftExpression(Expression *lhs, const std::string &_operator, Expression *rhs); - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; virtual int constantFold() const; }; @@ -189,7 +191,7 @@ private: public: RelationalExpression(Expression *lhs, const std::string &_operator, Expression *rhs); - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; virtual int constantFold() const; }; @@ -200,7 +202,7 @@ private: public: EqualityExpression(Expression *lhs, const std::string &_operator, Expression *rhs); - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; virtual int constantFold() const; }; @@ -209,7 +211,7 @@ class AndExpression : public OperationExpression public: AndExpression(Expression *lhs, Expression *rhs); - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; virtual int constantFold() const; }; @@ -218,7 +220,7 @@ class ExclusiveOrExpression : public OperationExpression public: ExclusiveOrExpression(Expression *lhs, Expression *rhs); - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; virtual int constantFold() const; }; @@ -227,7 +229,7 @@ class InclusiveOrExpression : public OperationExpression public: InclusiveOrExpression(Expression *lhs, Expression *rhs); - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; virtual int constantFold() const; }; @@ -236,7 +238,7 @@ class LogicalAndExpression : public OperationExpression public: LogicalAndExpression(Expression *lhs, Expression *rhs); - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; virtual int constantFold() const; }; @@ -245,7 +247,7 @@ class LogicalOrExpression : public OperationExpression public: LogicalOrExpression(Expression *lhs, Expression *rhs); - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; virtual int constantFold() const; }; @@ -260,8 +262,8 @@ public: ConditionalExpression(Expression *logical_or, Expression *expression, Expression *conditional_expression); - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; - virtual TypePtr getType(const VariableStackBindings &bindings) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; + virtual TypePtr getType(const Bindings &bindings) const; }; class AssignmentExpression : public OperationExpression @@ -270,7 +272,7 @@ public: AssignmentExpression(Expression *lhs, Expression *rhs); AssignmentExpression(ExpressionPtr lhs, Expression *rhs); - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; }; class Identifier : public UnaryExpression @@ -280,10 +282,22 @@ private: public: Identifier(const std::string &id); - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; - virtual void stackPosition(VariableStackBindings bindings, int &depth_count) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; + virtual void pointerPosition(Bindings bindings) const; + virtual void stackPosition(Bindings bindings, int &depth_count) const; virtual std::string id() const; - virtual TypePtr getType(const VariableStackBindings &bindings) const; + virtual TypePtr getType(const Bindings &bindings) const; +}; + +class StringLiteral : public UnaryExpression +{ +private: + std::string string_content_; +public: + StringLiteral(const std::string &string_content); + + virtual Bindings printAsm(Bindings bindings, int &label_count) const; + virtual TypePtr getType(const Bindings &bindings) const; }; class Constant : public UnaryExpression @@ -293,9 +307,9 @@ private: public: Constant(const int32_t &constant); - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; virtual int constantFold() const; - virtual TypePtr getType(const VariableStackBindings &bindings) const; + virtual TypePtr getType(const Bindings &bindings) const; }; #endif diff --git a/c_compiler/include/function.hpp b/c_compiler/include/function.hpp index f9f4fa0..2227f52 100644 --- a/c_compiler/include/function.hpp +++ b/c_compiler/include/function.hpp @@ -27,9 +27,9 @@ public: virtual void print() const; virtual void printXml() const; - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int& label_count) const; + virtual Bindings printAsm(Bindings bindings, int& label_count) const; - void printParameterAsm(VariableStackBindings& bindings, int& frame_offset) const; + void printParameterAsm(Bindings& bindings, int& frame_offset) const; void countParameters(int& parameter_count) const; }; diff --git a/c_compiler/include/node.hpp b/c_compiler/include/node.hpp index 0149807..1612aaf 100644 --- a/c_compiler/include/node.hpp +++ b/c_compiler/include/node.hpp @@ -6,7 +6,7 @@ #include class Type; -class VariableStackBindings; +class Bindings; // base node class @@ -17,7 +17,7 @@ public: virtual void print() const = 0; virtual void printXml() const = 0; - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int& label_count) const = 0; + virtual Bindings printAsm(Bindings bindings, int& label_count) const = 0; }; diff --git a/c_compiler/include/statement.hpp b/c_compiler/include/statement.hpp index ce469ac..94c1a36 100644 --- a/c_compiler/include/statement.hpp +++ b/c_compiler/include/statement.hpp @@ -23,7 +23,7 @@ public: virtual void print() const = 0; virtual void printXml() const = 0; - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const = 0; + virtual Bindings printAsm(Bindings bindings, int &label_count) const = 0; virtual void countVariables(int &var_count) const = 0; virtual void countArguments(int &argument_count) const = 0; @@ -48,7 +48,7 @@ public: virtual void print() const; virtual void printXml() const; - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; virtual void countVariables(int &var_count) const; virtual void countArguments(int &argument_count) const; @@ -67,7 +67,7 @@ public: virtual void print() const; virtual void printXml() const; - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; virtual void countVariables(int &var_count) const; virtual void countArguments(int &argument_count) const; @@ -89,7 +89,7 @@ public: virtual void print() const; virtual void printXml() const; - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; virtual void countVariables(int &var_count) const; virtual void countArguments(int &argument_count) const; @@ -109,7 +109,7 @@ public: virtual void print() const; virtual void printXml() const; - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; virtual void countVariables(int &var_count) const; virtual void countArguments(int &argument_count) const; @@ -125,7 +125,7 @@ public: SwitchStatement(Expression *condition, Statement *statement); virtual void print() const; virtual void printXml() const; - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; virtual void countVariables(int &var_count) const; virtual void countArguments(int &argument_count) const; @@ -141,7 +141,7 @@ public: virtual void print() const; virtual void printXml() const; - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; virtual void countVariables(int &var_count) const; virtual void countArguments(int &argument_count) const; @@ -151,7 +151,7 @@ public: class JumpStatement : public Statement { public: - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const = 0; + virtual Bindings printAsm(Bindings bindings, int &label_count) const = 0; virtual void print() const; virtual void printXml() const; @@ -168,7 +168,7 @@ private: public: ReturnStatement(Expression *expression = nullptr); - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; virtual void countVariables(int &var_count) const; virtual void countArguments(int &argument_count) const; @@ -180,7 +180,7 @@ class BreakStatement : public JumpStatement public: BreakStatement(); - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &) const; + virtual Bindings printAsm(Bindings bindings, int &) const; }; class ContinueStatement : public JumpStatement @@ -188,7 +188,7 @@ class ContinueStatement : public JumpStatement public: ContinueStatement(); - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &) const; + virtual Bindings printAsm(Bindings bindings, int &) const; }; class GotoStatement : public JumpStatement @@ -198,7 +198,7 @@ private: public: GotoStatement(const std::string &label); - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &) const; + virtual Bindings printAsm(Bindings bindings, int &) const; }; class IterationStatement : public Statement @@ -211,7 +211,7 @@ public: virtual void print() const; virtual void printXml() const; - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const = 0; + virtual Bindings printAsm(Bindings bindings, int &label_count) const = 0; virtual void countVariables(int &var_count) const; virtual void countArguments(int &argument_count) const; @@ -225,7 +225,7 @@ private: public: WhileLoop(Expression *condition, Statement *statement, const bool &is_while = true); - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; }; class ForLoop : public IterationStatement @@ -236,7 +236,7 @@ private: public: ForLoop(Expression *initializer, Expression *condition, Expression *incrementer, Statement *statement); - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; }; diff --git a/c_compiler/include/translation_unit.hpp b/c_compiler/include/translation_unit.hpp index 2003073..04a9d16 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, int& label_count) const; + virtual Bindings printAsm(Bindings bindings, int& label_count) const; void push(Node* external_declaration); }; diff --git a/c_compiler/include/type.hpp b/c_compiler/include/type.hpp index 04bd7a8..7da2100 100644 --- a/c_compiler/include/type.hpp +++ b/c_compiler/include/type.hpp @@ -15,13 +15,13 @@ class Type : public Node public: virtual void print() const = 0; virtual void printXml() const = 0; - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const = 0; + virtual Bindings printAsm(Bindings bindings, int &label_count) const = 0; virtual TypePtr type() = 0; virtual TypePtr type(Type *type_ptr) = 0; virtual TypePtr type(TypePtr type_ptr) = 0; - virtual void increaseStackPosition(VariableStackBindings &bindings) const = 0; + virtual void increaseStackPosition(Bindings &bindings) const = 0; virtual void load() const = 0; virtual void load(const int ®, const int &position) const = 0; virtual void store() const = 0; @@ -46,13 +46,13 @@ public: virtual void print() const; virtual void printXml() const; - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; virtual TypePtr type(); virtual TypePtr type(Type *type_ptr); virtual TypePtr type(TypePtr type_ptr); - virtual void increaseStackPosition(VariableStackBindings &bindings) const; + virtual void increaseStackPosition(Bindings &bindings) const; virtual void load() const; virtual void load(const int ®, const int &position) const; virtual void store() const; @@ -70,13 +70,13 @@ public: virtual void print() const; virtual void printXml() const; - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; virtual TypePtr type(); virtual TypePtr type(Type *type_ptr); virtual TypePtr type(TypePtr type_ptr); - virtual void increaseStackPosition(VariableStackBindings &bindings) const; + virtual void increaseStackPosition(Bindings &bindings) const; virtual void load() const; virtual void load(const int ®, const int &position) const; virtual void store() const; @@ -106,13 +106,13 @@ public: virtual void print() const; virtual void printXml() const; - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; virtual TypePtr type(); virtual TypePtr type(Type *type_ptr); virtual TypePtr type(TypePtr type_ptr); - virtual void increaseStackPosition(VariableStackBindings &bindings) const; + virtual void increaseStackPosition(Bindings &bindings) const; virtual void load() const; virtual void load(const int ®, const int &position) const; virtual void store() const; @@ -132,9 +132,9 @@ class Specifier : public Type public: virtual void print() const = 0; virtual void printXml() const = 0; - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const = 0; + virtual Bindings printAsm(Bindings bindings, int &label_count) const = 0; - virtual void increaseStackPosition(VariableStackBindings &bindings) const = 0; + virtual void increaseStackPosition(Bindings &bindings) const = 0; virtual void load() const = 0; virtual void load(const int ®, const int &position) const = 0; virtual void store() const = 0; @@ -154,8 +154,8 @@ public: virtual void print() const; virtual void printXml() const; - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; - virtual void increaseStackPosition(VariableStackBindings &bindings) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; + virtual void increaseStackPosition(Bindings &bindings) const; virtual void load() const; virtual void load(const int ®, const int &position) const; virtual void store() const; @@ -171,8 +171,8 @@ public: virtual void print() const; virtual void printXml() const; - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; - virtual void increaseStackPosition(VariableStackBindings &bindings) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; + virtual void increaseStackPosition(Bindings &bindings) const; virtual void load() const; virtual void load(const int ®, const int &position) const; virtual void store() const; @@ -188,8 +188,8 @@ public: virtual void print() const; virtual void printXml() const; - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; - virtual void increaseStackPosition(VariableStackBindings &bindings) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; + virtual void increaseStackPosition(Bindings &bindings) const; virtual void load() const; virtual void load(const int ®, const int &position) const; virtual void store() const; @@ -205,8 +205,8 @@ public: virtual void print() const; virtual void printXml() const; - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; - virtual void increaseStackPosition(VariableStackBindings &bindings) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; + virtual void increaseStackPosition(Bindings &bindings) const; virtual void load() const; virtual void load(const int ®, const int &position) const; virtual void store() const; @@ -222,8 +222,8 @@ public: virtual void print() const; virtual void printXml() const; - virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const; - virtual void increaseStackPosition(VariableStackBindings &bindings) const; + virtual Bindings printAsm(Bindings bindings, int &label_count) const; + virtual void increaseStackPosition(Bindings &bindings) const; virtual void load() const; virtual void load(const int ®, const int &position) const; virtual void store() const; 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 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(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::const_iterator, std::vector::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 T_INT_CONST %type 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 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("", 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(); @@ -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 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(); } @@ -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(); } @@ -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 rhs_tmp; + rhs_tmp = std::dynamic_pointer_cast(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 lhs_tmp; lhs_tmp = std::dynamic_pointer_cast(lhs_); + if(lhs_tmp != nullptr) { std::shared_ptr 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(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 tmp_pointer_ptr; + tmp_pointer_ptr->type(std::make_shared()); + 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(); } 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("\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 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("\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 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("\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); } diff --git a/run_test_deliverable.sh b/run_test_deliverable.sh index 2fb3f89..bbb36b9 100755 --- a/run_test_deliverable.sh +++ b/run_test_deliverable.sh @@ -35,11 +35,11 @@ for DRIVER in test_deliverable/testcases/*_driver.c ; do fi # Compile test function with compiler under test to assembly - cat $TESTCODE | $COMPILER > working/$NAME.s 2> working/${NAME}.compile.stderr - if [[ $? -ne 0 ]]; then - printf "\e[1;31mError\e[0m : Compiler returned error message.\n" - continue - fi + # cat $TESTCODE | $COMPILER > working/$NAME.s 2> working/${NAME}.compile.stderr + # if [[ $? -ne 0 ]]; then + # printf "\e[1;31mError\e[0m : Compiler returned error message.\n" + # continue + # fi # Link driver object and assembly into executable mips-linux-gnu-gcc -static working/${NAME}.s working/${NAME}_driver.o -o working/${NAME}.elf 2> working/${NAME}.link.stderr @@ -49,10 +49,10 @@ for DRIVER in test_deliverable/testcases/*_driver.c ; do fi # Run the actual executable - qemu-mips working/${NAME}.elf + qemu-mips working/${NAME}.elf > working/$NAME.elf.stdout RESULT=$? if [[ "$RESULT" -ne 0 ]]; then - >&2 printf "\e[1;31mError\e[0m : Testcase returned $RESULT, but expected 0.\n" + printf "\e[1;31mError\e[0m : Testcase returned $RESULT, but expected 0.\n" continue fi diff --git a/test_deliverable/testcases/test_MAINPRINT0.c b/test_deliverable/testcases/test_MAINPRINT0.c new file mode 100644 index 0000000..bc00fba --- /dev/null +++ b/test_deliverable/testcases/test_MAINPRINT0.c @@ -0,0 +1,7 @@ +int printf(const char *format, ...); + +int main(int argc, char *argv[]) +{ + printf("program name : %s\nInput variables : %d\n", argv[0], argc); + return 0; +} diff --git a/test_deliverable/testcases/test_MAINPRINT0_driver.c b/test_deliverable/testcases/test_MAINPRINT0_driver.c new file mode 100644 index 0000000..53c5fdf --- /dev/null +++ b/test_deliverable/testcases/test_MAINPRINT0_driver.c @@ -0,0 +1 @@ +#include diff --git a/test_deliverable/testcases/test_MAINPRINTF.c b/test_deliverable/testcases/test_MAINPRINTF.c new file mode 100644 index 0000000..62ddab6 --- /dev/null +++ b/test_deliverable/testcases/test_MAINPRINTF.c @@ -0,0 +1,8 @@ +int printf(const char *format, ...); + +int main() +{ + char input[50] = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', }; + printf(input); + return 0; +} diff --git a/test_deliverable/testcases/test_MAINPRINTF_driver.c b/test_deliverable/testcases/test_MAINPRINTF_driver.c new file mode 100644 index 0000000..53c5fdf --- /dev/null +++ b/test_deliverable/testcases/test_MAINPRINTF_driver.c @@ -0,0 +1 @@ +#include diff --git a/test_deliverable/testcases/test_SHORTADD.c b/test_deliverable/testcases/test_SHORTADD.c new file mode 100644 index 0000000..393aa78 --- /dev/null +++ b/test_deliverable/testcases/test_SHORTADD.c @@ -0,0 +1,5 @@ +short shortadd(short a, short b, short signed int c, short signed d, short e) +{ + short f = a+b-c+d-e; + return f; +} diff --git a/test_deliverable/testcases/test_SHORTADD_driver.c b/test_deliverable/testcases/test_SHORTADD_driver.c new file mode 100644 index 0000000..95db6ef --- /dev/null +++ b/test_deliverable/testcases/test_SHORTADD_driver.c @@ -0,0 +1,6 @@ +short shortadd(short, short, short, short, short); + +int main() +{ + return !( 3009 == shortadd(934, 2392, 293, 50, 74) ); +} diff --git a/test_deliverable/testcases/test_STRINGLIT.c b/test_deliverable/testcases/test_STRINGLIT.c new file mode 100644 index 0000000..36bcfd5 --- /dev/null +++ b/test_deliverable/testcases/test_STRINGLIT.c @@ -0,0 +1,5 @@ +char *stringlit(char * input) +{ + input = "Hello World!"; + return input; +} diff --git a/test_deliverable/testcases/test_STRINGLIT_driver.c b/test_deliverable/testcases/test_STRINGLIT_driver.c new file mode 100644 index 0000000..29af1ea --- /dev/null +++ b/test_deliverable/testcases/test_STRINGLIT_driver.c @@ -0,0 +1,9 @@ +#include + +char *stringlit(char *); + +int main() +{ + char a[50]; + return strcmp(stringlit(a), "Hello World!"); +} -- cgit