Skip to content

Commit dc60c58

Browse files
committed
IR canonization implemented, log system added, IR tests added
1 parent fd1a658 commit dc60c58

31 files changed

+1198
-98
lines changed

.gitignore

+6
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ cmake-build-debug/
55

66
other/
77

8+
compiler/tests/logs/*
9+
!compiler/tests/logs/created_files.txt
10+
11+
compiler/tests_IR/logs/*
12+
!compiler/tests_IR/logs/created_files.txt
13+
814
compiler/stack.hh
915

1016
compiler/scanner.cpp

CMakeLists.txt

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
cmake_minimum_required(VERSION 3.10.2)
22

3-
set(CMAKE_CXX_STANDARD_REQUIRED 17)
3+
set(CMAKE_CXX_STANDARD_REQUIRED 20)
44

55
set(BISON_EXECUTABLE /usr/local/bin/bison)
66

@@ -164,11 +164,17 @@ set(
164164
IRVisitors
165165

166166
compiler/IR/visitors/TemplateVisitor.cpp
167+
compiler/IR/visitors/PrintVisitor.cpp
168+
169+
compiler/IR/visitors/Linearizer.cpp
170+
compiler/IR/visitors/ESEQEliminator.cpp
171+
compiler/IR/visitors/DoubleCallEliminateVisitor.cpp
167172
)
168173

169174
add_executable(
170175
Compiler
171176
main.cpp
177+
LogCleaner.cpp
172178
${DRIVERS}
173179
${NODES}
174180
${VISITORS}

LogCleaner.cpp

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
#include <fstream>
2+
3+
#include "LogCleaner.h"
4+
5+
LogCleaner& LogCleaner::GetInstance() {
6+
static LogCleaner instance;
7+
return instance;
8+
}
9+
10+
LogCleaner::LogCleaner()
11+
: created_files_log_("created_files.txt"), run_is_valid_(false) {}
12+
13+
LogCleaner::~LogCleaner() {
14+
if (!run_is_valid_) {
15+
for (const auto& file_path : logs_) {
16+
std::remove(file_path.c_str());
17+
}
18+
} else {
19+
WriteLogFile();
20+
}
21+
}
22+
23+
void LogCleaner::WriteLogFile() {
24+
std::ofstream log;
25+
log.open(log_dir_path_ + created_files_log_);
26+
27+
for (const auto& filename : logs_) {
28+
log << filename << std::endl;
29+
}
30+
31+
log.close();
32+
}
33+
34+
void LogCleaner::AddLogFilePath(const std::string& file_path) {
35+
logs_.emplace_back(file_path);
36+
}
37+
38+
void LogCleaner::ValidateUsage() { run_is_valid_ = true; }
39+
40+
void LogCleaner::ClearLastLogs(const std::string& log_dir_path) {
41+
log_dir_path_ = log_dir_path;
42+
43+
std::ifstream last_log;
44+
last_log.open(log_dir_path_ + created_files_log_);
45+
46+
std::string file_path;
47+
while (getline(last_log, file_path)) {
48+
std::remove(file_path.c_str());
49+
}
50+
51+
last_log.close();
52+
}

LogCleaner.h

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#pragma once
2+
3+
#include <vector>
4+
#include <string>
5+
6+
class LogCleaner {
7+
public:
8+
void AddLogFilePath(const std::string& file_path);
9+
void ClearLastLogs(const std::string& log_dir_path);
10+
void ValidateUsage();
11+
12+
static LogCleaner& GetInstance();
13+
14+
LogCleaner(const LogCleaner&) = delete;
15+
LogCleaner(LogCleaner&&) = delete;
16+
LogCleaner& operator=(const LogCleaner&) = delete;
17+
LogCleaner&& operator=(LogCleaner&&) = delete;
18+
19+
private:
20+
LogCleaner();
21+
~LogCleaner();
22+
23+
void WriteLogFile();
24+
25+
private:
26+
std::vector<std::string> logs_;
27+
std::string log_dir_path_;
28+
std::string created_files_log_;
29+
bool run_is_valid_;
30+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
#include "DoubleCallEliminateVisitor.h"
2+
#include "IRTNodes.h"
3+
4+
using namespace IRT;
5+
6+
void DoubleCallEliminateVisitor::Visit(ExpStatement *stmt) {
7+
IRTStorage elements = Accept(stmt->expression_);
8+
tos_value_.statement_ = new ExpStatement(elements.expression_);
9+
}
10+
11+
void DoubleCallEliminateVisitor::Visit(ConstExpression *const_expression) {
12+
tos_value_.expression_ = new ConstExpression(const_expression->Value());
13+
}
14+
15+
void DoubleCallEliminateVisitor::Visit(JumpConditionalStatement *jump_conditional_statement) {
16+
auto lhs = Accept(jump_conditional_statement->left_operand_).expression_;
17+
auto rhs = Accept(jump_conditional_statement->right_operand_).expression_;
18+
19+
tos_value_.statement_ = new JumpConditionalStatement(
20+
jump_conditional_statement->operator_type_,
21+
lhs,
22+
rhs,
23+
jump_conditional_statement->label_true_,
24+
jump_conditional_statement->label_false_
25+
);
26+
}
27+
void DoubleCallEliminateVisitor::Visit(MoveStatement *move_statement) {
28+
auto source = Accept(move_statement->source_).expression_;
29+
auto target = Accept(move_statement->target_).expression_;
30+
31+
tos_value_.statement_ = new MoveStatement(source, target);
32+
}
33+
34+
void DoubleCallEliminateVisitor::Visit(SeqStatement *seq_statement) {
35+
auto first = Accept(seq_statement->first_statement_).statement_;
36+
auto second = Accept(seq_statement->second_statement_).statement_;
37+
38+
tos_value_.statement_ = new SeqStatement(
39+
first,
40+
second
41+
);
42+
}
43+
44+
void DoubleCallEliminateVisitor::Visit(LabelStatement *label_statement) {
45+
tos_value_.statement_ = new LabelStatement(label_statement->label_);
46+
}
47+
48+
void DoubleCallEliminateVisitor::Visit(BinopExpression *binop_statement) {
49+
tos_value_.expression_ = new BinopExpression(
50+
binop_statement->type_,
51+
Accept(binop_statement->lhs_).expression_,
52+
Accept(binop_statement->rhs_).expression_
53+
);
54+
}
55+
void DoubleCallEliminateVisitor::Visit(TempExpression *temp_exression) {
56+
tos_value_.expression_ = new TempExpression(temp_exression->temporary_);
57+
}
58+
59+
void DoubleCallEliminateVisitor::Visit(MemExpression *mem_expression) {
60+
tos_value_.expression_ = new MemExpression(
61+
Accept(mem_expression->expression_).expression_
62+
);
63+
}
64+
65+
void DoubleCallEliminateVisitor::Visit(JumpStatement *jump_statement) {
66+
tos_value_.statement_ = new JumpStatement(
67+
jump_statement->label_
68+
);
69+
}
70+
void DoubleCallEliminateVisitor::Visit(CallExpression *call_expression) {
71+
auto func = Accept(call_expression->function_name_).expression_;
72+
auto args = Accept(call_expression->args_).expression_list_;
73+
74+
Temporary temp;
75+
76+
tos_value_.expression_ = new EseqExpression(
77+
new MoveStatement(
78+
new TempExpression(temp),
79+
new CallExpression(
80+
func,
81+
args
82+
)
83+
),
84+
new TempExpression(temp)
85+
);
86+
}
87+
void DoubleCallEliminateVisitor::Visit(ExpressionList *expression_list) {
88+
auto expression_list_ = new ExpressionList();
89+
90+
for (auto expression: expression_list->expressions_) {
91+
expression_list_->Add(Accept(expression).expression_);
92+
}
93+
tos_value_.expression_list_ = expression_list_;
94+
95+
}
96+
97+
void DoubleCallEliminateVisitor::Visit(NameExpression *name_expression) {
98+
tos_value_.expression_ = new NameExpression(name_expression->label_);
99+
}
100+
101+
void DoubleCallEliminateVisitor::Visit(EseqExpression *eseq_expression) {
102+
auto stmt = Accept(eseq_expression->statement_).statement_;
103+
auto expr = Accept(eseq_expression->expression_).expression_;
104+
105+
tos_value_.expression_ = new EseqExpression(stmt, expr);
106+
}
107+
108+
Statement *DoubleCallEliminateVisitor::GetTree() {
109+
return tos_value_.statement_;
110+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#pragma once
2+
3+
#include "IRTStorage.h"
4+
#include "TemplateVisitor.h"
5+
6+
namespace IRT {
7+
8+
class DoubleCallEliminateVisitor : public TemplateVisitor<IRTStorage> {
9+
public:
10+
void Visit(ExpStatement *stmt) override;
11+
void Visit(ConstExpression *const_expression) override;
12+
void Visit(JumpConditionalStatement *jump_conditional_statement) override;
13+
void Visit(MoveStatement *move_statement) override;
14+
void Visit(SeqStatement *seq_statement) override;
15+
void Visit(LabelStatement *label_statement) override;
16+
void Visit(BinopExpression *binop_statement) override;
17+
void Visit(TempExpression *temp_exression) override;
18+
void Visit(MemExpression *mem_expression) override;
19+
void Visit(JumpStatement *jump_statement) override;
20+
void Visit(CallExpression *call_expression) override;
21+
void Visit(ExpressionList *expression_list) override;
22+
void Visit(NameExpression *name_expression) override;
23+
void Visit(EseqExpression *eseq_expression) override;
24+
25+
Statement *GetTree();
26+
};
27+
28+
} // namespace IRT

0 commit comments

Comments
 (0)