Skip to content

Commit fd1a658

Browse files
committed
IR implementation initialized
1 parent fbc56e3 commit fd1a658

File tree

79 files changed

+1805
-402
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

79 files changed

+1805
-402
lines changed

CMakeLists.txt

+74-9
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,12 @@ set(
6565
VISITORS
6666

6767
compiler/visitors/PrintTreeVisitor.cpp
68-
# compiler/visitors/FunctionProcessingVisitor.cpp
69-
# compiler/visitors/SymbolTreeVisitor.cpp
7068
compiler/visitors/TemplateVisitor.cpp
7169

7270
compiler/visitors/NewSymbolTreeVisitor.cpp
73-
compiler/visitors/NewFunctionProcessingVisitor.cpp
7471
compiler/visitors/TypeCheckingVisitor.cpp
72+
compiler/visitors/NewFunctionProcessingVisitor.cpp
73+
compiler/visitors/IRTreeBuildVisitor.cpp
7574
)
7675

7776
set(
@@ -91,29 +90,95 @@ set(
9190
)
9291

9392
set(
94-
DRIVERS
95-
96-
compiler/driver.cpp
93+
SCOPES
9794

9895
compiler/symbol_table/Symbol.cpp
99-
10096
compiler/symbol_table/NewScopeLayer.cpp
10197
compiler/symbol_table/NewScopeLayerTree.cpp
98+
)
99+
100+
set(
101+
FUNC_CALLS
102102

103103
compiler/function_processing/FrameEmulator.cpp
104-
compiler/function_processing/FunctionStorage.cpp
105104
compiler/function_processing/FunctionTable.cpp
106-
107105
compiler/function_processing/ClassStorage.cpp
108106
)
109107

108+
set(
109+
DRIVERS
110+
111+
compiler/driver.cpp
112+
)
113+
114+
set(
115+
IRT
116+
117+
compiler/function_processing/address/AddressInFrame.cpp
118+
compiler/function_processing/address/AddressInRegister.cpp
119+
120+
compiler/function_processing/FrameTranslator.cpp
121+
122+
compiler/IR/generators/Label.cpp
123+
compiler/IR/generators/Temporary.cpp
124+
125+
compiler/IR/types/BinaryOperatorType.cpp
126+
compiler/IR/types/LogicOperatorType.cpp
127+
)
128+
129+
set(
130+
IRWrappers
131+
132+
compiler/IR/wrappers/ExpressionWrapper.cpp
133+
compiler/IR/wrappers/StatementWrapper.cpp
134+
135+
compiler/IR/wrappers/conditional_wrapper/ConditionalWrapper.cpp
136+
compiler/IR/wrappers/conditional_wrapper/AndConditionalWrapper.cpp
137+
compiler/IR/wrappers/conditional_wrapper/OrConditionalWrapper.cpp
138+
compiler/IR/wrappers/conditional_wrapper/NegativeConditionalWrapper.cpp
139+
compiler/IR/wrappers/conditional_wrapper/RelativeConditionalWrapper.cpp
140+
)
141+
142+
set(
143+
IRNodes
144+
145+
compiler/IR/nodes/expressions/BinopExpression.cpp
146+
compiler/IR/nodes/expressions/ConstExpression.cpp
147+
compiler/IR/nodes/expressions/MemExpression.cpp
148+
compiler/IR/nodes/expressions/TempExpression.cpp
149+
compiler/IR/nodes/expressions/CallExpression.cpp
150+
compiler/IR/nodes/expressions/EseqExpression.cpp
151+
compiler/IR/nodes/expressions/NameExpression.cpp
152+
153+
compiler/IR/nodes/statements/ExpStatement.cpp
154+
compiler/IR/nodes/statements/JumpConditionalStatement.cpp
155+
compiler/IR/nodes/statements/JumpStatement.cpp
156+
compiler/IR/nodes/statements/LabelStatement.cpp
157+
compiler/IR/nodes/statements/SeqStatement.cpp
158+
compiler/IR/nodes/statements/MoveStatement.cpp
159+
160+
compiler/IR/nodes/ExpressionList.cpp
161+
)
162+
163+
set(
164+
IRVisitors
165+
166+
compiler/IR/visitors/TemplateVisitor.cpp
167+
)
168+
110169
add_executable(
111170
Compiler
112171
main.cpp
113172
${DRIVERS}
114173
${NODES}
115174
${VISITORS}
116175
${OBJECTS}
176+
${SCOPES}
177+
${FUNC_CALLS}
178+
${IRT}
179+
${IRNodes}
180+
${IRWrappers}
181+
${IRVisitors}
117182
${BISON_Parser_OUTPUTS}
118183
${FLEX_Scanner_OUTPUTS}
119184
)

compiler/IR/generators/Label.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#include "Label.h"
2+
3+
IRT::Label::Label() : label_("L" + std::to_string(counter_++)) {}
4+
5+
IRT::Label::Label(std::string label) : label_(std::move(label)) {}
6+
7+
std::string IRT::Label::ToString() const {
8+
return label_;
9+
}
10+
11+
int IRT::Label::counter_ = 0;

compiler/IR/generators/Label.h

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#pragma once
2+
3+
#include <string>
4+
5+
namespace IRT {
6+
class Label {
7+
public:
8+
Label();
9+
explicit Label(std::string label);
10+
11+
std::string ToString() const;
12+
13+
private:
14+
std::string label_;
15+
static int counter_;
16+
};
17+
}

compiler/IR/generators/Temporary.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#include "Temporary.h"
2+
3+
IRT::Temporary::Temporary() : name_("%" + std::to_string(counter_++)) {}
4+
5+
IRT::Temporary::Temporary(std::string name) : name_(name) {}
6+
7+
std::string IRT::Temporary::ToString() const {
8+
return name_;
9+
}
10+
11+
int IRT::Temporary::counter_ = 0;

compiler/IR/generators/Temporary.h

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#pragma once
2+
3+
#include <string>
4+
5+
namespace IRT {
6+
class Temporary {
7+
public:
8+
Temporary();
9+
explicit Temporary(std::string name);
10+
std::string ToString() const;
11+
12+
private:
13+
std::string name_;
14+
static int counter_;
15+
};
16+
}

compiler/IR/nodes/BaseElement.h

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#pragma once
2+
3+
#include "../visitors/Visitor.h"
4+
5+
namespace IRT {
6+
class BaseElement {
7+
public:
8+
virtual ~BaseElement() = default;
9+
virtual void Accept(IRT::Visitor* visitor) = 0;
10+
};
11+
}

compiler/IR/nodes/ExpressionList.cpp

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#include "ExpressionList.h"
2+
3+
namespace IRT {
4+
void ExpressionList::Accept(Visitor* visitor) { visitor->Visit(this); }
5+
6+
void ExpressionList::Add(Expression* expression) {
7+
expressions_.emplace_back(expression);
8+
}
9+
} // namespace IRT

compiler/IR/nodes/ExpressionList.h

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#pragma once
2+
3+
#include <vector>
4+
5+
#include "BaseElement.h"
6+
7+
namespace IRT {
8+
class Expression;
9+
10+
class ExpressionList : public BaseElement {
11+
public:
12+
ExpressionList() = default;
13+
14+
void Add(Expression* expression);
15+
void Accept(Visitor* visitor) override;
16+
17+
std::vector<Expression*> expressions_;
18+
};
19+
} // namespace IRT
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#include "BinopExpression.h"
2+
3+
void IRT::BinopExpression::Accept(IRT::Visitor *visitor) {
4+
visitor->Visit(this);
5+
}
6+
7+
IRT::BinopExpression::BinopExpression(BinaryOperatorType type, Expression *lhs,
8+
Expression *rhs)
9+
: type_(type), lhs_(lhs), rhs_(rhs) {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#pragma once
2+
3+
#include "../../types/BinaryOperatorType.h"
4+
#include "Expression.h"
5+
6+
namespace IRT {
7+
class BinopExpression : public Expression {
8+
public:
9+
BinopExpression(BinaryOperatorType type, Expression* lhs, Expression* rhs);
10+
11+
void Accept(IRT::Visitor* visitor) override;
12+
13+
BinaryOperatorType type_;
14+
Expression* lhs_;
15+
Expression* rhs_;
16+
};
17+
} // namespace IRT
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#include "CallExpression.h"
2+
3+
void IRT::CallExpression::Accept(IRT::Visitor *visitor) {
4+
visitor->Visit(this);
5+
}
6+
7+
IRT::CallExpression::CallExpression(Expression *expression,
8+
ExpressionList *args)
9+
: function_name_(expression), args_(args) {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#pragma once
2+
3+
#include "Expression.h"
4+
5+
namespace IRT {
6+
class CallExpression : public Expression {
7+
public:
8+
CallExpression(Expression* expression, ExpressionList* args);
9+
10+
void Accept(Visitor* visitor) override;
11+
12+
Expression* function_name_;
13+
ExpressionList* args_;
14+
};
15+
} // namespace IRT
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#include "ConstExpression.h"
2+
3+
void IRT::ConstExpression::Accept(Visitor *visitor) {
4+
visitor->Visit(this);
5+
}
6+
7+
IRT::ConstExpression::ConstExpression(int value) : value_(value) {}
8+
9+
int IRT::ConstExpression::Value() const {
10+
return value_;
11+
}
12+
13+
bool IRT::ConstExpression::IsCONST() {
14+
return true;
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#pragma once
2+
3+
#include "Expression.h"
4+
5+
namespace IRT {
6+
class ConstExpression : public Expression {
7+
public:
8+
explicit ConstExpression(int value);
9+
~ConstExpression() override = default;
10+
11+
bool IsCONST() override;
12+
int Value() const;
13+
14+
void Accept(Visitor* visitor) override;
15+
16+
private:
17+
int value_;
18+
};
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#include "EseqExpression.h"
2+
3+
IRT::EseqExpression::EseqExpression(Statement *statement,
4+
Expression *expression)
5+
: statement_(statement), expression_(expression) {}
6+
7+
bool IRT::EseqExpression::IsESEQ() { return true; }
8+
9+
void IRT::EseqExpression::Accept(Visitor *visitor) { visitor->Visit(this); }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#pragma once
2+
3+
#include "../statements/Statement.h"
4+
#include "Expression.h"
5+
6+
namespace IRT {
7+
class EseqExpression : public Expression {
8+
public:
9+
bool IsESEQ() override;
10+
EseqExpression(Statement* statement, Expression* expression);
11+
12+
void Accept(Visitor* visitor) override;
13+
14+
Statement* statement_;
15+
Expression* expression_;
16+
};
17+
} // namespace IRT
+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#pragma once
2+
3+
#include "../BaseElement.h"
4+
5+
namespace IRT {
6+
class Expression : public BaseElement {
7+
public:
8+
virtual bool IsESEQ() {
9+
return false;
10+
}
11+
12+
virtual bool IsCONST() {
13+
return false;
14+
}
15+
16+
virtual bool IsNAME() {
17+
return false;
18+
}
19+
20+
~Expression() override = default;
21+
};
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#include "MemExpression.h"
2+
3+
using namespace IRT;
4+
void MemExpression::Accept(Visitor* visitor) { visitor->Visit(this); }
5+
6+
MemExpression::MemExpression(Expression* expression)
7+
: expression_(expression) {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#pragma once
2+
3+
#include "Expression.h"
4+
5+
namespace IRT {
6+
class MemExpression : public Expression {
7+
public:
8+
explicit MemExpression(Expression* expression);
9+
10+
void Accept(Visitor* visitor) override;
11+
12+
Expression* expression_;
13+
};
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#include "NameExpression.h"
2+
3+
namespace IRT {
4+
NameExpression::NameExpression(Label label) : label_(label) {}
5+
6+
bool NameExpression::IsNAME() { return true; }
7+
8+
void NameExpression::Accept(Visitor* visitor) { visitor->Visit(this); }
9+
} // namespace IRT

0 commit comments

Comments
 (0)