diff options
Diffstat (limited to 'c_compiler/include')
-rw-r--r-- | c_compiler/include/bindings.hpp | 13 | ||||
-rw-r--r-- | c_compiler/include/declaration.hpp | 5 | ||||
-rw-r--r-- | c_compiler/include/statement.hpp | 56 |
3 files changed, 61 insertions, 13 deletions
diff --git a/c_compiler/include/bindings.hpp b/c_compiler/include/bindings.hpp index 0afb3e9..2559420 100644 --- a/c_compiler/include/bindings.hpp +++ b/c_compiler/include/bindings.hpp @@ -23,6 +23,8 @@ class VariableStackBindings { private: std::map<std::string, DeclarationData> bindings_; + std::string break_label_; + std::string continue_label_; int stack_counter_; int expression_stack_; @@ -33,13 +35,18 @@ public: void increaseStackPosition(); void setStackPosition(int stack_counter); void nextExpressionStackPosition(); - void setExpressionStackPosition(const int& stack_counter); + void setExpressionStackPosition(const int &stack_counter); + + std::string breakLabel(); + std::string breakLabel(const std::string &label); + std::string continueLabel(); + std::string continueLabel(const std::string &label); int currentStackPosition() const; - int stackPosition(const std::string& id) const; + int stackPosition(const std::string &id) const; int currentExpressionStackPosition() const; - bool bindingExists(const std::string& id) const; + bool bindingExists(const std::string &id) const; }; diff --git a/c_compiler/include/declaration.hpp b/c_compiler/include/declaration.hpp index 76f0efc..f99c4a3 100644 --- a/c_compiler/include/declaration.hpp +++ b/c_compiler/include/declaration.hpp @@ -19,7 +19,7 @@ private: ExpressionPtr initializer_; DeclarationPtr next_declaration_; DeclarationPtr next_list_declaration_; - bool extern_declaration; + bool extern_declaration_; public: Declaration(const std::string& id = "", Expression* initializer = nullptr); @@ -34,7 +34,8 @@ public: void linkListDeclaration(Declaration* next_list_declaration); void setType(Type* type); - void setInitializer(Expression* initializer); + void setInitializer(Expression* initializer); + void setExternDeclaration(bool is_extern); DeclarationPtr getNext() const; DeclarationPtr getNextListItem() const; diff --git a/c_compiler/include/statement.hpp b/c_compiler/include/statement.hpp index 887ffc5..ba12911 100644 --- a/c_compiler/include/statement.hpp +++ b/c_compiler/include/statement.hpp @@ -53,14 +53,14 @@ public: }; -class SelectionStatement : public Statement +class IfElseStatement : public Statement { protected: ExpressionPtr condition_; StatementPtr if_; StatementPtr else_; public: - SelectionStatement(Expression* condition, Statement* _if, Statement* _else = nullptr); + IfElseStatement(Expression* condition, Statement* _if, Statement* _else = nullptr); virtual void print() const; virtual void printXml() const; @@ -91,20 +91,58 @@ public: class JumpStatement : public Statement { -protected: - ExpressionPtr expression_; public: - JumpStatement(Expression* expression = nullptr); - + virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned &label_count) const = 0; + virtual void print() const; virtual void printXml() const; - virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const; + + virtual void countVariables(unsigned &var_count) const; + virtual void countArguments(unsigned &argument_count) const; + virtual void countExpressionDepth(unsigned &depth_count) const; +}; + + +class ReturnStatement : public JumpStatement +{ +private: + ExpressionPtr expression_; +public: + ReturnStatement(Expression* expression = nullptr); + + virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned &label_count) const; virtual void countVariables(unsigned& var_count) const; virtual void countArguments(unsigned& argument_count) const; virtual void countExpressionDepth(unsigned& depth_count) const; }; +class BreakStatement : public JumpStatement +{ +public: + BreakStatement(); + + virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned &) const; +}; + +class ContinueStatement : public JumpStatement +{ +public: + ContinueStatement(); + + virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned &) const; +}; + +class GotoStatement : public JumpStatement +{ +private: + std::string label_; +public: + GotoStatement(const std::string &label); + + virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned &) const; +}; + class IterationStatement : public Statement { @@ -125,8 +163,10 @@ public: class WhileLoop : public IterationStatement { +private: + bool is_while_; public: - WhileLoop(Expression* condition, Statement* statement); + WhileLoop(Expression* condition, Statement* statement, const bool &is_while = true); virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const; }; |