aboutsummaryrefslogtreecommitdiffstats
path: root/c_compiler/include/statement.hpp
blob: 121db2cb149ba73a146ea676b16fb0344e70a410 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#ifndef STATEMENT_HPP
#define STATEMENT_HPP

#include "bindings.hpp"
#include "declaration.hpp"
#include "expression.hpp"
#include "node.hpp"

#include <memory>

class Statement;

typedef std::shared_ptr<Statement> StatementPtr;


class Statement : public Node
{
protected:
    StatementPtr next_statement_;
    
public:
    Statement(Statement* statement = nullptr);

    virtual void print() const = 0;
    virtual void printXml() 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;

    void linkStatement(Statement* next);
};


class CompoundStatement : public Statement
{
protected:
    DeclarationPtr declaration_;
    StatementPtr statement_;
    
public:
    CompoundStatement(Declaration* declaration = nullptr, Statement* statement = nullptr);
    CompoundStatement(Statement* statement);

    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;    
};


class SelectionStatement : public Statement
{
protected:
    ExpressionPtr condition_;
    StatementPtr if_;
    StatementPtr else_;
public:
    SelectionStatement(Expression* condition, Statement* _if, Statement* _else = nullptr);

    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;    
};


class ExpressionStatement : public Statement
{
protected:
    ExpressionPtr expression_;
public:
    ExpressionStatement(Expression* expression = nullptr);

    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;    
};


class JumpStatement : public Statement
{
protected:
    ExpressionPtr expression_;
public:
    JumpStatement(Expression* expression = nullptr);

    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;
};


class IterationStatement : public Statement
{
protected:
    ExpressionPtr condition_;
    StatementPtr statement_;
public:
    IterationStatement(Expression* condition, Statement* statement);

    virtual void print() const;
    virtual void printXml() const;
    virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const = 0;

    virtual void countVariables(unsigned& var_count) const;
    virtual void countArguments(unsigned& argument_count) const;    
};

class WhileLoop : public IterationStatement
{
public:
    WhileLoop(Expression* condition, Statement* statement);

    virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_cout) const;
};

class ForLoop : public IterationStatement
{
private:
    ExpressionPtr initializer_;
    ExpressionPtr incrementer_;
public:
    ForLoop(Expression* initializer, Expression* condition, Expression* incrementer, Statement* statement);

    virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const;
};


#endif