aboutsummaryrefslogtreecommitdiffstats
path: root/c_compiler/include
diff options
context:
space:
mode:
Diffstat (limited to 'c_compiler/include')
-rw-r--r--c_compiler/include/bindings.hpp13
-rw-r--r--c_compiler/include/declaration.hpp5
-rw-r--r--c_compiler/include/statement.hpp56
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;
};